Xcode __在带有叮当声的单线程程序中,sync_fetch_和_以及atomic给出了错误的结果

Xcode __在带有叮当声的单线程程序中,sync_fetch_和_以及atomic给出了错误的结果,xcode,gcc,atomic,clang,Xcode,Gcc,Atomic,Clang,我遇到了\uu同步\u获取\u和\u的问题,并且执行不正确。我编写了以下代码来说明它: 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

我遇到了
\uu同步\u获取\u和\u的问题,并且执行不正确。我编写了以下代码来说明它:

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
…这显然是不正确的。我尝试过替换
\uuuuu sync\u和\u fetch
,但这并不能解决问题。或使用“``同步``获取`,或`正常工作。我使用的是Xcode 4.2.1,并使用默认编译器Apple LLVM compiler 3.0(Clang)进行编译。当我切换到使用GCC4.2时,它工作正常

这看起来确实像是一个编译器错误,但我不确定我是否在Clang上犯了错误。在叮当声中是否存在一些我没有解释的差异,或者这确实是一个bug


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

是的,这是一个bug;它已在较新版本的clang中修复。作为一种解决方法,您可以将“-no integrated As”添加到编译器标志中