Handle fixed-point division by zero
authorTom Tromey <tromey@adacore.com>
Mon, 14 Dec 2020 14:35:45 +0000 (07:35 -0700)
committerTom Tromey <tromey@adacore.com>
Mon, 14 Dec 2020 14:35:45 +0000 (07:35 -0700)
fixed_point_binop did not account for division by zero.  This would
lead to gdb getting SIGFPE and subsequently cause some test cases to
hang.

gdb/ChangeLog
2020-12-14  Tom Tromey  <tromey@adacore.com>

* valarith.c (fixed_point_binop): Call error on division by zero.

gdb/testsuite/ChangeLog
2020-12-14  Tom Tromey  <tromey@adacore.com>

* gdb.dwarf2/dw2-fixed-point.exp: Add test for division by zero.

gdb/ChangeLog
gdb/testsuite/ChangeLog
gdb/testsuite/gdb.dwarf2/dw2-fixed-point.exp
gdb/valarith.c

index e6c572dc2f657d0c8e12f3f8dfbeab753242602f..4ac0acc362c45e96305ab97beea203cb0b95d892 100644 (file)
@@ -1,3 +1,7 @@
+2020-12-14  Tom Tromey  <tromey@adacore.com>
+
+       * valarith.c (fixed_point_binop): Call error on division by zero.
+
 2020-12-13  Tom Tromey  <tom@tromey.com>
 
        * gdbtypes.c (safe_parse_type): Make argument const.
index c33f0b29251939678a1bec064185aa1a7bfcb3ed..dba92927a6be0252a6f20f05238da1d3392b936f 100644 (file)
@@ -1,3 +1,7 @@
+2020-12-14  Tom Tromey  <tromey@adacore.com>
+
+       * gdb.dwarf2/dw2-fixed-point.exp: Add test for division by zero.
+
 2020-12-13  Tom de Vries  <tdevries@suse.de>
 
        PR testsuite/26953
index 67d1d34d8f3546f927b1f778924c64b893e7fff6..2c859d1fd16d9eb6697519a5db761e9e27b498b2 100644 (file)
@@ -164,6 +164,9 @@ gdb_test "print pck.fp3_var * 1" \
 gdb_test "print pck.fp3_var / pck.fp3_var" \
          " = 1"
 
+gdb_test "print pck.fp3_var / 0" \
+         "Division by zero"
+
 gdb_test "print pck.fp1_range_var - 0.5" \
          " = 0.5"
 
index 37988f1dfa7457515045e88e78ca9016c784e339..6854d9b80f0a331fb999c831416ffadfbc1b1c4a 100644 (file)
@@ -965,6 +965,8 @@ fixed_point_binop (struct value *arg1, struct value *arg2, enum exp_opcode op)
       break;
 
     case BINOP_DIV:
+      if (mpq_sgn (v2.val) == 0)
+       error (_("Division by zero"));
       mpq_div (res.val, v1.val, v2.val);
       val = fixed_point_to_value (res);
       break;