From df7ed20455568600e85e23b38a0a34e27930d73a Mon Sep 17 00:00:00 2001 From: Vern Paxson Date: Thu, 10 Jul 2025 11:12:40 -0700 Subject: [PATCH] crash fixes for constructs that expect add/delete expressions to return values --- src/Expr.cc | 4 ++-- src/script_opt/Expr.cc | 7 ++++--- .../Baseline/language.add-del-expr-void/.stderr | 3 +++ .../btest/Baseline/language.add-del-expr-void/out | 1 + testing/btest/language/add-del-expr-void.zeek | 14 ++++++++++++++ 5 files changed, 24 insertions(+), 5 deletions(-) create mode 100644 testing/btest/Baseline/language.add-del-expr-void/.stderr create mode 100644 testing/btest/Baseline/language.add-del-expr-void/out create mode 100644 testing/btest/language/add-del-expr-void.zeek diff --git a/src/Expr.cc b/src/Expr.cc index 7e07a94bd2..3bcf9d96a5 100644 --- a/src/Expr.cc +++ b/src/Expr.cc @@ -220,9 +220,9 @@ bool Expr::CanAdd() const { return false; } bool Expr::CanDel() const { return false; } -TypePtr Expr::AddType() const { return nullptr; } +TypePtr Expr::AddType() const { return base_type(TYPE_VOID); } -TypePtr Expr::DelType() const { return nullptr; } +TypePtr Expr::DelType() const { return base_type(TYPE_VOID); } ValPtr Expr::Add(Frame* /* f */) { Internal("Expr::Add called"); } diff --git a/src/script_opt/Expr.cc b/src/script_opt/Expr.cc index 159d0107e7..7fca67563d 100644 --- a/src/script_opt/Expr.cc +++ b/src/script_opt/Expr.cc @@ -730,9 +730,10 @@ ExprPtr AddExpr::BuildSub(const ExprPtr& op1, const ExprPtr& op2) { } ExprPtr AggrAddDelExpr::Reduce(Reducer* c, StmtPtr& red_stmt) { - if ( type ) - return UnaryExpr::Reduce(c, red_stmt); - + // In the future, if we use add/delete for list operations or such, + // then the following becomes germane. + // if ( type ) + // return UnaryExpr::Reduce(c, red_stmt); if ( c->Optimizing() ) op = c->UpdateExpr(op); diff --git a/testing/btest/Baseline/language.add-del-expr-void/.stderr b/testing/btest/Baseline/language.add-del-expr-void/.stderr new file mode 100644 index 0000000000..b8c9cc23d1 --- /dev/null +++ b/testing/btest/Baseline/language.add-del-expr-void/.stderr @@ -0,0 +1,3 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. +error in /Users/vern/warehouse/zeek/zeek-line-num/testing/btest/.tmp/language.add-del-expr-void/add-del-expr-void.zeek, line 11: can't assign void value (my_any1 = add my_set[3]) +error in /Users/vern/warehouse/zeek/zeek-line-num/testing/btest/.tmp/language.add-del-expr-void/add-del-expr-void.zeek, line 12: can't assign void value (my_any2 = delete my_set[5]) diff --git a/testing/btest/Baseline/language.add-del-expr-void/out b/testing/btest/Baseline/language.add-del-expr-void/out new file mode 100644 index 0000000000..49d861c74c --- /dev/null +++ b/testing/btest/Baseline/language.add-del-expr-void/out @@ -0,0 +1 @@ +### BTest baseline data generated by btest-diff. Do not edit. Use "btest -U/-u" to update. Requires BTest >= 0.63. diff --git a/testing/btest/language/add-del-expr-void.zeek b/testing/btest/language/add-del-expr-void.zeek new file mode 100644 index 0000000000..39ba3efcb2 --- /dev/null +++ b/testing/btest/language/add-del-expr-void.zeek @@ -0,0 +1,14 @@ +# @TEST-DOC: checks for type-checking for add/delete expressions +# +# @TEST-EXEC-FAIL: zeek -b %INPUT >out +# @TEST-EXEC: btest-diff out +# @TEST-EXEC: btest-diff .stderr + +global my_set: set[count]; + +event zeek_init() + { + local my_any1: any = add my_set[3]; + local my_any2: any = delete my_set[5]; + print my_any1, my_any2; + }