即使两个字符串都是理智的,strcmp也会崩溃

时间:2016-08-10 10:28:24

标签: c string strcmp

我有一个奇怪的问题,我的程序在strcmp崩溃。

在gdb核心分析中,我看到两个被检查的字符串都是理智的,这意味着它们的指针不是NULL,它们包含有限的空终止值。

然而,其中一个字符串是垃圾(不是变量要包含的字符串)

撇开它是垃圾的事实,我真的想知道为什么strcmp会因2个健全的字符串而崩溃?可能的原因是什么?

提前致谢!

编辑:

一个例子,

a = strcmp(b,c);
(gdb) p b
$92 = 0x7f58d3a36b89 "H\205\300uRH\215}\320\350\a\300\361\377A\276"
(gdb) p c
$93 = 0x2041e48 "MAIN"

1 个答案:

答案 0 :(得分:1)

bc 的值似乎确定,但由于优化,尤其是围绕可能会经历强烈宏扩展的strcmp()等功能,实际值可能无法供调试器使用。

在源代码中可能很容易发现问题,您应该将源发布到违规函数。

0x7f58d3a36b89为变量gdb打印的值b非常大!您可以尝试以这种方式修改代码:

static char bb = *b;
static char cc = *c;
a = strcmp(b, c);

b之前强制访问cstrcmp()可能会导致崩溃,并让您验证b是否确实是gdb打印出来的$name="'m'w'a'n'g'i'"; $name = str_replace("'","",$name); echo $name // prints mwangi 是。