2015-04-07 64 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?

和許多指出它可以在不同的平臺上有所不同,但是這表明它可以在運行時運行,如果一個分析器改變實現