Странное поведение компилятора - отладчика - PullRequest
0 голосов
/ 21 июня 2019

Этот вопрос / проблема тесно связан с предыдущей проблемой, которой я поделился здесь.Однако ....

У меня довольно большой проект, для которого я выполняю модульное тестирование и интеграционное тестирование.К сожалению, я не могу поделиться кодом, кроме крошечных кусочков, и это было бы в любом случае для большого проекта.

Подведу итоги, в лучшем случае, я могу ... Тип определяется следующим образом:

typedef struct { 
s32 s32IntLimitHigh; 
s32 s32IntLimitLow; 
s32 s32RegLimitHigh; 
s32 s32RegLimitLow; 
u16 u16IntGain; 
u16 u16PropGain; 
u16 u16IntStep; 
BOOL BOOLFreeze; 
} structPIreg;

Тип отдельных членов довольно понятен по их именам.
Два массива определены следующим образом:

structPIreg expected_VectParPI[VECT_PI_LENGTH];
structPIreg VectParPI[VECT_PI_LENGTH];

Поскольку это для модульного тестирования, у меня есть исходная переменная и ее ожидаемое значение.Массивы состоят из 8 элементов.

sizeof (VectParPI[1]) is 29 :

4 * s32 + 3 * u16 + BOOL = 4 * 4 + 3 * 4 + 1 = 29
u16 - 16 бит на оригинальной машине, здесьв архитектуре x86 это 32-битная версия.

Я компилирую, тесты выполняются, и я получаю странные результаты.Поэтому я начинаю сеанс отладки, и здесь все становится еще более странным.

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

Я опубликую две картинки окна переменных переменных, чтобы вы поняли.В этом окне наблюдения я вычисляю смещение в байтах между вторым и первым элементом двух массивов.

(char*)&VectParPI[1]-(char*)&VectParPI[0]   long    32  
(char*)&expected_VectParPI[1]-(char*)&expected_VectParPI[0] long    29  

Наблюдать за окнами

Как видите, смещение отличается.Но я не могу понять, почему.Как в объектном файле могут отличаться смещение / размер двух разных переменных одного и того же типа?

Что более интригующе то, что когда я запускаю отладчик и gdb делает паузу на main, два размераявляются правильными (29 каждый).После того, как я установил точку останова где-нибудь, и при достижении точки прерывания я вижу размеры 32 и 29.

Как можно изменить адрес памяти?Это как структура перемещается в памяти.Я просто не могу понять, почему ....

В качестве "доказательства" того, что я не сплю, я прикрепляю то же самое окно с часами, что и раньше.Вы можете видеть, что eclipse / gdb выделил желтым цветом размер и смещение, потому что в какой-то момент они изменились с 29 на 32. Довольно забавно ....:)

подсвеченное окно просмотра

1 Ответ

0 голосов
/ 21 июня 2019

4 * s32 + 3 * u16 + BOOL = 4 * 4 + 3 * 4 + 1 = 29

Это , а не ожидаемое sizeof для этой структуры. Из-за заполнения ожидаемое значение sizeof составляет 32.

Причина, по которой вы получаете 29, заключается в том, что структура имеет __attribute__((packed)), а тот факт, что вы получаете два разных размера, означает, что некоторые из ваших модулей компиляции имеют атрибут packed, а другие - нет.

Это нарушение правила одного определения и неопределенного поведения.

Вам нужно найти, откуда исходит этот packed, и сделать его согласованным по всей программе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...