__sync_fetch_and_and atomic在Clang的单线程程序中给出了错误的结果

时间:2011-12-17 21:55:52

标签: xcode gcc atomic clang

我遇到__sync_fetch_and_and执行不当的问题。我写了下面的代码来说明它:

bool equal;
int64_t mask = 0x01234567BEEFDEAD;
int64_t orig = 0xDEADBEEF01234567;
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:  0xDEADBEEF01234567
test2:  0xDEADBEEF01234567
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是否存在一些我不能解释的差异,或者这确实是一个错误?

编辑:我还没有尝试过Clang(3.0)的最新版本,因为我现在一直在使用Xcode。

1 个答案:

答案 0 :(得分:1)

是的,这是一个错误;它已在更新版本的clang中修复。作为解决方法,您可以在编译器标志中添加“-no-integrated-as”。