2011-08-11 150 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)。它可以帮助消除这些问题。