Добавление перечислений является довольно общей вещью сделать, если Вы вернетесь к исходному коду и редактированию, то любой другой путь (наследование или отражение, если любой возможен), вероятно, возвратится и поражать Вас, когда Вы получите обновление библиотеки, и они представили то же перечислимое имя или то же перечисление значений - я видел много кода низкого уровня, где целое число соответствует к двоичному кодированию, где Вы столкнулись бы с проблемами
Идеально, перечисления ссылки кода должны быть записаны, как равняется только (или переключатели), и попытайтесь соответствовать требованиям завтрашнего дня, не ожидая, что перечислимый набор будет константой
Поскольку valgrind работает с двоичными файлами, он не обнаружил ничего плохого в этом коде. Проверьте эти ( http://www.thefreecountry.com/programming/debuggers.shtml ) статические анализаторы исходного кода, они должны найти. Если они не работают, PC-lint ( http://www.gimpel.com/html/pcl.htm ) справится с этим ....
Rational Purify довольно хорошо работает с обнаружением переполнения буфера, утечек памяти, повреждений и т. Д. Однако это довольно дорого.
Пакет mem, упомянутый в этом ответе SO ] может быть другим вариантом.
Coverity (инструмент статического анализа) поймет это.
Если это на Linux, я бы сначала попробовал valgrind, думаю, он справится.
Изменить: Если это похоже на SiegeX говорит, что, я думаю, valgrind этого не делает (что имеет смысл, потому что у него нет возможности вставлять охранники в стек, поскольку он участвует только во время выполнения процесса). Тем не менее, это хороший инструмент, который стоит иметь в своем ящике для инструментов, поэтому я сохраню сообщение.
Переполнение буфера в C довольно сложно обнаружить, поскольку оно не происходит до времени выполнения. Чтобы свести к минимуму вероятность его возникновения, вам следует использовать несколько более безопасные стандартные библиотечные функции, которые выполняют некоторую проверку границ - например, fgets () вместо gets ().
Если вы вручную манипулируете большим количеством массивов, вам, вероятно, следует написать модульные тесты чтобы проверить крайние случаи в ваших алгоритмах. Cmockery - это пример инфраструктуры модульного тестирования для C.
Valgrind не обнаруживает переполнения в автоматическом и статическом хранилище. По крайней мере, не по умолчанию.
visual studio (с -Zi я думаю, но я могу ошибаться) улавливает такое назначение с помощью средства проверки стека времени выполнения. Это не то бесплатное решение для Linux, которое вы предпочитаете, но оно отлично работает.
Я думаю, что в этом случае подразумевается нулевой символ, поскольку вы ссылаетесь на буквальную строку. Следовательно, d [4] все еще находится в границах (представьте d как const char *) .... Я могу ошибаться.