即使两个字符串都正常,strcmp 也会崩溃
strcmp crashes even though both strings are sane
我有一个奇怪的问题,我的程序在 strcmp 崩溃。
根据 gdb 核心分析,我发现被检查的两个字符串都是正常的,这意味着它们的指针不是 NULL,并且它们包含有限的空终止值。
但是其中一个字符串是垃圾(不是变量要包含的字符串)
撇开它是垃圾这一事实不谈,我真的很想知道为什么 strcmp 会因为 2 个正常的字符串而崩溃?这可能是什么原因?
提前致谢!
编辑:
一个例子,
a = strcmp(b,c);
(gdb) p b
= 0x7f58d3a36b89 "H50uRH5}00\a017A6"
(gdb) p c
= 0x2041e48 "MAIN"
b
和 c
的值似乎 不错,但由于优化,特别是围绕 strcmp()
等功能可能会经历密集的宏扩展,调试器可能无法获得实际值。
问题可能很容易在源代码中发现,您应该 post 有问题的函数的源代码。
gdb
为变量 b
打印的值 0x7f58d3a36b89
大得惊人!您可以尝试以这种方式修改您的代码:
static char bb = *b;
static char cc = *c;
a = strcmp(b, c);
在 strcmp()
之前强制访问 b
和 c
可能会导致崩溃并让您验证 b
是否确实是 gdb
打印出来。
我有一个奇怪的问题,我的程序在 strcmp 崩溃。
根据 gdb 核心分析,我发现被检查的两个字符串都是正常的,这意味着它们的指针不是 NULL,并且它们包含有限的空终止值。
但是其中一个字符串是垃圾(不是变量要包含的字符串)
撇开它是垃圾这一事实不谈,我真的很想知道为什么 strcmp 会因为 2 个正常的字符串而崩溃?这可能是什么原因?
提前致谢!
编辑:
一个例子,
a = strcmp(b,c);
(gdb) p b
= 0x7f58d3a36b89 "H50uRH5}00\a017A6"
(gdb) p c
= 0x2041e48 "MAIN"
b
和 c
的值似乎 不错,但由于优化,特别是围绕 strcmp()
等功能可能会经历密集的宏扩展,调试器可能无法获得实际值。
问题可能很容易在源代码中发现,您应该 post 有问题的函数的源代码。
gdb
为变量 b
打印的值 0x7f58d3a36b89
大得惊人!您可以尝试以这种方式修改您的代码:
static char bb = *b;
static char cc = *c;
a = strcmp(b, c);
在 strcmp()
之前强制访问 b
和 c
可能会导致崩溃并让您验证 b
是否确实是 gdb
打印出来。