Valgrind弄乱了strcmp()的返回值,为什么?

时间:2015-04-07 07:30:58

标签: c gcc valgrind

我目前正在使用valgrind-3.10.0.SVN,gcc 4.8.2和Ubuntu 14.04。这是我的文件foo.c

中的代码
#include <stdio.h>
#include <string.h>

int main()
{
    char foo[] = "Foo";
    char bar[] = "Bar";
    printf("%d\n", strcmp(foo, bar));
}

我用这个命令编译:
gcc foo.c -o foo

这些是执行命令和输出:

./foo  
4

valgrind ./foo
1

为什么Valgrind会影响我的strcmp()函数的输出?

1 个答案:

答案 0 :(得分:8)

我认为valgrind拦截了strcmp,特别是它可以用于优化的功能,如SSE优化的功能。

这里是拦截器的代码:

http://valgrind.sourcearchive.com/documentation/1:3.6.0~svn11254/h__intercepts_8c-source.html

确实返回1:

if ((unsigned char)c1 < (unsigned char)c2) return -1; \
if ((unsigned char)c1 > (unsigned char)c2) return 1; \
另一方面,glibc确实会产生差异:

https://github.com/zerovm/glibc/blob/master/string/strcmp.c

return c1 - c2;

两种实现都是有效的,因为@retired-ninja说:&#34; strcmp对返回值没有保证。它是0,小于零或大于零。&#34;

这个问题很有意思,因为有一个关于什么时候strcmp结果可能不同:

When will strcmp not return -1, 0 or 1?

许多人指出它可能在不同平台上有所不同。但是这一点表明,如果探查器改变了实现,它甚至可以在不同的运行中发生变化。

相关问题