Browse Source

Let runtime crash on zero div, don't fold it.

Remarks from Quentin:

It is an important decision to use Bot
and not Top as the result of 'x / 0'.
By using Bot, we refuse to give a warrant
to the compiler that would allow meaningless
subsequent decisions.  An example follows.

Clang, on my computer, will build a program
which prints "Ho" when fed the following C:

    int main()
    { puts(1/0 ? "Hi" : "Ho"); }

On the other hand, a C compiler based on
QBE will build a program which crashes,
as one would expect.

See also
https://c9x.me/notes/2014-09-10.html
Andrew Chambers 6 years ago
parent
commit
c043227bf7
1 changed files with 1 additions and 1 deletions
  1. 1 1
      fold.c

+ 1 - 1
fold.c

@@ -500,7 +500,7 @@ opfold(int op, int cls, Con *cl, Con *cr, Fn *fn)
 
 
 	if ((op == Odiv || op == Oudiv
 	if ((op == Odiv || op == Oudiv
 	|| op == Orem || op == Ourem) && czero(cr, KWIDE(cls)))
 	|| op == Orem || op == Ourem) && czero(cr, KWIDE(cls)))
-		err("null divisor in '%s'", optab[op].name);
+		return Bot;
 	if (cls == Kw || cls == Kl) {
 	if (cls == Kw || cls == Kl) {
 		if (foldint(&c, op, cls == Kl, cl, cr))
 		if (foldint(&c, op, cls == Kl, cl, cr))
 			return Bot;
 			return Bot;