From: David Malcolm Date: Thu, 12 Mar 2026 00:45:29 +0000 (-0400) Subject: analyzer: fix ICE on effective modulo by zero [PR124433] X-Git-Tag: basepoints/gcc-17~786 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=54ee3bfa3bcea520728ada5654089f02fc508a1f;p=thirdparty%2Fgcc.git analyzer: fix ICE on effective modulo by zero [PR124433] gcc/analyzer/ChangeLog: PR analyzer/124433 * region-model-manager.cc (region_model_manager::maybe_fold_binop): When checking for division by zero, use the value range of the divisor, rather than merely checking for constant 0. * region-model.cc (region_model::get_gassign_result): Likewise. gcc/testsuite/ChangeLog: PR analyzer/124433 * gcc.dg/analyzer/divide-by-zero-ice-pr124433.c: New test. Signed-off-by: David Malcolm --- diff --git a/gcc/analyzer/region-model-manager.cc b/gcc/analyzer/region-model-manager.cc index 33d9a62937c..702a8ae7244 100644 --- a/gcc/analyzer/region-model-manager.cc +++ b/gcc/analyzer/region-model-manager.cc @@ -803,8 +803,12 @@ region_model_manager::maybe_fold_binop (tree type, enum tree_code op, case ROUND_MOD_EXPR: case RDIV_EXPR: case EXACT_DIV_EXPR: - if (cst1 && zerop (cst1)) - return get_or_create_unknown_svalue (type); + { + value_range arg1_vr; + if (arg1->maybe_get_value_range (arg1_vr)) + if (arg1_vr.zero_p ()) + return get_or_create_unknown_svalue (type); + } break; } diff --git a/gcc/analyzer/region-model.cc b/gcc/analyzer/region-model.cc index a85c6958838..a044aeb9700 100644 --- a/gcc/analyzer/region-model.cc +++ b/gcc/analyzer/region-model.cc @@ -1365,8 +1365,9 @@ region_model::get_gassign_result (const gassign *assign, || op == RDIV_EXPR || op == EXACT_DIV_EXPR)) { - if (const tree rhs2_cst = rhs2_sval->maybe_get_constant ()) - if (zerop (rhs2_cst)) + value_range rhs_vr; + if (rhs2_sval->maybe_get_value_range (rhs_vr)) + if (rhs_vr.zero_p ()) { /* Ideally we should issue a warning here; see PR analyzer/124217. */ diff --git a/gcc/testsuite/gcc.dg/analyzer/divide-by-zero-ice-pr124433.c b/gcc/testsuite/gcc.dg/analyzer/divide-by-zero-ice-pr124433.c new file mode 100644 index 00000000000..9b52ac8cc5b --- /dev/null +++ b/gcc/testsuite/gcc.dg/analyzer/divide-by-zero-ice-pr124433.c @@ -0,0 +1,9 @@ +unsigned m; +int c; + +void +foo() +{ + do c %= (5ull << 40) & m; + while (c); +}