diff --git a/src/Expr.cc b/src/Expr.cc index 6d08955113..237ca1faa6 100644 --- a/src/Expr.cc +++ b/src/Expr.cc @@ -274,14 +274,7 @@ void Expr::AssignToIndex(ValPtr v1, ValPtr v2, ValPtr v3) const iterators_invalidated); if ( iterators_invalidated ) - { - ODesc d; - Describe(&d); - reporter->PushLocation(GetLocationInfo()); - reporter->Warning("possible loop/iterator invalidation caused by expression: %s", - d.Description()); - reporter->PopLocation(); - } + reporter->ExprRuntimeWarning(this, "possible loop/iterator invalidation"); if ( error_msg ) RuntimeErrorWithCallStack(error_msg); @@ -2974,14 +2967,7 @@ void IndexExpr::Add(Frame* f) v1->AsTableVal()->Assign(std::move(v2), nullptr, true, &iterators_invalidated); if ( iterators_invalidated ) - { - ODesc d; - Describe(&d); - reporter->PushLocation(GetLocationInfo()); - reporter->Warning("possible loop/iterator invalidation caused by expression: %s", - d.Description()); - reporter->PopLocation(); - } + reporter->ExprRuntimeWarning(this, "possible loop/iterator invalidation"); } void IndexExpr::Delete(Frame* f) @@ -3003,14 +2989,7 @@ void IndexExpr::Delete(Frame* f) v1->AsTableVal()->Remove(*v2, true, &iterators_invalidated); if ( iterators_invalidated ) - { - ODesc d; - Describe(&d); - reporter->PushLocation(GetLocationInfo()); - reporter->Warning("possible loop/iterator invalidation caused by expression: %s", - d.Description()); - reporter->PopLocation(); - } + reporter->ExprRuntimeWarning(this, "possible loop/iterator invalidation"); } ExprPtr IndexExpr::MakeLvalue() diff --git a/src/Reporter.cc b/src/Reporter.cc index 0ed84562e7..145bce4aea 100644 --- a/src/Reporter.cc +++ b/src/Reporter.cc @@ -174,6 +174,21 @@ void Reporter::ExprRuntimeError(const detail::Expr* expr, const char* fmt, ...) throw InterpreterException(); } +void Reporter::ExprRuntimeWarning(const detail::Expr* expr, const char* fmt, ...) + { + ODesc d; + expr->Describe(&d); + + PushLocation(expr->GetLocationInfo()); + va_list ap; + va_start(ap, fmt); + FILE* out = EmitToStderr(warnings_to_stderr) ? stderr : nullptr; + DoLog("expression warning", reporter_warning, out, nullptr, nullptr, true, true, + d.Description(), fmt, ap); + va_end(ap); + PopLocation(); + } + void Reporter::RuntimeError(const detail::Location* location, const char* fmt, ...) { ++errors; diff --git a/src/Reporter.h b/src/Reporter.h index c52d54f8b2..be5515ee11 100644 --- a/src/Reporter.h +++ b/src/Reporter.h @@ -112,6 +112,10 @@ public: [[noreturn]] void RuntimeError(const detail::Location* location, const char* fmt, ...) __attribute__((format(printf, 3, 4))); + // Report a rutnime warning in evaluating a Zeek script expression. + void ExprRuntimeWarning(const detail::Expr* expr, const char* fmt, ...) + __attribute__((format(printf, 3, 4))); + // Report a runtime error in executing a compiled script. This // function will not return but raise an InterpreterException. [[noreturn]] void CPPRuntimeError(const char* fmt, ...) __attribute__((format(printf, 2, 3))); diff --git a/testing/btest/Baseline/language.table-set-iterator-invalidation/err b/testing/btest/Baseline/language.table-set-iterator-invalidation/err index e33c980fc3..238b43773d 100644 --- a/testing/btest/Baseline/language.table-set-iterator-invalidation/err +++ b/testing/btest/Baseline/language.table-set-iterator-invalidation/err @@ -1,5 +1,5 @@ ### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. -warning in <...>/table-set-iterator-invalidation.zeek, line 22: possible loop/iterator invalidation caused by expression: t[4] -warning in <...>/table-set-iterator-invalidation.zeek, line 31: possible loop/iterator invalidation caused by expression: t[4] -warning in <...>/table-set-iterator-invalidation.zeek, line 54: possible loop/iterator invalidation caused by expression: s[4] -warning in <...>/table-set-iterator-invalidation.zeek, line 63: possible loop/iterator invalidation caused by expression: s[4] +expression warning in <...>/table-set-iterator-invalidation.zeek, line 22: possible loop/iterator invalidation (t[4]) +expression warning in <...>/table-set-iterator-invalidation.zeek, line 31: possible loop/iterator invalidation (t[4]) +expression warning in <...>/table-set-iterator-invalidation.zeek, line 54: possible loop/iterator invalidation (s[4]) +expression warning in <...>/table-set-iterator-invalidation.zeek, line 63: possible loop/iterator invalidation (s[4])