c - LLVM 编译器 2.0 错误?

标签 c llvm c99

当使用 LLVM 编译器编译以下代码时,它无法正确运行。 (我不增加。) 使用 GCC 4.2 编译时它可以正常运行。 这是 LLVM 编译器的错误吗?

#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;
}

最佳答案

对于 sscanf,您将使用 %2x 而不是 %02x。此外,%2x 表示将传递一个额外的 int* 参数。但是您传递的是 unsigned char*。最后,sscanfconst char* 作为第一个参数,因此不需要强制转换。

所以试一试:

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

编辑:澄清此更改解决问题的原因:在您的代码中,sscanf 尝试将 sizeof(int) 字节写入只能容纳 sizeof(unsigned char) 字节(即 1 个字节)的内存位置 (&x)。所以,你覆盖了一定数量的内存。这个被覆盖的内存很可能是(的一部分)i 变量。

关于c - LLVM 编译器 2.0 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7021588/

相关文章:

c++ - 将 GCC IR 转换为 LLVM IR

linker - 带有积极内联的 "relocation truncated to fit"链接失败

c - C 中的 IEEE-754 浮点异常

c - 警告 : Expression Result Unused in RenderScript

c - C语言中如何检查除法的结果是否为整数?

c - 失败的 malloc() 的单元测试

llvm - 获取指令的用户

c - 当括号导致语法错误时,如何在宏参数内的大括号内使用逗号?

c - makecontext 产生无效值?

objective-c - 将 unsinged char 数组从 objective-c 快速转换为 UnsafeMutablePointer<UInt8>