混淆库打印ptr vs打印"%s"
-
09-06-2019 - |
题
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
为什么是ptr打印的字符串正确的,但cwd;这也影响到该计划和它的崩溃,如果我尝试使用cwd...
[编辑:事实证明,坠机是造成通过一个愚蠢的缓冲区溢出在这var...grr...不库,但打印的问题仍然有效]
解决方案
的原因 cwd
是印刷的不同在 gdb
是因为 gdb
知道, ptr
是一个 char *
(我猜), cwd
是一系列长度 3500
(如图所示,在你的输出)。因此,当印刷 ptr
它打印指针的价值(以及作为一种服务也串它指向的)和在打印 cwd
它打印的 整个 阵列。
我看不出有任何理由为什么使用 cwd
而不是的 ptr
会导致问题,但我需要看到一些代码是肯定的。
其他提示
我同意mweerden.想些事情我认为是类似于你的代码,我获得:
(gdb) print cwd
$1 = "/media", '\0' <repeats 782 times>, "\016���" ...
(gdb) print (char*) cwd
$2 = 0xbfc8eb84 "/media"
从库,因此它似乎是由于 cwd
被定义为 char cwd[3500]
,库打印的整个阵列,同时如果你告诉库,以将它解释为一个 char*
, 它将作为你的期望。如果你的应用程序的崩溃,我要假设它是因为别的东西。
那 ptr
显示很好格式和串 cwd
作为"字节的缓冲区"可能是特定的库.在任何情况下,它应该不会影响你的应用程序;根据 man 3 getcwd
, ptr
应点到 cwd
(或应当NULL如果发生错误).你可以使用 ptr
没有崩溃的程序?
什么类型是cwd?上述代码没有告诉我们。这可能是ptr是一个void*处理不同的方式通过库.
不隶属于 StackOverflow