ref: c6c4762d155cc69863e1dd20176095bfebd901d1
parent: e81cd3b1b198c9b23885be41293d091485a50e4e
author: Roberto E. Vargas Caballero <k0ga@shike2.com>
date: Tue Feb 21 12:08:45 EST 2017
[cc1] Fix pcompare() with NULL operands Pcompare() was using eqtype() to see if the type of the operands were compatible, but this is an error because a null pointer can be compared to any pointer. For this reason the correct code must use convert() which currently deals with all the possible combinations
--- a/cc1/expr.c
+++ b/cc1/expr.c
@@ -351,23 +351,16 @@
static Node *
pcompare(int op, Node *lp, Node *rp)
{
- Node *np;
- int err = 0;
+ Node *np, *p;
if (lp->type->prop & TINTEGER)
XCHG(lp, rp, np);
+ else if (eqtype(lp->type, pvoidtype, 1))
+ XCHG(lp, rp, np);
- if (rp->type->prop & TINTEGER) {
- if (!cmpnode(rp, 0))
- err = 1;
- rp = convert(rp, pvoidtype, 1);
- } else if (rp->type->op == PTR) {
- if (!eqtype(lp->type, rp->type, 1))
- err = 1;
- } else {
- err = 1;
- }
- if (err)
+ if ((p = convert(rp, lp->type, 0)) != NULL)
+ rp = p;
+ else
errorp("incompatible types in comparison");
return node(op, inttype, lp, rp);
}
--- a/tests/execute/scc-tests.lst
+++ b/tests/execute/scc-tests.lst
@@ -105,3 +105,4 @@
0112-cond.c
0113-externredecl.c
0114-shortassig.c
+0115-null-comparision.c