Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Simon Marchi <simark@simark.ca>
To: Tom Tromey <tom@tromey.com>, gdb-patches@sourceware.org
Subject: Re: [PATCH 01/14] Fix latent bug in dwarf2_find_containing_comp_unit
Date: Wed, 19 Feb 2020 03:42:00 -0000	[thread overview]
Message-ID: <01167589-fae4-39a0-1ebe-0c7d4cbf52b5@simark.ca> (raw)
In-Reply-To: <20200215165444.32653-2-tom@tromey.com>

On 2020-02-15 11:54 a.m., Tom Tromey wrote:
> dwarf2_find_containing_comp_unit has this in its binary search:
> 
>       if (mid_cu->is_dwz > offset_in_dwz
> 	  || (mid_cu->is_dwz == offset_in_dwz
> 	      && mid_cu->sect_off + mid_cu->length >= sect_off))
> 	high = mid;
> 
> The intent here is to determine whether SECT_OFF appears in or before
> MID_CU.
> 
> I believe this has an off-by-one error, and that the check should use
> ">" rather than ">=".  If the two side are equal, then SECT_OFF
> actually appears at the start of the next CU.
> 
> I've had this patch kicking around for ages but I forget how I found
> the problem.
> 
> gdb/ChangeLog
> 2020-02-15  Tom Tromey  <tom@tromey.com>
> 
> 	* dwarf2/read.c (dwarf2_find_containing_comp_unit): Use ">", not
> 	">=", in binary search.
> ---
>  gdb/ChangeLog     | 5 +++++
>  gdb/dwarf2/read.c | 2 +-
>  2 files changed, 6 insertions(+), 1 deletion(-)
> 
> diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c
> index e74383e01dc..e373cc0af2c 100644
> --- a/gdb/dwarf2/read.c
> +++ b/gdb/dwarf2/read.c
> @@ -24171,7 +24171,7 @@ dwarf2_find_containing_comp_unit (sect_offset sect_off,
>        mid_cu = dwarf2_per_objfile->all_comp_units[mid];
>        if (mid_cu->is_dwz > offset_in_dwz
>  	  || (mid_cu->is_dwz == offset_in_dwz
> -	      && mid_cu->sect_off + mid_cu->length >= sect_off))
> +	      && mid_cu->sect_off + mid_cu->length > sect_off))
>  	high = mid;
>        else
>  	low = mid + 1;

I can only convince myself of these things by plugging in real numbers.  So let's say
mid_cu's range is [100,150[, so 150 bytes long, and we are looking for sect_off == 150.
150 is outside (just after) mid_cu's range, so the right answer will be the cu just
after this one.

Without your change, we would have gone in the "if", and therefore excluded the right
answer.  With your change, we would have gone in the "else", and therefore chosen the
range with the right answer.  So that looks correct to me.

I'm going to ask if you thought about a way to test this.  I don't think writing a typical
test case for this is feasible.  By refactoring the code a bit, we could maybe factor out the
meat of this function into one that operates on an std::vector<dwarf2_per_cu_data> instead
of on a dwarf2_per_objfile.  It should then be feasible to create an std::vector with
dwarf2_per_cu_data elements out of thin air to unit-test the function, including edge
cases like this.

Also, do you understand what's the logic with this dwz stuff?  Is it that all the CUs
coming from a dwz file are at the end of the list, or something like that?

Simon


  reply	other threads:[~2020-02-19  3:42 UTC|newest]

