Решаватели на SMT за бит-векторна аритметика

Планирам някои експерименти в символно изпълнение на C код, като използвам готов SMT решаващ инструмент и се чудя кой решаващ инструмент да използвам; гледайки напр. участниците в конкурса за SMT и като се вземат само системите с отворен код, се стеснява до Beaver, Boolector, CVC3, OpenSMT, Sateen, Sonolar, STP, Verit; което все още е дълъг списък.

Опитвайки се да го стесня още малко, забелязвам, че някои от системите рекламират способността да обработват аритметика с битов вектор, докато други рекламират само способността да обработват обща аритметика с цели числа. По принцип първото е правилно за C, където променливите са машинни думи, а не неограничени цели числа. Колко голяма е разликата на практика? Какво се случва, ако се опитате да използвате обща система за цели числа за този вид работа? Приложим ли е един от следните сценарии?

  1. Системата с битов вектор е малко по-ефективна, но можете да използвате и двете, без проблем.

  2. Можете да използвате обща система с цели числа с малко корекции.

  3. Общата система за цели числа е добра за int със знак (тъй като резултатът от препълване е недефиниран), но ще даде грешен отговор за unsigned.

  4. Общата система с цели числа просто не е правилна за аритметика с машинни думи и мога да намаля краткия си списък само до онези системи, които осигуряват аритметика с битов вектор.

  5. Нещо друго...?

Опитах се да задам възможно най-конкретен въпрос, но ако някой може да предложи други критерии за стесняване на списъка, това би било чудесно!


person rwallace    schedule 07.06.2011    source източник


Отговори (2)


Имам добър опит с използването на STP за символно изпълнение. STP е проектиран точно за тази задача. Освен това има редица инструменти за символично изпълнение, които успешно са използвали STP за тази цел, така че има причина да се смята, че STP не е лош. Определено бих препоръчал STP на други като избор по подразбиране за този вид експериментиране.

Въпреки това не съм пробвал другите системи, така че не знам как STP се сравнява с тях.

Лично аз виждам STP като базова линия и избор по подразбиране за този вид приложение. Така че, ако имате време да опитате само един решаващ инструмент, опита на STP изглежда като доста разумен избор.

Ако трябваше да гадая, моето предположение би било, че бит-векторната аритметика е важна за поддържане, защото всеки голям системен код ще има нетривиално количество код, който изпълнява битови операции. Освен това подозирам/притеснявам се, че някои системни кодове може да разчитат на поведението на неподписана аритметика за обвиване на модул 2n и ако се опитате да го моделирате с цели числа, няма да получите семантиката на C правилно (защото, както казвате, целите числа просто не са правилни за аритметика с машинни думи) и следователно, ако се опитате да използвате само целочислена програма за решаване, може да изпитате някои трудности. Въпреки това нямам твърди доказателства за нито едно от тези подозрения.

P.S. Z3 също може да бъде претендент, който да добавите към списъка си, за да обмислите. (Наистина ли трябва вашият решаващ инструмент да бъде с отворен код, стига да е безплатен? Очаквам, че инструмент за символично изпълнение ще го използва само като черна кутия, без модификация.)

person D.W.    schedule 30.06.2011

Според SMT-Wikipedia от 2011-08 г. имаме:

Въз основа на тези мерки изглежда, че най-жизнените, добре организирани проекти са OpenSMT, STP и CVC4.

Просто проверявам тези неща - засега и трите изглеждат разумни, плюс по-стар CVC -> CVC3.

person Grzegorz Wierzowiecki    schedule 01.09.2011