__sync_fetch_and_and atomic дает неверный результат в однопоточной программе с Clang - PullRequest
2 голосов
/ 18 декабря 2011

У меня проблема с __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 Ответ

1 голос
/ 22 декабря 2011

Да, это ошибка; это было исправлено в новых версиях clang. В качестве обходного пути вы можете добавить «-no-integrated-as» к вашим флагам компилятора.

...