Thread overview: 59+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-02-15 16:54 [PATCH 00/14] Share DWARF partial symtabs between objfiles Tom Tromey
2020-02-15 16:55 ` [PATCH 12/14] Fix a memory leak and remove an unused member Tom Tromey
2020-02-15 16:55 ` [PATCH 02/14] Simplify setting of reading_partial_symbols Tom Tromey
2020-02-15 16:55 ` [PATCH 11/14] Split type_unit_group Tom Tromey
2020-02-18 12:08   ` Luis Machado
2020-02-22  0:40     ` Tom Tromey
2020-02-15 16:55 ` [PATCH 03/14] Introduce dwarf2_per_objfile::obstack Tom Tromey
2020-02-19  4:13   ` Simon Marchi
2020-02-22  0:44     ` Tom Tromey
2020-02-15 16:55 ` [PATCH 05/14] Introduce dwarf2_unshareable and move die_type_hash Tom Tromey
2020-02-18 11:23   ` Luis Machado
2020-02-19  4:20   ` Simon Marchi
2020-02-21 22:43     ` Tom Tromey
2020-02-15 16:55 ` [PATCH 14/14] Share DWARF partial symtabs Tom Tromey
2020-02-18 12:26   ` Luis Machado
2020-02-21 23:03     ` Tom Tromey
2020-02-15 16:55 ` [PATCH 10/14] Introduce dwarf2_enter_objfile and use it Tom Tromey
2020-02-18 11:58   ` Luis Machado
2020-02-21 22:54     ` Tom Tromey
2020-02-15 16:55 ` [PATCH 06/14] Add "objfile" parameter to two partial_symtab methods Tom Tromey
2020-02-18 11:26   ` Luis Machado
2020-02-15 16:55 ` [PATCH 07/14] Add dwarf2_per_cu_data::index Tom Tromey
2020-02-18 11:39   ` Luis Machado
2020-02-21 23:36     ` Tom Tromey
2020-02-19  4:36   ` Simon Marchi
2020-02-19  5:31     ` Simon Marchi
2020-02-21 23:41       ` Tom Tromey
2020-02-21 23:41     ` Tom Tromey
2020-02-15 16:55 ` [PATCH 08/14] Remove symtab links from dwarf2_psymtab and dwarf2_per_cu_quick_data Tom Tromey
2020-02-18 11:50   ` Luis Machado
2020-02-19  4:47     ` Simon Marchi
2020-02-22  0:38       ` Tom Tromey
2020-02-22  0:36     ` Tom Tromey
2020-02-15 16:55 ` [PATCH 04/14] Convert IS_TYPE_UNIT_GROUP to method Tom Tromey
2020-02-15 16:55 ` [PATCH 13/14] Move signatured_type::type to unshareable object Tom Tromey
2020-02-15 16:55 ` [PATCH 01/14] Fix latent bug in dwarf2_find_containing_comp_unit Tom Tromey
2020-02-19  3:42   ` Simon Marchi [this message]
2020-02-19 14:08     ` Tom Tromey
2020-02-20  0:11       ` Tom Tromey
2020-02-20  0:12       ` Tom Tromey
     [not found]         ` <3a3f1f39-c715-58ba-06a8-2980afb82c53@simark.ca>
2020-02-20 16:50           ` Tom Tromey
2020-03-07 19:12             ` Christian Biesinger
2020-02-15 16:55 ` [PATCH 09/14] Add objfile member to DWARF batons Tom Tromey
2020-02-17 12:31 ` [PATCH 00/14] Share DWARF partial symtabs between objfiles Luis Machado
2020-02-17 16:59   ` Tom Tromey
2020-02-22 21:50 ` Tom de Vries
2020-02-22 22:01   ` Tom Tromey
2020-02-23  2:37 ` Simon Marchi
2020-02-23 23:58   ` Tom Tromey
2020-02-24  2:52     ` Simon Marchi
2020-02-24  3:07       ` Tom Tromey
2020-02-24  3:22         ` Tom Tromey
2020-02-24 13:42           ` Tom de Vries
2020-02-24 16:00             ` Tom de Vries
2020-02-24 17:29               ` Tom Tromey
2020-02-24 23:15                 ` Tom Tromey
2020-02-24 19:18           ` Simon Marchi
2020-02-24 23:20             ` Tom Tromey
2020-02-24 22:48       ` Tom Tromey

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=01167589-fae4-39a0-1ebe-0c7d4cbf52b5@simark.ca \
    --to=simark@simark.ca \
    --cc=gdb-patches@sourceware.org \
    --cc=tom@tromey.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox