ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
2 мая
963027 Топик полностью
fk0, легенда (06.12.2019 20:21, просмотров: 383) ответил POV_ на В общем сам "дурак", дал шанс компилятору при оптимизации повертеть меня на херу...
А внутри psu_GetField, когда вызывается sprintf, он печатает случайно не в ту же статическую переменную, в которую печать происходит в той функции, где глюки были обнаружены? Тогда чего же ты хочешь? snprintf начинает читать из буфера и копировать в этот же буфер строку. Причём читать начинает с начала, когда уже пишет в середину. В итоге он читает ту строку, которую сам же пишет, и процесс продолжается до затирания всей памяти, потому, что конца у строки никогда не случается. Прекрасный пример, почему глобальные переменные такое же зло, как и goto в очумелых ручках. Все подобного рода функции должны не глобальную переменную использовать, а принимать в качестве дополнительного аргумента буфер (указатель), куда нужно распечатать. А буфер нужно выделять на стеке по мере надобности. В C++ это можно автоматизировать (через константную ссылку и аргумент по-умолчанию), в C ничего не сделать, только руками. PS: такие ошибки на раз ловятся и valgrind, и addres sanitizer. Последний даже быстрей.
[ZX]