Я пытался отследить то, что похоже на ошибку в clang, и я думаю, что у меня достаточно разумное воспроизведение этого.Вот моя программа:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#define x_Is_Digit(x) isdigit((unsigned char) (x))
void Odd_Behavior(char * version)
{
char * ptr, *tmp;
for (ptr = version; x_Is_Digit(*ptr); ptr++);
ptr++;
for (tmp = ptr; x_Is_Digit(*ptr); ptr++);
if (ptr == tmp)
printf("%08x == %08x! Really?\n", ptr, tmp);
}
int main()
{
char buffer[100];
strcpy(buffer, "3.8a");
Odd_Behavior(buffer);
return(0);
}
Когда я компилирую его с оптимизацией, в Clang, включенном в загрузку XCode («Apple Clang 2.1»):
clang++ -Os optimizebug.cpp
И запустите его, этосообщает:
6b6f2be3 == 6b6f2be2! Really?
Это кажется мне немного странным, если не сказать больше.Если я уберу приведение (без знака) в x_Is_Digit, оно будет работать правильно.
Я столкнулся с ошибкой в clang?Или я делаю что-то здесь, что вызывает какое-то неопределенное поведение?Если я скомпилирую его с -O0, у меня не возникнет проблемы.