Формальная проверка прошла долгий путь, но обычно отраслевые / широко используемые инструменты отстают от последних исследований. Вот некоторые недавние усилия в этом направлении:
Spec # http://research.microsoft.com/en-us/projects/specsharp/
Это расширение C #, которое поддерживает контракты кода (предварительные / последующие условия и инварианты) и может использовать эти контракты для выполнения различных типов статического анализа. ,
Подобные проекты существуют для других языков, таких как JML для Java, и Eiffel имеет это в значительной степени встроенный.
Если пойти еще дальше, такие проекты, как slam и blast, могут быть использованы для проверки определенных поведенческих свойств с минимальной аннотацией / вмешательством программиста, но все еще не могут справиться со всей общностью современных языков (такие вещи, как целочисленное переполнение / арифметика указателей не моделируются).
Я полагаю, что в будущем мы увидим гораздо больше этих методов, используемых на практике. Основным препятствием является то, что программные инварианты трудно вывести без ручных аннотаций, и программисты обычно не хотят предоставлять эти аннотации, потому что это слишком утомительно / требует много времени.