Я совсем не знаком с Application Verifier и Driver Verifier ...
Для приложений Valgrind очень полезен в качестве инструмента для проверки на утечки, использование после освобождения, двойное освобождение, переполнение буфера, использование унифицированных данных, небезопасный одновременный доступ к данным и многое другое.
Существует также множество фаззеров ( zzuf , fusil и т. Д.), Которые проверяют устойчивость программы к неверным данным.
Сам GCC имеет -fstackprotector
, который включает SSP (защита от разрушения стека, или ProPolice); -fmudflap
, который обнаруживает другое неправильное использование памяти; и (в сочетании с glibc
) -D_FORTIFY_SOURCE=
n , что дополнительно проверяет различные функции строк и памяти.
В ядре Linux есть много конфигурационных переключателей в меню «Взлом ядра»:
CONFIG_DEBUG_SLAB
, CONFIG_DEBUG_PAGEALLOC
и т. Д., Обеспечивающие разумное выделение, использование и освобождение памяти
CONFIG_DEBUG_OBJECTS
, который проверяет, что объекты используются и освобождаются в порядке
- kmemcheck , "Valgrind для ядра"
CONFIG_PROVE_LOCKING
, который анализирует все возможные тупики
CONFIG_DEBUG_PREEMPT
, CONFIG_DEBUG_MUTEXES
, CONFIG_DEBUG_SPINLOCK
, CONFIG_DEBUG_SPINLOCK_SLEEP
и т. Д., Которые предупреждают о неправильном использовании блокировки
CONFIG_FAULT_INJECTION
& co. , которые вероятностно вызывают сбои выделения памяти и ввода-вывода