SMT-решатели для арифметики битовых векторов

Я планирую некоторые эксперименты по символическому выполнению кода C, используя готовый решатель SMT и задаваясь вопросом, какой решатель использовать; глядя, например, на участников конкурса SMT, и принимая только системы с открытым исходным кодом, сужает его до Beaver, Boolector, CVC3, OpenSMT, Sateen, Sonolar, STP, Verit; который все еще длинный список.

пытаясь сузить его немного дальше, я замечаю, что некоторые из систем рекламируют способность обрабатывать арифметику битовых векторов, тогда как другие только рекламируют способность обрабатывать общую целочисленную арифметику. В принципе, первое верно для C, где переменные-это машинные слова, а не неограниченные целые числа. Какая разница на практике? Что произойдет, если вы попытаетесь использовать общую целочисленную систему для такого рода работы? Применяется ли один из следующих сценариев?

  1. немного векторная система немного эффективнее, но вы можете использовать либо, без проблем.

  2. вы можете используйте общую целочисленную систему с небольшой настройкой.

  3. общая целочисленная система подходит для signed int (потому что результат переполнения не определен), но даст неправильный ответ для unsigned.

  4. общая целочисленная система просто не подходит для арифметики машинного слова, и я могу сократить свой короткий список только до тех систем, которые предоставляют арифметику битовых векторов.

  5. что-то еще...?

Я попытался задать как можно более конкретный вопрос, но если кто-то может предложить какие-либо другие критерии для сужения списка, это было бы здорово!

2 ответов


У меня был хороший опыт использования STP для символического выполнения. STP был разработан именно для этой задачи. Кроме того, существует ряд инструментов символического выполнения, которые успешно использовали STP для этой цели, поэтому есть основания полагать, что STP не отстой. Я бы определенно рекомендовал STP другим как выбор по умолчанию для такого рода экспериментов.

однако я не пробовал другие системы, поэтому я не знаю, как STP сравнивается с их.

лично я вижу STP в качестве базовой линии и выбора по умолчанию для такого рода приложений. Итак, если у вас есть время попробовать только один решатель, попытка STP кажется довольно разумным выбором.

Если бы мне пришлось угадать, я бы предположил, что арифметика битового вектора важна для поддержки, потому что любой код больших систем будет иметь нетривиальный объем кода, который выполняет побитовые операции. Кроме того, я подозреваю / беспокоюсь, что некоторые системные коды могут полагаться на поведение из беззнаковой арифметики обернуть по модулю 2n, и если вы попытаетесь смоделировать его целыми числами, вы не получите семантику C правильно (потому что, как вы говорите, целые числа просто не верны для арифметики машинного слова), и, следовательно, если вы попытаетесь использовать целочисленный решатель, вы можете столкнуться с некоторыми трудностями. Однако у меня нет веских доказательств ни для одного из этих подозрений.

П. С. и Z3 также может быть претендентом, чтобы добавить в свой список для рассмотрения. (Тебе действительно нужна твоя решатель должен быть открытым исходным кодом, пока он свободен? Я ожидал, что инструмент символического выполнения будет использовать его только как черный ящик без изменений.)


по данным SMT-Википедия на 2011-08, мы имеем:

на основе этих мер представляется, что наиболее динамичными и хорошо организованными проектами являются OpenSMT, STP и CVC4.

Я просто проверяю этот материал - до сих пор все три кажутся разумными, плюс более старые CVC -> CVC3.