Фильтрованный контент о тестировании и качестве ПО.
coccinelle для семантических патчей, semgrep или coccigrep, но точно не regexp, который не учитывает контекст.mmap() возвращает MAP_FAILED или -1 в случае ошибки выделения памяти. Популярной ошибкой среди разработчиков является проверка возвращаемого значения на 0, что не соответствует стандарту. Из-за этого возможно появление проблем. Эвристику на такую ошибку нашёл Hanno Böck, потом написал простейший скрипт и нашёл проблемы в проектах Geeqie, GDB, KDE/kwayland, Mesa, QEMU и др. В скрипте как раз используется стандартный grep, а для coccinelle семантический патч выглядел бы примерно так:identifier p; statement S; @@
p = mmap(...);
- if (!p) S
+ if (p != MAP_FAILED) S
clang-analyzer и возможно в ближайшее время проверка на такой тип ошибок появится в LLVM.LD_PRELOAD библиотеку, которая проверяет выполнение условия для функций сортировки в `qsort()`: "When the same objects (consisting of width bytes, irrespective of their current positions in the array) are passed more than once to the comparison function, the results shall be consistent with one another. That is, they shall define a total ordering on the array.". Для сложных структур данных легко нарушить требование. Список проектов, в которых были найдены ошибки, внушителен: gcc, PostGIS, dpkg, graphicsmagick и другие.sqlite пишут, что sqlancer это AFL нашего времени:sqlancer на Golang от PingCAP - https://github.com/chaos-mesh/go-sqlancersysbench, автором которой он является, Костя Осипов, Роман Цысик и Кирилл Юхин рассказывали про СУБД Tarantool. А ещё был Андрей Карпов из viva64, он нахваливал PVS Studio, ребята из Intel и МЦСТ и много других гостей. Думаю, если покопаться в архивах, то можно ещё много интересных выпусков найти.theft автор Hypothesis David R. MacIver назвал только небольшой выбор генераторов данных. Поэтому всё, что остаётся это писать генераторы данных или использовать Hypothesis с импортом функций, например, с помощью CFFI или ctypes.