Существуют ли какие-либо инструменты или методы, которые могут определять переполнение буфера в статически определенных массивах (т. Е. char[1234]
вместо malloc(1234)
)?
Большую часть вчерашнего дня я потратил на отслеживание сбоев и странного поведения, которое в итоге оказалось вызвано следующей строкой:
// ensure string is nul terminated due to stupid snprintf
error_msg[error_msg_len] = '\0';
Этот индекс явно вызывал запись за пределы массива. Это приводит к засорению переменной-указателя, что впоследствии приводит к неожиданному поведению с этим указателем.
Три вещи, которые приходят на ум, которые могут помочь облегчить такие проблемы:
Отзыв по коду
Это не было сделано, но я работаю над этим.
valgrind
Я часто использую valgrind во время разработки для выявления проблем с памятью, но он не работает со статическими массивами. В приведенном выше примере он только показал мне симптомы, такие как недействительный free()
из-за засоренного указателя.
-fstack-protector-all
В прошлом я использовал -fstack-protector-all
для обнаружения переполнений, как указано выше, но по какой-то странной причине он ничего не помечал в этом случае.
Так может ли кто-нибудь предложить какие-либо идеи о том, как я мог бы определить такие перерасходы? Либо путем улучшения в приведенном выше списке или что-то совершенно новое.
РЕДАКТИРОВАТЬ : В некоторых ответах упоминались коммерческие продукты, которые довольно дороги. На данном этапе я не думаю, что смогу убедить власть в том, чтобы купить такой инструмент, поэтому я бы хотел ограничить использование инструментов дешевым / бесплатным. Да, вы получаете то, за что платите, но некоторые улучшения лучше, чем ничего.