diff --git a/src/Expr.cc b/src/Expr.cc index f060b98602..5447999dd9 100644 --- a/src/Expr.cc +++ b/src/Expr.cc @@ -779,9 +779,48 @@ Val* BinaryExpr::Fold(Val* v1, Val* v2) const case EXPR_SUB: DO_FOLD(-); break; case EXPR_REMOVE_FROM: DO_FOLD(-); break; case EXPR_TIMES: DO_FOLD(*); break; - case EXPR_DIVIDE: DO_FOLD(/); break; + case EXPR_DIVIDE: + { + if ( is_integral ) + { + if ( i2 == 0 ) + reporter->ExprRuntimeError(this, "division by zero"); + i3 = i1 / i2; + } + else if ( is_unsigned ) + { + if ( u2 == 0 ) + reporter->ExprRuntimeError(this, "division by zero"); + u3 = u1 / u2; + } + else + { + if ( d2 == 0 ) + reporter->ExprRuntimeError(this, "division by zero"); + d3 = d1 / d2; + } + } + break; + + case EXPR_MOD: + { + if ( is_integral ) + { + if ( i2 == 0 ) + reporter->ExprRuntimeError(this, "modulo by zero"); + i3 = i1 % i2; + } + else if ( is_unsigned ) + { + if ( u2 == 0 ) + reporter->ExprRuntimeError(this, "modulo by zero"); + u3 = u1 % u2; + } + else + Internal("bad type in BinaryExpr::Fold"); + } + break; - case EXPR_MOD: DO_INT_FOLD(%); break; case EXPR_AND: DO_INT_FOLD(&&); break; case EXPR_OR: DO_INT_FOLD(||); break; diff --git a/testing/btest/Baseline/core.div-by-zero/out b/testing/btest/Baseline/core.div-by-zero/out new file mode 100644 index 0000000000..f5524b0cbf --- /dev/null +++ b/testing/btest/Baseline/core.div-by-zero/out @@ -0,0 +1,5 @@ +expression error in /Users/jsiwek/Projects/bro/bro/testing/btest/.tmp/core.div-by-zero/div-by-zero.bro, line 6: division by zero [a / b] +expression error in /Users/jsiwek/Projects/bro/bro/testing/btest/.tmp/core.div-by-zero/div-by-zero.bro, line 11: division by zero [a / b] +expression error in /Users/jsiwek/Projects/bro/bro/testing/btest/.tmp/core.div-by-zero/div-by-zero.bro, line 16: division by zero [a / b] +expression error in /Users/jsiwek/Projects/bro/bro/testing/btest/.tmp/core.div-by-zero/div-by-zero.bro, line 21: modulo by zero [a % b] +expression error in /Users/jsiwek/Projects/bro/bro/testing/btest/.tmp/core.div-by-zero/div-by-zero.bro, line 26: modulo by zero [a % b] diff --git a/testing/btest/core/div-by-zero.bro b/testing/btest/core/div-by-zero.bro new file mode 100644 index 0000000000..d1221638d6 --- /dev/null +++ b/testing/btest/core/div-by-zero.bro @@ -0,0 +1,36 @@ +# @TEST-EXEC: bro -b %INPUT >out 2>&1 +# @TEST-EXEC: TEST_DIFF_CANONIFIER=$SCRIPTS/diff-remove-abspath btest-diff out + +event div_int(a: int, b: int) + { + print a / b; + } + +event div_count(a: count, b: count) + { + print a / b; + } + +event div_double(a: double, b: double) + { + print a / b; + } + +event mod_int(a: int, b: int) + { + print a % b; + } + +event mod_count(a: count, b: count) + { + print a % b; + } + +event bro_init() + { + event div_int(10, 0); + event div_count(10, 0); + event div_double(10.0, 0.0); + event mod_int(10, 0); + event mod_count(10, 0); + }