2011-09-21 99 views
2

我一直在試圖追蹤叮噹中的錯誤,我認爲我已經有了相當小的重現。這是我的計劃:鐺優化錯誤?

#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編譯它,我不會解決問題。

回答

9

當然看起來像我的錯誤。鏘主線不顯示此(至少在達爾文/ x86-64)。請在llvm.org/bugs上提供錯誤,並提供有關如何重現此問題的完整詳細信息。堆棧溢出不是報告編譯器錯誤的好地方:)

1

明確的錯誤。如果在if語句中這兩個指針相等,則它們在printf語句中也必須相等。