Переполнение стека происходит при изменении строки, которая никогда не достигается - почему и как это предотвратить? - PullRequest
1 голос
/ 08 мая 2020

Я что-то разрабатываю во встроенном контексте с Zephyr.

По сути, я имею дело с boot-l oop, вызванным переполнением стека. Переполнение стека исчезает, когда я изменяю параметр unused вызова функции глубоко внутри моего main. Чтобы убедиться, что проблема не во внутренней части функции, я жестко запрограммировал ее реализацию как return 0;.

Неверная строка, похожая на такую, создает загрузку l oop:

uint8_t port;
ret = foo(&port, NULL, NULL);

Но в строке, в которой отсутствует порт, ссылка на который отсутствует, код работает нормально:

uint8_t port;
ret = foo(NULL, NULL, NULL);

Имейте в виду, как я уже сказал, реализация foo жестко закодирована для возврата 0. Параметры ни в коем случае не используются. Более того, я уверен, что линия никогда не достигается во время выполнения (в данном случае), поскольку она находится за некоторыми условными выражениями, требующими от моего взаимодействия на самом деле от go до

Я начал сдаваться и винить вещи, связанные с неисправной памятью или повреждением электростатическим разрядом, но когда я пробовал тот же код с теми же изменениями на запасном оборудовании, которое у меня было, происходит то же самое. Что мне не хватает? Я искренне не знаю, что еще я мог бы сделать, чтобы узнать, почему это происходит, и как это исправить. У меня нет доступа к отладчику для этого микроконтроллера (SAMD21), поэтому я немного растерялся ... Есть идеи (или, по крайней мере, сочувствие)?

Ответы [ 2 ]

0 голосов
/ 10 мая 2020

Nevermind, я нашел виноватого - простое переполнение стека. Я был на расстоянии одного байта от него до добавления объявления переменной uint8_t port в main. Переменная, когда она не использовалась как параметр в foo(), оптимизировалась компилятором. Очевидно, что одного байта в стеке вызовов было достаточно, чтобы предотвратить переполнение.

Решение: увеличьте размер стека и будьте осторожны с его засорением ненужными элементами.

0 голосов
/ 08 мая 2020

Когда вы удаляете этот параметр, он работает без ошибок или есть другие ошибки? Если вы выполняете запись в неправильную память (например, в память, которая была выделена с нулевым размером) где-то в вашей программе, изменения в несвязанных частях кода программы, такие как изменение размера структуры или параметров функции, может измениться, где происходит фатальная ошибка и что это за фатальная ошибка.

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