2011-12-17 34 views
2

我在__sync_fetch_and_and上執行錯誤時出現問題。我寫了下面的代碼來說明吧:__sync_fetch_and_and原子在與Clang的單線程程序中給出錯誤結果

bool equal; 
int64_t mask = 0xBEEFDEAD; 
int64_t orig = 0xDEADBEEF; 
int64_t test1, test2; 
test1 = test2 = orig; 
equal = (test1 == test2); 
printf("Before anding\n"); 
printf("test1:\t0x%016llX\n", test1); 
printf("test2:\t0x%016llX\n", test2); 
printf("equal:\t%d\n", equal); 

// Try anding 
test1 &= mask; 
__sync_fetch_and_and(&test2, mask); 
equal = (test1 == test2); 
printf("After anding\n"); 
printf("test1:\t0x%016llX\n", test1); 
printf("test2:\t0x%016llX\n", test2); 
printf("equal:\t%d\n", equal); 

的輸出是這樣的:

Before anding 
test1: 0xDEADBEEF
test2: 0xDEADBEEF
equal: 1 
After anding 
test1: 0x0021046700234425 
test2: 0xDFAFFFEFBFEFDFEF 
equal: 0 

...這顯然是不正確的。我試過替換__sync_and_and_fetch,但那不能解決它。或者`__sync_fetch_and_or`工作正常。我使用Xcode 4.2.1並使用默認編譯器Apple LLVM Compiler 3.0(Clang)進行編譯。當我切換到使用GCC 4.2時,它工作正常。

這當然看起來像一個編譯器錯誤,但我不知道如果我在Clang做這個錯誤。 Clang中有沒有我沒有考慮的差異,或者這確實是一個錯誤?

編輯:我還沒有嘗試Cla(3.0)的最新版本,因爲我現在卡住使用Xcode。

回答

1

是的,這是一個錯誤;它已經在更新版本的鏗鏘聲中被修復了。作爲一種解決方法,您可以將「-no-integrated-as」添加到編譯器標誌中。

+0

非常好,謝謝。 – Kyle 2011-12-25 20:01:33