我一直在試圖追蹤叮噹中的錯誤,我認爲我已經有了相當小的重現。這是我的計劃:鐺優化錯誤?
#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);
}
當我編譯它與優化,包括在Xcode的下載鐺( 「蘋果鐺2.1」):
clang++ -Os optimizebug.cpp
並運行它,它會報告:
6b6f2be3 == 6b6f2be2! Really?
這讓我覺得有點奇怪,至少可以說。如果我刪除x_Is_Digit中的(unsigned char)強制轉換,它將正常工作。
我遇到了叮噹中的錯誤嗎?或者我在這裏做些什麼導致某種未定義的行爲?如果我用-O0編譯它,我不會解決問題。