Я новичок в Z3 и искал ответ на мой вопрос здесь и в Google. Я не был успешным.
Это код, вызывающий проблему:
void test(string str) {
if (str [0] == 'g') {
cout << "\"The first letter g" case"<< endl;
if (str [1] == 'a') cout << "Second letter is 'a'";
else cout << "Second letter is not 'a'";
} else {
cout << "The non-g case" << endl;
if (str [1] == 'b') cout << "Second letter is 'b'";
else cout << "Second letter is not 'b'";
}
}
Мне нужно автоматически сгенерировать входные данные, чтобы код выполнялся полностью.
Можно ли вообще сделать это с z3? Если да, то как я могу это сделать с помощью API z3 C / C ++?
Не отвечая непосредственно на ваш вопрос, но решатели SAT / SMT использовались ранее для создания таких «эксплойтных» векторов со значительным успехом. Например, проверьте систему AEG Брамли: http://security.ece.cmu.edu/aeg/index.html, среди других.
Z3 это не тестовый генератор или фаззер, это доказательство теоремы. Тем не менее, Z3 используется для реализации фаззеров и тестовых генераторов. Один из них является Pex, модульное тестирование белой коробки для .NET.
Z3 также используется в шалфей белый коробочный фаззер для двоичных файлов x86. К сожалению, я не знаю ни одного генератора тестовых случаев для C ++, основанного на Z3.