X-Git-Url: http://andersk.mit.edu/gitweb/splint.git/blobdiff_plain/a779b61ede06125b00b12afe408f1ef829720862..73441cf5bc8a5de8673dd8652956875e14682944:/src/constraintExpr.c diff --git a/src/constraintExpr.c b/src/constraintExpr.c index f169832..0713302 100644 --- a/src/constraintExpr.c +++ b/src/constraintExpr.c @@ -1,8 +1,32 @@ +/* +** LCLint - annotation-assisted static program checker +** Copyright (C) 1994-2001 University of Virginia, +** Massachusetts Institute of Technology +** +** This program is free software; you can redistribute it and/or modify it +** under the terms of the GNU General Public License as published by the +** Free Software Foundation; either version 2 of the License, or (at your +** option) any later version. +** +** This program is distributed in the hope that it will be useful, but +** WITHOUT ANY WARRANTY; without even the implied warranty of +** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +** General Public License for more details. +** +** The GNU General Public License is available from http://www.gnu.org/ or +** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, +** MA 02111-1307, USA. +** +** For information on lclint: lclint-request@cs.virginia.edu +** To report a bug: lclint-bug@cs.virginia.edu +** For more information: http://lclint.cs.virginia.edu +*/ + /* ** constraintExpr.c */ -//#define DEBUGPRINT 1 +/* #define DEBUGPRINT 1 */ # include "lclintMacros.nf" # include "basic.h" @@ -12,9 +36,6 @@ # include "exprChecks.h" # include "exprNodeSList.h" -//# include "constraintExpr.h" - - /*@-czechfcns@*/ @@ -31,11 +52,10 @@ doSRefFixConstraintParamTerm (/*@only@*/ constraintExpr p_e, /*@temp@*/ /*@obser static /*@only@*/ constraintExpr doFixResultTerm (/*@only@*/ constraintExpr p_e, /*@exposed@*/ exprNode p_fcnCall) /*@modifies p_e@*/; - - - /*@special@*/ static constraintExpr constraintExpr_makeBinaryOp (void) ; /// @allocates result->data @ @sets result->kind @; - -//constraintExpr constraintExpr_makeMaxSetConstraintExpr (constraintExpr c); + + +/*@special@*/ static constraintExpr constraintExpr_makeBinaryOp (void) + /* @allocates result->data @ @sets result->kind @ */ ; void constraintExpr_free (/*@only@*/ constraintExpr expr) { @@ -145,14 +165,14 @@ static bool isZeroBinaryOp (constraintExpr expr) tempOp = constraintExprData_binaryExprGetOp (expr2->data); - if (op == PLUS) + if (op == BINARYOP_PLUS) op = tempOp; - else if (op == MINUS) + else if (op == BINARYOP_MINUS) { - if (tempOp == PLUS) - op = MINUS; - else if (tempOp == MINUS) - op = PLUS; + if (tempOp == BINARYOP_PLUS) + op = BINARYOP_MINUS; + else if (tempOp == BINARYOP_MINUS) + op = BINARYOP_PLUS; else BADEXIT; } @@ -188,7 +208,7 @@ static bool isZeroBinaryOp (constraintExpr expr) llassert (expr != NULL); - // we simplify unaryExpr else where + /* we simplify unaryExpr elsewhere */ if (expr->kind != binaryexpr) return expr; @@ -213,9 +233,9 @@ static bool isZeroBinaryOp (constraintExpr expr) *propagate = propagate1 || propagate2; - if (op == PLUS) + if (op == BINARYOP_PLUS) *literal = literal1 + literal2; - else if (op == MINUS) + else if (op == BINARYOP_MINUS) *literal = literal1 - literal2; else BADEXIT; @@ -232,9 +252,9 @@ static bool isZeroBinaryOp (constraintExpr expr) constraintExpr_free (expr1); constraintExpr_free (expr2); - if (op == PLUS ) + if (op == BINARYOP_PLUS ) return (constraintExpr_makeIntLiteral ( (t1+t2) )); - else if (op == MINUS) + else if (op == BINARYOP_MINUS) return (constraintExpr_makeIntLiteral ( (t1-t2) )); else BADEXIT; @@ -247,13 +267,13 @@ static bool isZeroBinaryOp (constraintExpr expr) *literal += constraintExpr_getValue (expr1); - if (op == PLUS) + if (op == BINARYOP_PLUS) { constraintExpr_free(expr1); constraintExpr_free(expr); return expr2; } - else if (op == MINUS) + else if (op == BINARYOP_MINUS) { constraintExpr temp; @@ -279,9 +299,9 @@ static bool isZeroBinaryOp (constraintExpr expr) { *propagate = TRUE; - if ( op == PLUS ) + if ( op == BINARYOP_PLUS ) *literal += constraintExpr_getValue (expr2); - else if (op == MINUS) + else if (op == BINARYOP_MINUS) *literal -= constraintExpr_getValue (expr2); else BADEXIT; @@ -423,10 +443,33 @@ constraintExpr constraintExpr_makeExprNode (exprNode e) ce2 = constraintExpr_makeExprNode (t2); ret = constraintExpr_parseMakeBinaryOp (ce1, tok, ce2); } - else + /* + drl 8-11-001 + + We handle expressions containing sizeof with the rule + (sizeof type ) * Expr = Expr + + This is the total wronge way to do this but... + it may be better than nothing + */ + else if (lltok_isMult(tok) ) { - ret = oldconstraintExpr_makeTermExprNode (e); + if ((t1->kind == XPR_SIZEOF) || (t1->kind == XPR_SIZEOFT) ) + { + ret = constraintExpr_makeExprNode(t2); + } + else if ((t2->kind == XPR_SIZEOF) || (t2->kind == XPR_SIZEOFT) ) + { + ret = constraintExpr_makeExprNode(t1); + } + else + { + ret = oldconstraintExpr_makeTermExprNode (e); + } } + else + ret = oldconstraintExpr_makeTermExprNode (e); + break; case XPR_PARENS: t = exprData_getUopNode (data); @@ -472,9 +515,9 @@ constraintExpr constraintExpr_makeExprNode (exprNode e) return ret; } -/*@only@*/ constraintExpr constraintExpr_makeTermExprNode (/*@exposed@*/ exprNode e) +/*@only@*/ constraintExpr constraintExpr_makeTermExprNode (/*@exposed@*/ exprNode e) { - return oldconstraintExpr_makeTermExprNode(e); //constraintExpr_makeExprNode (e); + return oldconstraintExpr_makeTermExprNode(e); } static constraintExpr constraintExpr_makeTerm (/*@only@*/ constraintTerm t) @@ -519,11 +562,11 @@ constraintExpr constraintExpr_makeTermsRef (/*@temp@*/ sRef s) /*@-uniondef@*/ /*@-compdef@*/ - ret->data = constraintExprData_unaryExprSetExpr (ret->data, cexpr); - ret->data = constraintExprData_unaryExprSetOp (ret->data, UNARYOP_UNDEFINED); - + ret->data = constraintExprData_unaryExprSetExpr (ret->data, cexpr); + ret->data = constraintExprData_unaryExprSetOp (ret->data, UNARYOP_UNDEFINED); + return ret; - + /*@=compdef@*/ /*@=uniondef@*/ } @@ -627,6 +670,7 @@ constraintExpr constraintExpr_makeMaxReadExpr (exprNode expr) return ret; } +# if 0 /*@only@*/ /*@unused@*/ static constraintExpr constraintExpr_makeMinSetExpr (/*@exposed@*/ exprNode expr) { @@ -644,7 +688,7 @@ constraintExpr constraintExpr_makeMaxReadExpr (exprNode expr) ret->data = constraintExprData_unaryExprSetOp (ret->data, MINREAD); return ret; } - +# endif /*@only@*/ constraintExpr constraintExpr_makeValueExpr (/*@exposed@*/ exprNode expr) @@ -686,7 +730,6 @@ constraintExpr constraintExpr_makeValueInt (int i) ret->data->binaryOp.expr1 = constraintExpr_undefined; ret->data->binaryOp.expr2 = constraintExpr_undefined; - // ret->data = constraintExprData_binaryExprSetOp (ret->data, BINARYOP_UNDEFINED); return ret; } @@ -709,9 +752,9 @@ constraintExpr constraintExpr_parseMakeBinaryOp (/*@only@*/ constraintExpr expr1 constraintExpr ret; ret = constraintExpr_makeBinaryOpConstraintExpr (expr1, expr2); if (op.tok == TPLUS) - ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS); + ret->data = constraintExprData_binaryExprSetOp(ret->data, BINARYOP_PLUS); else if (op.tok == TMINUS) - ret->data = constraintExprData_binaryExprSetOp(ret->data, MINUS); + ret->data = constraintExprData_binaryExprSetOp(ret->data, BINARYOP_MINUS); else { llassert(FALSE); @@ -719,6 +762,7 @@ constraintExpr constraintExpr_parseMakeBinaryOp (/*@only@*/ constraintExpr expr1 return ret; } +# if 0 /*@only@*/ /*@unused@*/ static constraintExpr constraintExpr_makeBinaryOpExprNode (/*@exposed@*/ exprNode expr1, /*@exposed@*/ exprNode expr2) { @@ -729,6 +773,7 @@ constraintExpr constraintExpr_parseMakeBinaryOp (/*@only@*/ constraintExpr expr1 ret = constraintExpr_makeBinaryOpConstraintExpr(sub1, sub2); return ret; } +# endif static /*@only@*/ constraintExpr constraintExpr_makeBinaryOpConstraintExprIntLiteral (/*@only@*/ constraintExpr expr, int literal) @@ -738,7 +783,7 @@ constraintExpr constraintExpr_makeBinaryOpConstraintExprIntLiteral (/*@only@*/ c constExpr = constraintExpr_makeIntLiteral (literal); ret = constraintExpr_makeBinaryOpConstraintExpr (expr, constExpr); - ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS); + ret->data = constraintExprData_binaryExprSetOp(ret->data, BINARYOP_PLUS); return ret; } @@ -750,7 +795,7 @@ constraintExpr constraintExpr_makeDecConstraintExpr (/*@only@*/constraintExpr ex inc = constraintExpr_makeIntLiteral (1); ret = constraintExpr_makeBinaryOpConstraintExpr (expr, inc); - ret->data = constraintExprData_binaryExprSetOp(ret->data, MINUS); + ret->data = constraintExprData_binaryExprSetOp(ret->data, BINARYOP_MINUS); return ret; } @@ -762,7 +807,7 @@ constraintExpr constraintExpr_makeDecConstraintExpr (/*@only@*/constraintExpr ex DPRINTF ( (message ("Making subtract expression") ) ); ret = constraintExpr_makeBinaryOpConstraintExpr (expr, addent); - ret->data = constraintExprData_binaryExprSetOp (ret->data, MINUS); + ret->data = constraintExprData_binaryExprSetOp (ret->data, BINARYOP_MINUS); return ret; } @@ -776,7 +821,7 @@ constraintExpr addent) DPRINTF ( (message ("Doing addTerm simplification") ) ); ret = constraintExpr_makeBinaryOpConstraintExpr (expr, addent); - ret->data = constraintExprData_binaryExprSetOp (ret->data, PLUS); + ret->data = constraintExprData_binaryExprSetOp (ret->data, BINARYOP_PLUS); return ret; } @@ -789,7 +834,7 @@ constraintExpr constraintExpr_makeIncConstraintExpr (/*@only@*/ constraintExpr e inc = constraintExpr_makeIntLiteral (1); ret = constraintExpr_makeBinaryOpConstraintExpr (expr, inc); - ret->data = constraintExprData_binaryExprSetOp(ret->data, PLUS); + ret->data = constraintExprData_binaryExprSetOp(ret->data, BINARYOP_PLUS); return ret; } @@ -819,9 +864,9 @@ static cstring constraintExprBinaryOpKind_print (constraintExprBinaryOpKind op) switch (op) { - case PLUS: + case BINARYOP_PLUS: return message("+"); - case MINUS: + case BINARYOP_MINUS: return message("-"); default: @@ -1114,7 +1159,7 @@ static /*@only@*/ constraintExpr constraintExpr_simplifybinaryExpr (/*@only@*/co else { op = constraintExprData_binaryExprGetOp (c->data); - if (op == MINUS) + if (op == BINARYOP_MINUS) if (constraintExpr_similar(e1, e2) ) { constraintExpr_free(c); @@ -1150,23 +1195,23 @@ static /*@only@*/ constraintExpr constraintExpr_simplifybinaryExpr (/*@only@*/co expr1 = constraintExpr_copy(expr1); expr2 = constraintExpr_copy(expr2); -//drl possible problem : warning make sure this works - - lexpr->kind = expr1->kind; - free (lexpr->data); - - lexpr->data = copyExprData (expr1->data, expr1->kind); - constraintExpr_free(expr1); - - if (op == PLUS) - expr = constraintExpr_makeSubtractExpr (expr, expr2); - else if (op == MINUS) - expr = constraintExpr_makeAddExpr (expr, expr2); - else - BADEXIT; - - - return expr; + /* drl possible problem : warning make sure this works */ + + lexpr->kind = expr1->kind; + sfree (lexpr->data); + + lexpr->data = copyExprData (expr1->data, expr1->kind); + constraintExpr_free(expr1); + + if (op == BINARYOP_PLUS) + expr = constraintExpr_makeSubtractExpr (expr, expr2); + else if (op == BINARYOP_MINUS) + expr = constraintExpr_makeAddExpr (expr, expr2); + else + BADEXIT; + + + return expr; /* #warning this needs to be checked @@ -1190,7 +1235,6 @@ static /*@only@*/ constraintExpr constraintExpr_simplifyunaryExpr (/*@only@*/ co { return c; } - // pattern mxr ( var + const) = mxr(var) - const exp = constraintExprData_unaryExprGetExpr (c->data); exp = constraintExpr_copy(exp); @@ -1231,10 +1275,11 @@ static /*@only@*/ constraintExpr constraintExpr_simplifyunaryExpr (/*@only@*/ co BADEXIT; } - // slight Kludge to hanlde var [] = { , , }; - // type syntax I don't think this is sounds but it should be good - // enough. The C stanrad is very confusing about initialization - // -- DRL 7/25/01 + /* slight Kludge to hanlde var [] = { , , }; + ** type syntax I don't think this is sounds but it should be good + ** enough. The C stanrad is very confusing about initialization + ** -- DRL 7/25/01 + */ if (constraintTerm_isInitBlock(cterm) ) { @@ -1262,10 +1307,10 @@ static /*@only@*/ constraintExpr constraintExpr_simplifyunaryExpr (/*@only@*/ co return c; } - if (constraintExprData_binaryExprGetOp (exp->data) == PLUS ) + if (constraintExprData_binaryExprGetOp (exp->data) == BINARYOP_PLUS ) { - // if (constraintExpr_canGetValue (constraintExprData_binaryExprGetExpr2 (exp->data) ) ) + /* if (constraintExpr_canGetValue (constraintExprData_binaryExprGetExpr2 (exp->data) ) ) */ { constraintExpr temp, temp2;