TGViewer
Протестировал Протестировал @sqaunderhood · 1.89K subscribers
Post #373 1.61K
Я писал, что вместе со студентами в Летней школе мы сделали фаззинг тест для нашего форка LuaJIT. Тест тогда интегрировали в Tarantool CI, а непосредственно запуск теста организовали в инфраструктуре OSS Fuzz. Тогда с помощью этого теста нашли несколько багов в нашем форке и несколько багов в ванильной версии LuaJIT, которые мы конечно же отрепортили в апстрим. Значит вся работа была проделана не зря!

Первая версия теста технически была относительно простой: грамматика Lua 5.1 описана в формате Protobuf и с помощью библиотеки libprotobuf-mutator генерировались случайные структуры в формате Protobuf, которые сериализовались в программы на Lua и исполнялись в LuaJIT. Такой тест позволил нам тестировать LuaJIT с помощью синтаксически (почти, об этом ниже) корректных программ. Однако у этой версии теста была проблема: программы часто содержали зацикливания из-за рекурсивных функций и бесконечных циклов. Из-за этого тест часто зависал и тестирование завершалось по таймауту. Нужно было придумать как избегать таких проблем. Тут важно сказать, что так как мы тестируем JIT-компилятор, то функции и циклы в сгенерированных программах нам нужны чтобы включать компиляцию горячих участков кода, мы не можем убрать их из грамматики. То есть задача была такой: использовать функции с ограничением по количеству запусков и циклы с ограничением по количеству итераций. Решение заимствовали из статьи "Program Reconditioning: Avoiding Undefined Behaviour When Finding and Reducing Compiler Bugs" - в каждый цикл и функцию добавили счетчик и выполнение тела функции и цикла прекращается по достижении некоторого значения.

-- Было:
while (true) do
foo = 'bar'
...
end

-- Стало:
counter_0 = 0
while (true) do
if counter_0 > 5 then
break
end
...
end


Такой же способ используется в фаззере Fuzzili для Javasript. За поиск решения этой проблемы спасибо моему коллеге Сергею К. (Серега, твоя секунда славы), а за реализацию Римме Т. (Римма, твоя секунды славы). Так мы избавились от зацикливаний в программах и нашли после этого еще несколько багов в LuaJIT.
Telegram Протестировал Прошлым летом мы в Tarantool организовали и провели Летнюю школу для студентов, где они работали над реальными задачами, а им в этом помогали. От меня были две задачи по созданию фаззеров по грамматике для LuaJIT и для SQL: нужно было описать грамматику…
  • 🔥 19
  • ❤ 3
More from @sqaunderhood
  1. Sep 3, 2026Finding bugs across the Python ecosystem with Claude and property-based testing We develop…
  2. Jul 9, 2026A collaborative bibliography of papers related to property-based testing https://github.co…
  3. Jul 7, 2026В Github UI появился автоматический дедупликатор тикетов, во время создания нового тикета,…
  4. Jun 13, 2026CirrusCI всё: Cirrus CI will shut down effective Monday, June 1, 2026. Перейдут под крыло…
  5. Jun 4, 2026Интересная статья про использование сравнительного тестирования для приложений с состояние…
  6. Apr 23, 2026Раньше ведь как было: изучаешь теорию языков программирования и формальные методы, формаль…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →