ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
27 апреля
1021105 Топик полностью
fk0, легенда (26.07.2020 15:24, просмотров: 635) ответил LightElf на Извини, но ты загнался.
Чего ты привязался к memcpy. Я рассказал выше как получается баг. Вместо memcpy может быть любое обращение по указателю/ссылке. К слову и gcc и clang даже варнинг имеют специальный: -Waddress-of-packed-member. Его невозможно выполнить в любом коде. А ты хочешь сказать, мол memcpy на 32-битной машине должен копировать по байтику вместо 4-х за раз, а на 64-битной по байтику вместо 8, а на машинах где есть векторные инструкции... вообще страшно. И да, оптимизатор 

однозначно видит, оттого баг и получается. Он видит, что там обычный int, а не int __attribute((packed))__, со всеми вытекающими. К слову в последних версиях clang и gcc атрибут packed или aligned(1) автоматически применяется к самим членам упакованных структур что ли, не вникал глубоко (а keil остался с какой-то устаревшей недоделкой), так что кажется что баг "исправлен", но на самом деле опять же не до конца. Ты можешь в коде через typeof() (если ты используешь одно нестандартное расширение, то почему не допустить другое?) вывести тип, можешь использовать generics из C99, или в C++ можешь явно написать код зависимый от типа -- и что там будет я не знаю, но предрекаю тоже глюки. Вот она цена нестандартных расширений.

[ZX]