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,但打印问题仍然有效]
我同意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*
,它将按预期工作.如果您的应用程序崩溃,我会认为这是因为其他原因.