_(\*) На самом деле, не совсем._
Наверное, многие слышали про Valgrind — отладчик, который может сказать, где в вашей нативной программе утечка памяти, где ветвление зависит от неинициализированной переменной и многое другое (а ведь кроме memcheck, у него есть и другие режимы работы). Внутри себя эта чудо-программа перемалывает нативный код в некий промежуточный байткод, инструментирует его и генерирует новый машинный код — уже с run-time проверками. Но есть проблема: Valgrind не умеет работать под Windows. Когда мне это понадобилось, поиски привели меня к аналогичной утилите под названием [DrMemory][1], также с ней в комплекте был аналог `strace`. Но речь не столько о них, сколько о библиотеке динамической инструментации, на базе которой они построены, [DynamoRIO][2]. В какой-то момент я заинтересовался этой библиотекой с точки зрения написания собственной инструментации, начал искать документацию, набрёл на [большое количество примеров][3] и был поражён тем, что простенькую, но законченную инструментацию вроде [подсчёта инструкций вызова][4] можно написать буквально в 237 строк сишного кода, 32 из которых — лицензия, а 8 — описание. Нет, это, конечно не "пишем убийцу Valgrind в 30 строк кода на JavaScript", но сильно проще, чем то, что можно представить для подобной задачи.
В качестве примера давайте напишем уже четвёртую реализацию инструментации для фаззера American Fuzzy Lop, о котором недавно [уже писали на Хабре][5].
[Читать дальше →][6]
[1]:
http://www.drmemory.org/
[2]:
http://dynamorio.org/
[3]:
http://dynamorio.org/docs/API_samples.html
[4]:
https://github.com/DynamoRIO/dynamorio/blob/master/api/samples/countcalls.c
[5]:
https://habrahabr.ru/post/328652/
[6]:
https://habrahabr.ru/post/332076/?utm_source=habrahabr&utm_medium=rss&utm_campaign=feed_posts#habracut