2011-08-11 10 views
0

次のコードをLLVMコンパイラでコンパイルすると正しく動作しません。 (私は増加しません) GCC 4.2でコンパイルすると正しく動作します。 これはLLVM Compilerのバグですか?LLVM Compiler 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*を第1引数として取ります。したがって、そのキャストの必要はありません。

だから、これを試してみる:

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

はEDIT:この変更で問題が解決する理由を明確にする:あなたのコードでは、sscanfは、メモリ位置にsizeof(int)バイトを書き込もうとしました(&x)のみでしsizeof(unsigned char)バイト(つまり1バイト)を保持します。そこで、一定量のメモリを上書きしていました。この上書きされたメモリは、i変数の一部であった可能性があります。

+0

ありがとうございます。それはあなたの答えによって解決されました。 –

+1

@佐藤孝義:答えがあなたの問題を解決した場合は、[回答を受け入れてください](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)をご利用ください。ありがとう。 – DarkDust

0

コンパイラ側からは、このコードの動作が異なる理由は、gccとllvm(または他のコンパイラ)がスタックを別にレイアウトすることができるためです。あなたはこの例では必要ない前にスタック上の他のものを壊している可能性が高いですが、llvmコンパイラのレイアウトが違うと、もっと便利なものが壊れていました。

これは、問題をデバッグする際にスタックプロテクタを使用するもう一つの理由です(-fstack-protector-all/-fstack-protector)。これらの問題を洗い流すのに役立ちます。

関連する問題