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?
许多人指出它在不同平台上可能会有所不同。但是这个表明如果探查器更改实现,它甚至可以与 运行 运行 不同。
我目前使用的是 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?
许多人指出它在不同平台上可能会有所不同。但是这个表明如果探查器更改实现,它甚至可以与 运行 运行 不同。