Hi,
this, too, came up during my automated garbage generation. In this file
the abbrev code of CU DIE was changed to zero. libdw is then used thus:
die = dwarf_offdie (dw, 11, &die_mem);
assert (dwarf_tag (die) == 0);
die = dwarf_offdie (dw, 11, &die_mem);
assert (dwarf_tag (die) != 0);
Surprisingly, this actually passes. When we ask for dwarf_tag the first
time around, __libdw_findabbrev looks for abbrev with code 0, and
doesn't find it. It then proceeds with loading .debug_abbrev, looking
at each abbrev in turn, and obviously it won't find the one numbered 0.
Then __libdw_findabbrev asks for code 0 again. But
Dwarf_Abbrev_Hash_insert contains these lines
/* Make the hash value nonzero. */
hval = hval ?: 1;
So it goes on to look for abbrev with code 1 instead, and because
.debug_abbrev has been loaded by now, it of course finds it.
I don't advocate supporting arbitrarily broken DWARF files, but this
inconsistency seems worth a fix. Mine is on pmachata/findabbrev_0.
Thanks,
PM
Show replies by thread
I merged it and did another commit with a little cleanup of the test.
Thanks,
Roland