Форк CMBC для работы с LLM
Для экспериментов с формальной верификацией кода (для встраиваемых приложений в первую очередь) у нас появился форк знаменитого инструмента CBMC.
CBMC это инструмент, позволяющий на основе формальной логики доказать отсутствие определённых классов ошибок в коде. Не "проверить, что работает", как инструменты тестирования, а выстроить полную цепочку математического доказательства отсутствия ошибки. Не любой, а строго конкретного вида (проблему останова никто не отменял). К счастью, самые распространённые ошибки известны заранее.
Без нейросетей, на такую работу просто не остаётся времени: научный код слишком сложный для интеграции в него своих концепций, только на поиск места для расширения могут уйти недели. При том, что сам код достаточно просто подтверждается на целевых задачах. Математика - штука строгая, и нарушения в решателе будут заметны сразу. Но даже с нейросетями, нужно сперва знать, а что вообще нужно и имеет смысл делать.
В первую очередь, добавлена полноценная поддержка хорновских дизъюнктов в качестве вывода символьного исчисления. Решаются через Z3 и Golem. Это серьёзно расширяет поддерживаемые классы кодовых выражений, которые покрываются верификатором. В частности, это индукция по рекурсии и сворачивание циклов в одно выражение. То есть, больше кода может стать верифицируемым.
Был вариант использовать SeaHorn и CBMC одновременно, но, во-первых, SeaHorn не настолько зрелый инструмент, и, во-вторых, они работают над разной базой: CBMC покрывает код непосредственно, а SeaHorn - байткод LLVM после конвертации. Потому, корректнее расширить CBMC для покрытия обоих классов.
Во вторую, добавлено четыре новых инструмента для профилирования результата работы верификатора:
--symex-merge-report показывает слияния путей, на которых значение перестаёт быть константой.
--equation-report показывает состав уравнения после среза по месту в коде.
--equation-trace показывает, где именно значение перестаёт быть константой.