我目前正在使用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()函数的输出?
答案 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?
许多人指出它可能在不同平台上有所不同。但是这一点表明,如果探查器改变了实现,它甚至可以在不同的运行中发生变化。