2015-04-07 28 views
2

我目前使用的是valgrind-3.10.0.SVN,gcc 4.8.2和Ubuntu 14.04。这是在我的文件中的代码foo.cValgrind混淆了strcmp()的返回值,为什么?

#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()函数?

+3

'strcmp'没有保证返回值,它是0,小于零,或大于零。 –

+4

@CosminMihai不,并且没有。 – juanchopanza

回答

8

我认为valgrind拦截strcmp,特别是它可以为SSE优化功能等优化功能做到这一点。

这里是拦截器的代码:

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

它返回1:

glibc的,在其它硬盘,并返回一个区别:

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

return c1 - c2; 

这两个实现都是有效的,因为@ retired-ninja说:“strcmp没有返回值的保证。它是0,小于零或大于零“

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

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

和许多指出它可以在不同的平台上有所不同,但是这表明它可以在运行时运行,如果一个分析器改变实现