[devel] memcpy глючит (или я не умею его готовить)

Mikhail Efremov sem на altlinux.org
Сб Фев 23 04:21:17 MSK 2019


On Sat, 23 Feb 2019 01:48:30 +0300 Leonid Krivoshein wrote:
> 22.02.2019 23:51, Vladimir Didenko пишет:
> > пт, 22 февр. 2019 г. в 22:29, Leonid Krivoshein:  
> >> Тут ко всему не очевидное поведение компилятора при работе с
> >> адресами, когда их складывают с целыми (много от чего зависит и в
> >> ряде случаев просто на ворнинги можно нарваться). Такой код в
> >> любом случае сразу переписывать на более безопасный, независимо от
> >> memcpy()/memmove(). Например, так:
> >>
> >> memmove(&_data.data[8], &data.data[9], _data.size - 9); /* если тип
> >> данных [unsigned] char */
> >>  
> > Вы глупость написали. Арифметика указателей и целых чисел вполне
> > определена и безопасна, если не выходить за границы массива. И еще -
> > запись p + 8 и &p[8] равносильны согласно стандарту языка C.  

Более того, можно еще и &8[p] написать, совершенно корректная запись с
точки зрения синтаксиса языка :). Другое дело, что за такое в реальном
коде надо руки отрывать сразу.

> И каково же её определение в разных стандартах языка C? А реализация
> в разных компиляторах? К примеру, согласно N1570 (6.5.6) над 

В стандарте арифметика указателей описана вполне ясно.

> void-указателями такого не проделаешь, в отличие от gcc, который тоже
> ни один стандарт могёт.

Я не понял этой фразы и сравнения указателей с gcc. При чем тут
указатель на void? Размер объекта в этом случае не известен, разумеется
арифметика не работает.

> Кстати, именно с такой арифметикой на более
> старом gcc на ворнинги нарывался и всегда их сразу выправлял. Нет,
> лучше об этом не думать, а писать сразу так, чтобы работало везде.

Полагаю, что предупреждения были о чем-то другом.

-- 
WBR, Mikhail Efremov


Подробная информация о списке рассылки Devel