被gdb print ptr和print"%s"混淆

Pau*_*ves 1 c gdb buffer-overflow buffer-overrun

1167      ptr = (void*)getcwd(cwd, MAX_PATH_LENGTH-1);
(gdb) n
1168      if (!ptr) {
(gdb) print ptr
$1 = 0xbff2d96c "/media/MMC-SD/partition1/aaaaaaaaaaa"
(gdb) print &cwd
$2 = (char (*)[3500]) 0xbff2d96c
(gdb) print strlen(cwd)
$3 = 36
(gdb) print "%s",cwd
$4 = "/media/MMC-SD/partition1/aaaaaaaaaaa", '\0' <repeats 912 times>, "??O?001\000\000\000\000??027\000\000\000?3????EL?3?000??027\000\000\000\000\000\000\000\027\000\000\000\000??/?027\000\000\000?3????N????\230????3?000??027\000\000\000\000\000\000\000??000\000\000\000\001\000\000\000??M?3????\000\000\000\000.\231?027??w\005\b\001\000"...
(gdb) print "%s", ptr
$5 = 0xbff2d96c "/media/MMC-SD/partition1/aaaaaaaaaaa"
(gdb) Quit
Run Code Online (Sandbox Code Playgroud)

为什么ptr正确打印字符串但不是cwd; 如果我尝试使用cwd,这也会影响程序并崩溃...

[编辑:事实证明崩溃是由于此变量上的一个愚蠢的缓冲区溢出... grr ...而不是gdb,但打印问题仍然有效]

ehd*_*hdr 5

我同意mweerden.尝试我认为类似于你的代码的东西,我得到:

(gdb) print cwd
$1 = "/media", '\0' <repeats 782 times>, "\016???" ...
(gdb) print (char*) cwd
$2 = 0xbfc8eb84 "/media"
Run Code Online (Sandbox Code Playgroud)

从gdb开始,所以似乎自cwd定义为char cwd[3500],gdb打印整个数组,而如果告诉gdb将其解释为a char*,它将按预期工作.如果您的应用程序崩溃,我会认为这是因为其他原因.