Skip to content

Commit 46993b6

Browse files
committed
Implement handling of unexpected responses from SMT solver (WIP)
1 parent d3d483f commit 46993b6

File tree

2 files changed

+25
-1
lines changed

2 files changed

+25
-1
lines changed

src/solvers/smt2_incremental/smt2_incremental_decision_procedure.cpp

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,20 @@ static smt_responset get_response_to_command(
3232
return response;
3333
}
3434

35+
static optionalt<std::string>
36+
get_problem_messages(const smt_responset &response)
37+
{
38+
if(const auto error = response.cast<smt_error_responset>())
39+
{
40+
return "SMT solver returned an error message - " + id2string(error->message());
41+
}
42+
if(response.cast<smt_unsupported_responset>())
43+
{
44+
return {"SMT solver does not support given command."};
45+
}
46+
return {};
47+
}
48+
3549
/// \brief Find all sub expressions of the given \p expr which need to be
3650
/// expressed as separate smt commands.
3751
/// \return A collection of sub expressions, which need to be expressed as
@@ -237,5 +251,7 @@ decision_proceduret::resultt smt2_incremental_decision_proceduret::dec_solve()
237251
log.error() << "SMT2 solver returned \"unknown\"" << messaget::eom;
238252
return lookup_decision_procedure_result(check_sat_response->kind());
239253
}
240-
UNIMPLEMENTED_FEATURE("handling solver response.");
254+
if(const auto problem = get_problem_messages(result))
255+
throw analysis_exceptiont{*problem};
256+
throw analysis_exceptiont{"Unexpected kind of response from SMT solver."};
241257
}

unit/solvers/smt2_incremental/smt2_incremental_decision_procedure.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -294,3 +294,11 @@ TEST_CASE("smt2_incremental_decision_proceduret receives success and check-sat r
294294
test.mock_responses = {smt_success_responset{}, smt_check_sat_responset{smt_sat_responset{}}};
295295
REQUIRE_NOTHROW(test.procedure());
296296
}
297+
298+
TEST_CASE("smt2_incremental_decision_proceduret receives unexpected response.")
299+
{
300+
decision_procedure_test_environmentt test{};
301+
test.mock_responses =
302+
{smt_get_value_responset{{{"x", smt_bool_literal_termt{false}}}}};
303+
REQUIRE_THROWS(test.procedure());
304+
}

0 commit comments

Comments
 (0)