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

Valgrind messes up the return value of strcmp(), why?

我目前使用的是 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() 函数的输出?

我认为 valgrind 会拦截 strcmp,尤其是它可能会针对像 SSE 优化的优化函数那样做。

拦截器代码如下:

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

确实如此 return 1:

if ((unsigned char)c1 < (unsigned char)c2) return -1; \
if ((unsigned char)c1 > (unsigned char)c2) return 1; \

glibc,另一方面,确实 return 不同:

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

return c1 - c2;

这两种实现都是有效的,正如@retired-ninja 所说:"strcmp has no guarantees on return value. It is 0, less than zero, or more than zero."

这个问题很有趣,因为,例如,有一个关于 strcmp 结果何时可能不同的问题:

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

许多人指出它在不同平台上可能会有所不同。但是这个表明如果探查器更改实现,它甚至可以与 运行 运行 不同。