diff --git a/src/Stmt.cc b/src/Stmt.cc index 7eab80a640..e8c4abc9f9 100644 --- a/src/Stmt.cc +++ b/src/Stmt.cc @@ -1597,23 +1597,11 @@ ValPtr AssertStmt::Exec(Frame* f, StmtFlowType& flow) { if ( ! assert_result || run_result_hook ) { zeek::StringValPtr msg_val = zeek::val_mgr->EmptyString(); - if ( msg ) { - // Eval() may fail if expression assumes assert - // condition is F, but we still try to get it for - // the assertion_result hook. - try { - msg_val = cast_intrusive(msg->Eval(f)); - } catch ( InterpreterException& e ) { - static ODesc desc; - desc.Clear(); - desc.SetShort(true); - desc.SetQuotes(true); - desc.Add("Describe(&desc); - desc.Add(">"); - msg_val = zeek::make_intrusive(desc.Len(), (const char*)desc.Bytes()); - } - } + if ( msg ) + // It's up to the script writing to assure that the expression + // works regardless of the state of the condition. If they + // fail to do so, they can get an exception at this point. + msg_val = cast_intrusive(msg->Eval(f)); report_assert(assert_result, cond_desc, msg_val, GetLocationInfo()); } diff --git a/testing/btest/Baseline/language.assert-7/out b/testing/btest/Baseline/language.assert-7/out index c28e697ecb..9008a99cda 100644 --- a/testing/btest/Baseline/language.assert-7/out +++ b/testing/btest/Baseline/language.assert-7/out @@ -1,4 +1,3 @@ ### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. -expression error in <...>/assert.zeek, line 10: field value missing (r$b) -error in <...>/assert.zeek, line 10: assertion failure: r?$b () +expression error in <...>/assert.zeek, line 12: field value missing (r$b) fatal error: errors occurred while initializing diff --git a/testing/btest/Baseline/language.assert-hook-6/.stderr b/testing/btest/Baseline/language.assert-hook-6/.stderr index 13dbb41dae..08f2a26abf 100644 --- a/testing/btest/Baseline/language.assert-hook-6/.stderr +++ b/testing/btest/Baseline/language.assert-hook-6/.stderr @@ -1,5 +1,3 @@ ### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. -expression error in <...>/assert-hook.zeek, line 15: field value missing (get_current_packet_header()$ip) -expression error in <...>/assert-hook.zeek, line 17: field value missing (get_current_packet_header()$ip) -error in <...>/assert-hook.zeek, line 17: assertion failure: 2 + 2 == 5 () -error in <...>/assert-hook.zeek, line 22: assertion failure: 2 + 2 == 5 ({"msg":"false and works"}) +expression error in <...>/assert-hook.zeek, line 18: field value missing (get_current_packet_header()$ip) +error in <...>/assert-hook.zeek, line 24: assertion failure: 2 + 2 == 5 ({"msg":"false and works"}) diff --git a/testing/btest/Baseline/language.assert-hook-6/out b/testing/btest/Baseline/language.assert-hook-6/out index 37d07df4b9..19ff952797 100644 --- a/testing/btest/Baseline/language.assert-hook-6/out +++ b/testing/btest/Baseline/language.assert-hook-6/out @@ -1,7 +1,4 @@ ### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. -assertion_result, T, 2 + 2 == 4, , <...>/assert-hook.zeek, 15 -assertion_result, T, 2 + 2 == 4, {"msg":"true and works"}, <...>/assert-hook.zeek, 16 -assertion_result, F, 2 + 2 == 5, , <...>/assert-hook.zeek, 17 -assertion_failure, 2 + 2 == 5, , <...>/assert-hook.zeek, 17 -assertion_result, F, 2 + 2 == 5, {"msg":"false and works"}, <...>/assert-hook.zeek, 22 -assertion_failure, 2 + 2 == 5, {"msg":"false and works"}, <...>/assert-hook.zeek, 22 +assertion_result, T, 2 + 2 == 4, {"msg":"true and works"}, <...>/assert-hook.zeek, 15 +assertion_result, F, 2 + 2 == 5, {"msg":"false and works"}, <...>/assert-hook.zeek, 24 +assertion_failure, 2 + 2 == 5, {"msg":"false and works"}, <...>/assert-hook.zeek, 24 diff --git a/testing/btest/language/assert-hook.zeek b/testing/btest/language/assert-hook.zeek index 1f107ff70e..0a48363919 100644 --- a/testing/btest/language/assert-hook.zeek +++ b/testing/btest/language/assert-hook.zeek @@ -164,9 +164,11 @@ hook assertion_result(result: bool, cond: string, msg: string, bt: Backtrace) event zeek_init() { - assert 2 + 2 == 4, cat(get_current_packet_header()$ip); assert 2 + 2 == 4, to_json([$msg="true and works"]); - assert 2 + 2 == 5, cat(get_current_packet_header()$ip); + # This next assert will generate a run-time error, exiting the + # event handler. + assert 2 + 2 == 4, cat(get_current_packet_header()$ip); + assert 2 + 2 == 5, "didn't get to here"; } event zeek_done() diff --git a/testing/btest/language/assert.zeek b/testing/btest/language/assert.zeek index 79ea8a9096..346af8542f 100644 --- a/testing/btest/language/assert.zeek +++ b/testing/btest/language/assert.zeek @@ -69,6 +69,8 @@ event zeek_init() { local r: MyRecord = [$a=1234]; assert ! r?$b, fmt("Unexpected r$b is set to %s", r$b); + # This will generate a run-time error, rather than reporting the + # failed assertion. assert r?$b, fmt("r$b is not set trying anyway: %s", r$b); }