Ошибка LLVM Compiler 2.0? - PullRequest
       2

Ошибка LLVM Compiler 2.0?

0 голосов
/ 11 августа 2011

Когда следующий код скомпилирован с помощью LLVM Compiler, он работает неправильно. (я не увеличиваю.) Работает правильно при компиляции с 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;
}

Ответы [ 2 ]

6 голосов
/ 11 августа 2011

Для sscanf вы бы использовали %2x вместо %02x. Кроме того, %2x указывает, что будет передан дополнительный аргумент int*. Но вы передаете unsigned char*. И, наконец, sscanf принимает const char* в качестве первого аргумента, поэтому нет необходимости в этом приведении.

Так что попробуйте:

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

РЕДАКТИРОВАТЬ : чтобы выяснить, почему это изменение решает проблему: в вашем коде sscanf попытался записать sizeof(int) байт в ячейку памяти (&x), которая могла содержать только sizeof(unsigned char) байты (т.е. 1 байт). Итак, вы перезаписывали определенный объем памяти. Эта перезаписанная память вполне могла быть (частью) переменной i.

0 голосов
/ 12 августа 2011

С точки зрения компилятора причина того, что этот код ведет себя по-разному, заключается в том, что gcc и llvm (или любой другой компилятор) могут по-разному размещать стек. Скорее всего, вы раньше просто стучали что-то другое в стеке, что вам не требовалось для этого примера, но с другой компоновкой для компилятора llvm вы дурачили что-то более полезное.

Это еще одна веская причина использовать средства защиты стека при отладке проблемы (-fstack-protector-all / -fstack-protector). Это может помочь устранить эти проблемы.

...