Несколько небольших прмеров с типичными ошибками, которые бывают при работе с массивами, а также способы их детектирования через санитайзеры, статический анализ и valgrind.
Undefined Santizer - Санитайзер, который определяет неопределенное поведение.
Мы его будем использовать для определения:
- Переполнение типа;
- Деление на ноль.
Соответствубщие примеры приведены в папке UBSAN
MemorySanitizer (MSan) Санитайзер памяти позволяет обнаружить работу с объявленной, но неинициализированной (как на стекек, так и на куче) памятью в C/C++.
Пример определения ошибки лежит внутри папки msan
AddressSanitizer (aka ASan) - Адресный санитайзер позволяет обнаруживать ошибки памяти в C/C++.
Список ошибок, которые может обнаружить ASAN с примерами: (ASAN детектирует больше ошибок, но они специфичны. За подробностями в раздел "Ссылки")
- Использование указателя после освобождения памяти
- Переполнение буффера на куче
- Переполнение буффера на стэке
- Утечки памяти
В файлах репозитория эти ошибки разбиты по папкам, которые имеют следующие названия:
- use_after_free
- stack_buffer_overflow
- heap_buffer_overflow
- memory_leak
- heap_example - отдельный пример неправильного выделения памяти под динамический массив
в каждой папке есть Makefile который принимает параметры в формате make name
, где name
:
- static - позволяет прогнать код статическим анализатором clang и поместить очет в папку html-dir;
- orig - собирает обычный бинарь без всяких проверок и инструментации. Имя скомпилированного файла - bin_clear;
- asan/msan/ubsan - сборка бинаря с инструментацией ASAN or MSAN (смотря в какой папке собираете). Имя скомпилированного файла bin_asan или bin_msan;
- clean - удаляет все файлы, полученные при сборке;
- all - выполнит стадии static, asan/(msan), orig. Данная стадия запускается при выполнении
make
без аргументов
Примеры:
build all:
cd asan/heap_buffer_overflow/
make
clean:
make clean
- Перейдите в директорию с нужным вам примером и выполните:
./bin_asan
или для папки с msan
./bin_msan
или для папки с ubsan
./bin_uban
Вы увидете вывод санитайзера с описанием ошибки
- Выполните
valgrind ./bin_clear
чтобы увидеть вывод memcheck- После сборки (выполнения команды
make
) перейдите в html_dir - в ней есть файлик .html с отчетом статического анализатора. Его можно посмотреть через веб-браузер.
Напишите свой код в любой файлик с расширением .c в папке template
Например test.c
После этого выполните
make
Все, что написано выше, будет применено к вашему файлу
Если при запуске ./bin_asan или ./bin_msan вылетела ошибка с трассой выполнения, выполните следующее
Для ASAN:
export ASAN_OPTIONS=use_sigaltstack=false
Для MSAN :
export MSAN_OPTIONS=use_sigaltstack=false
https://github.com/google/sanitizers
https://releases.llvm.org/11.0.0/tools/clang/docs/AddressSanitizer.html
https://releases.llvm.org/11.0.0/tools/clang/docs/MemorySanitizer.html
https://valgrind.org/docs/manual/quick-start.html#quick-start.intro