check_precedence: fix a segfault
authorDan Carpenter <dan.carpenter@oracle.com>
Thu, 1 Nov 2012 08:43:17 +0000 (1 11:43 +0300)
committerDan Carpenter <dan.carpenter@oracle.com>
Thu, 1 Nov 2012 08:43:17 +0000 (1 11:43 +0300)
This test should have been OK, but apparently there is a way to try make
this parse an expression struct which wasn't been initialized all the way.
What happened here is that I had a VALUE expression with the ->op set to
'!'.  In some ways, this fix is a hack, but in another way it is just
making the check more robust.

Here is the example program with triggered the bug.

enum {
       OST_FALSE = 0,
       OST_TRUE = (!OST_FALSE)
};

int test(void)
{
       int x = 0;
       if (OST_TRUE == x) {
       }
}

Reported-by: Pontus Fuchs <pontus.fuchs@gmail.com>
Signed-off-by: Dan Carpenter <dan.carpenter@oracle.com>
check_precedence.c

index 8c1ce5d..7ad719f 100644 (file)
@@ -54,7 +54,7 @@ static void match_condition(struct expression *expr)
        if (expr->type == EXPR_COMPARE) {
                if (expr->left->type == EXPR_COMPARE || expr->right->type == EXPR_COMPARE)
                        print = 1;
-               if (expr->left->op == '!') {
+               if (expr->left->type == EXPR_PREOP && expr->left->op == '!') {
                        if (expr->left->type == EXPR_PREOP && expr->left->unop->op == '!')
                                return;
                        if (expr->right->op == '!')