ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Вторник
23 июля
1317870
POV (08.06.2023 22:16 - 23:27, просмотров: 1458)
Ну, уверен что всё просто, это вопрос грамотности и аккуратности. Но может как-то сводно это есть по какой-либо статейке? Чтобы наконец осмыслить [речь про невыровненный доступ?][UPD]... 

Перестал работать кусок кода. Ну как не работать - работает.. только с косяками.


Есть массив структур. Типа упакованных. Внутри и 8 бит и 16 и 32, всякое.

Последнее поле црц32. Оно заполняется после вычисления црц для всего размера данных минус 4 байта. В вычислении црц, если длина не кратна 4 байтам, дополняется ff до кратного.


И вот всё работало, а тут обнаружилось, что перестало - на старте проверка црц данных приводит к восстановлению дефолтных параметров. Причем этот косяк даже для 0-го элемента массива, который уж точно имеет выровненный адрес.

То ли разыменование указателя криво выполняется (при вычислении црц), то ли поля структуры местами тусуются и я порчу данные для вычисления црц записываю в структуру этозначение. Но добавил перед црц32 пустых байт до кратного четырём - всё начало шуршать.


И ведь не всегда на такое попадёшь, хотя на первый взгляд всё то же самое. Не могу уяснить где точно проблема будет, как лучше делать.




UPD...

Да, вот сначала решил для проверки все поля сделать uint32_t (лишь потом пустых байт насовал). Начал ругаться sprintf - говорит, что ждёт int, а я ему long подсовываю. Нипанятна..

Сделал при вызове sprintf явное приведение типа к int - так в хард фоулт стало сваливаться.


Где-то что-то совсем кривое. И боком оно ещё вылезет. А что именно кривое?