[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