ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
28 марта
1020867 Топик полностью
fk0, легенда (25.07.2020 16:40, просмотров: 658) ответил RxTx на Опыт жизни и общефилософское наблюдение показывают: дискуссия (разговор, беседа) только тогда здрава, заканчивается познавательно и позитивно, когда ее участники имеют одну и ту же цель и заинтересованы в одном и том же результате. Моя цель в данном случае - выяснить четкую практическую истину. Где что сломалось, почему, кто виноват и что делать. Твоя цель явно в том чтобы либо образовать меня/нас, либо просто изложить (насколько ты понимаешь и способен) свои представления о
Нет, это не баг. Потому, что это UB. Потому, что изначально взяли указатель на int и присвоили ему что-то, что не является указателем на int (об чём есть строчка в стандарте). Далее уже не важно. Более того, ещё раз повторю, в рамках СТАНДАРТНОГО C/C++, возникновение такого "не бага" -- в принципе невозможно. Оно появляется из-за "бажной" реализации упакованных структур. Ты прицепился к memcpy и считаешь, что мол баг. Но класс проблем же НАМНОГО ШИРЕ, чем только memcpy. 

"Баг" проявляться будет при любом взятии указателя или ссылки (неявно, для массивов) на члены упакованной структуры.


Для тех кто недопонял: проблема уже в выражении "&IH.conag", что снаружи (memcpy, что угодно, приведения к void*...) -- уже не важно. В этом выражении результатом является тип "указатель на int", и результату присваивается адрес поля conag который не является валидным указателем на int (потому, что указатель на int не может быть не выравненным). Стандарт утверждает, что:


ISO/IEC 9899:201x, разделе 6.3.2.3 Pointers, параграф 7


A pointer to an object type may be converted to a pointer to a different object type. If the

resulting pointer is not correctly aligned for the referenced type, the behavior is

undefined.


Результирующий указатель, который получается в результате вычисления "&IH.conag", не correctly aligned. Дальше не расти трава.

[ZX]