Bug 16933 - p omits trailing 0 when printing a range of chars
Summary: p omits trailing 0 when printing a range of chars
Status: NEW
Alias: None
Product: gdb
Classification: Unclassified
Component: gdb (show other bugs)
Version: 7.7
: P2 normal
Target Milestone: ---
Assignee: Not yet assigned to anyone
URL:
Keywords:
: 21467 (view as bug list)
Depends on:
Blocks:
 
Reported: 2014-05-12 08:00 UTC by Frank Heckenbach
Modified: 2024-01-10 16:28 UTC (History)
2 users (show)

See Also:
Host:
Target:
Build:
Last reconfirmed:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Frank Heckenbach 2014-05-12 08:00:29 UTC
This bug was reported as Debian bug #666216 for gdb 7-0. According to Hector Oron, it is still reproducable with 7.7-1.

p omits trailing 0 when printing a range of chars.
To reproduce:

# echo 'char foo[5] = { 1, 2, 0, 4, 0 };' > foo.c
# gcc -c -g foo.c
# gdb foo.o
(gdb) p foo[0]@5
$1 = "\001\002\000\004"

What I really wanted would be "{1, 2, 0, 4, 0}", like for other
integer types, since I explicitly selected a single element and gave
a range (@5), but if it must print it as a string, it should at
least print all of the bytes.

I know that's probably due to C's notorious confusion between
integers and characters, and I also know there are other ways to
dump some bytes in gdb.

But still it seems plain wrong to print 4 chars if 5 items were
explicitly requested, just because the last one happens to be 0.
Note that it's not printing a 0-terminated string either: The
embedded "\000" is printed; just one terminating 0 is omitted.

(Which gets very confusing with larger arrays, if you look for
something near the end, thinking the last one printed is the last
one requested and then go hunting your off-by-one bug, only to
realize later there wasn't any ...)
Comment 1 Andreas Schwab 2014-05-12 16:29:10 UTC
"\001\002\000\004\000" would be wrong because that has 6 elements and implies that there is another zero following.
Comment 2 Frank Heckenbach 2014-05-12 16:38:10 UTC
> https://sourceware.org/bugzilla/show_bug.cgi?id=16933
> 
> --- Comment #1 from Andreas Schwab <schwab@linux-m68k.org> ---
> "\001\002\000\004\000" would be wrong because that has 6 elements and implies
> that there is another zero following.

I see. But for the same reason this is then also wrong:

# echo 'char foo[5] = { 1, 2, 0, 4 };' > foo.c
# gcc -c -g foo.c
# gdb foo.o
(gdb) p foo[0]@4
$1 = "\001\002\000\004"

So AIUI gdb must not print a range of chars as a string at all and
should really print "{1, 2, 0, 4, 0}" or "{1, 2, 0, 4}", resp., as
I'd actually prefer anyway.
Comment 3 Hannes Domani 2024-01-01 23:43:55 UTC
See also PR16020.
Comment 4 Hannes Domani 2024-01-10 16:26:48 UTC
*** Bug 21467 has been marked as a duplicate of this bug. ***
Comment 5 Hannes Domani 2024-01-10 16:28:32 UTC
(In reply to Hannes Domani from comment #3)
> See also PR16020.

And also PR26842.