2011-08-11 149 views
0

當使用LLVM編譯器編譯以下代碼時,它無法正常運行。 (我沒有增加。) 它與GCC 4.2編譯時正常運行。 這是LLVM編譯器的錯誤嗎?LLVM編譯器2.0錯誤?

#include <stdio.h> 
#include <string.h> 

void BytesFromHexString(unsigned char *data, const char *string) { 
    printf("bytes:%s:", string); 
    int len = (int)strlen(string); 
    for (int i=0; i<len; i+=2) { 
     unsigned char x; 
     sscanf((char *)(string + i), "%02x", &x); 
     printf("%02x", x); 
     data[i] = x; 
    } 
    printf("\n"); 
} 

int main (int argc, const char * argv[]) 
{ 
    // insert code here... 
    unsigned char data[64]; 
    BytesFromHexString(data, "4d4f5cb093fc2d3d6b4120658c2d08b51b3846a39b51b663e7284478570bcef9"); 
    return 0; 
} 
+0

使用[clang](http://clang.llvm.org/)前端或GCC? –

回答

6

對於sscanf你會使用%2x代替%02x。此外,%2x表示將傳遞額外的int*參數。但你通過了一個unsigned char*。最後,sscanfconst char*作爲第一個參數,因此不需要該演員。

因此,這給一試:

int x; 
sscanf((string + i), "%2x", &x); 

編輯:澄清爲什麼這種變化可以解決問題:在你的代碼,sscanf試着寫在一個內存位置sizeof(int)字節(&x),只能保存sizeof(unsigned char)字節(即1字節)。所以,你覆蓋了一定量的內存。這個被覆蓋的內存很可能是i變量的一部分。

+0

謝謝。它由你的答案解決。 –

+1

@Takayoshi佐藤:如果答案解決了你的問題,請[接受答案](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。謝謝。 – DarkDust

0

從編譯器方面來看,這段代碼的行爲不同的原因是gcc和llvm(或任何其他編譯器)可能以不同的方式佈局堆棧。在你不需要這個例子之前,你可能只是在堆棧上打開其他東西,但是對於llvm編譯器的不同佈局,你正在破壞一些更有用的東西。

這是調試問題時使用堆棧保護器的另一個好的理由(-fstack-protector-all/-fstack-protector)。它可以幫助消除這些問題。