[devel] memcpy глючит (или я не умею его готовить)
Leonid Krivoshein
klark.devel на gmail.com
Пт Фев 22 22:27:56 MSK 2019
21.02.2019 16:25, Alexey V. Vissarionov пишет:
> On 2019-02-21 16:17:07 +0300, Paul Wolneykien wrote:
>
> > Коллеги, прошу помощи разбором одной проблемы. Предполагаю,
> > что это какая-то очевидная ошибка: то ли я действительно не
> > умею готовить memcpy(), то ли где-то в программе есть ошибки
> > при работе с памятью, которые влияют косвенно (может в данном
> > случае такое быть?).
> > Итак, у меня есть вот такой код
>
> >> 1460 if (_data.size % 2 && _data.data[8] == 0x04) {
>
> (_data.size % 2) лично я поменял бы на (_data.size & 0x01)
Да, так на порядок быстрее.
> >> 1461 // Uncompressed point (the first 8 bytes is the UKM)
> >> 1462 memcpy (_data.data + 8, _data.data + 9, _data.size - 9);
> >> 1463 _data.size--;
> >> 1464 }
>
> Наверняка какая-нибудь грабля с выравниванием...
Тут ко всему не очевидное поведение компилятора при работе с адресами,
когда их складывают с целыми (много от чего зависит и в ряде случаев
просто на ворнинги можно нарваться). Такой код в любом случае сразу
переписывать на более безопасный, независимо от memcpy()/memmove().
Например, так:
memmove(&_data.data[8], &data.data[9], _data.size - 9); /* если тип
данных [unsigned] char */
--
Best regards,
Leonid Krivoshein.
Подробная информация о списке рассылки Devel