C ++ 64-битная проблема - PullRequest
       16

C ++ 64-битная проблема

0 голосов
/ 15 марта 2010

У меня есть следующий код:

tmp_data = simulated_data[index_data];
unsigned char *dem_content_buff;
dem_content_buff = new unsigned char [dem_content_buff_size];
int tmp_data;
unsigned long long tmp_64_data;

if (!(strcmp(dems[i].GetValType(), "s32")))
{
    dem_content_buff[BytFldPos] = tmp_data;
    dem_content_buff[BytFldPos + 1] = tmp_data >> 8;
    dem_content_buff[BytFldPos + 2] = tmp_data >> 16;
    dem_content_buff[BytFldPos + 3] = tmp_data >> 24;      
}

if (!(strcmp(dems[i].GetValType(), "f64")))
{
    tmp_64_data = simulated_data[index_data];
    dem_content_buff[BytFldPos] = tmp_64_data;
    dem_content_buff[BytFldPos + 1] = tmp_64_data >> 8;
    dem_content_buff[BytFldPos + 2] = tmp_64_data >> 16;
    dem_content_buff[BytFldPos + 3] = tmp_64_data >> 24;
    dem_content_buff[BytFldPos + 4] = tmp_64_data >> 32;
    dem_content_buff[BytFldPos + 5] = tmp_64_data >> 40;
    dem_content_buff[BytFldPos + 6] = tmp_64_data >> 48;
    dem_content_buff[BytFldPos + 7] = tmp_64_data >> 56;
}       

Я получаю некоторые странные ошибки памяти в других местах приложения, когда второй оператор if верен и выполняется. Когда я закомментирую второе утверждение if, проблема работает нормально. Поэтому я подозреваю, что способ выполнения побитовых операций для 64-битных данных неверен.

Кто-нибудь может увидеть в этом коде что-то, что нужно исправить?

Ответы [ 4 ]

2 голосов
/ 15 марта 2010

Я бы подозревал взаимодействие между dem_content_buff_size и BytFldPos. Если следующее не соответствует действительности:

assert(dem_content_buff_size > (BytFldPos + 7));

тогда вы переполните свой буфер.

1 голос
/ 15 марта 2010

Я бы проверил, что dem_content_buff_size достаточно велико для 64-битных чисел, а также что BytFldPos+7 всегда лежит в границах массива.

1 голос
/ 15 марта 2010

Выглядит хорошо - из того, что я вижу. Было бы неплохо проверить диапазон BytFldPos перед выполнением.

0 голосов
/ 15 марта 2010

Каждый элемент массива dem_content_buff является беззнаковым символом. Вы присваиваете каждому такому элементу long long. Это твое намерение?

Если нет, это может привести к повреждению данных, поскольку это преобразование потеряет (или может) потерять ценность.

...