X-Git-Url: http://andersk.mit.edu/gitweb/splint.git/blobdiff_plain/2e127cb83d8e599677e0b6b04635bc34ba874fa0..36250f225665415476f402c25e138d99fa18381b:/src/exprChecks.c diff --git a/src/exprChecks.c b/src/exprChecks.c index ce36b71..4b3b81d 100644 --- a/src/exprChecks.c +++ b/src/exprChecks.c @@ -17,15 +17,15 @@ ** 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 information on splint: info@splint.org +** To report a bug: splint-bug@splint.org ** For more information: http://www.splint.org */ /* ** exprChecks.c */ -# include "lclintMacros.nf" +# include "splintMacros.nf" # include "basic.h" # include "cgrammar.h" # include "cgrammar_tokens.h" @@ -52,11 +52,36 @@ static void checkSafeReturnExpr (/*@notnull@*/ exprNode p_e); ** */ +static int inCompoundStatementExpression = 0; + +void +exprChecks_inCompoundStatementExpression (void) +{ + inCompoundStatementExpression++; +} + +void +exprChecks_leaveCompoundStatementExpression (void) +{ + inCompoundStatementExpression--; + llassert (inCompoundStatementExpression >= 0); +} + void -exprNode_checkStatement (exprNode e) +exprChecks_checkStatementEffect (exprNode e) { bool hasError = FALSE; + if (inCompoundStatementExpression > 0) + { + /* + ** Okay to have effectless statments in compound statement expression (should check + ** it is the last statement, but we don't for now). + */ + + return; + } + if (!exprNode_isError (e)) { exprKind ek = e->kind; @@ -385,13 +410,13 @@ exprChecks_checkNullReturn (fileloc loc) if (ctype_isUnknown (tr)) { voptgenerror - (FLG_CONTROL, + (FLG_EMPTYRETURN, cstring_makeLiteral ("Empty return in function declared to implicitly return int"), loc); } else { - voptgenerror (FLG_CONTROL, + voptgenerror (FLG_EMPTYRETURN, message ("Empty return in function declared to return %t", tr), loc); } @@ -409,7 +434,7 @@ exprNode_checkReturn (exprNode e) { if (context_inMacro ()) { - llerror (FLG_CONTROL, + llerror (FLG_MACRORETURN, message ("Macro %s uses return (not functional)", context_inFunctionName ())); } @@ -913,17 +938,14 @@ void exprNode_checkFunctionBody (exprNode body) /*drl modified */ -void exprNode_checkFunction (/*@unused@*/ uentry ue, /*@only@*/ exprNode fcnBody) +void exprNode_checkFunction (/*@unused@*/ uentry ue, /*@only@*/ exprNode body) { constraintList c, t, post; constraintList c2, fix; constraintList implicitFcnConstraints; - - /*@owned@*/ exprNode body; - context_enterInnerContext (); - body = fcnBody; + llassert (exprNode_isDefined (body)); /* if we're not going to be printing any errors for buffer overflows @@ -933,129 +955,126 @@ void exprNode_checkFunction (/*@unused@*/ uentry ue, /*@only@*/ exprNode fcnBody in order to find potential problems like assert failures and seg faults... */ - if (!context_getFlag(FLG_DEBUGFUNCTIONCONSTRAINT) ) - /* check if errors will printed */ - if (! (context_getFlag(FLG_DEBUGFUNCTIONCONSTRAINT) || - context_getFlag(FLG_FUNCTIONCONSTRAINT) || - context_getFlag(FLG_ARRAYBOUNDS) || - context_getFlag(FLG_ARRAYBOUNDSREAD) || - context_getFlag(FLG_CHECKPOST) - ) - ) - { - exprNode_free (body); - context_exitInnerPlain(); - - return; - } + if (!context_getFlag(FLG_DEBUGFUNCTIONCONSTRAINT)) + { + /* check if errors will printed */ + if (!(context_getFlag(FLG_DEBUGFUNCTIONCONSTRAINT) || + context_getFlag(FLG_BOUNDSWRITE) || + context_getFlag(FLG_BOUNDSREAD) || + context_getFlag(FLG_CHECKPOST))) + { + exprNode_free (body); + context_exitInnerPlain(); + + return; + } + } - exprNode_generateConstraints (body); - + exprNode_generateConstraints (body); /* evans 2002-03-02: this should not be declared to take a + dependent... fix it! */ c = uentry_getFcnPreconditions (ue); DPRINTF(("function constraints\n")); DPRINTF (("\n\n\n\n\n\n\n")); - - if (constraintList_isDefined(c) ) - { - - DPRINTF ( (message ("Function preconditions are %s \n\n\n\n\n", constraintList_printDetailed (c) ) ) ); - - body->requiresConstraints = constraintList_reflectChangesFreePre (body->requiresConstraints, c); - - c2 = constraintList_copy (c); - fix = constraintList_makeFixedArrayConstraints (body->uses); - c2 = constraintList_reflectChangesFreePre (c2, fix); - constraintList_free(fix); - if ( context_getFlag (FLG_ORCONSTRAINT) ) - { - t = constraintList_reflectChangesOr (body->requiresConstraints, c2 ); - } - else - { - t = constraintList_reflectChanges(body->requiresConstraints, c2); - } - - constraintList_free(body->requiresConstraints); - DPRINTF ( (message ("The body has the required constraints: %s", constraintList_printDetailed (t) ) ) ); - - body->requiresConstraints = t; - - t = constraintList_mergeEnsures (c, body->ensuresConstraints); - constraintList_free(body->ensuresConstraints); - - body->ensuresConstraints = t; - - DPRINTF ( (message ("The body has the ensures constraints: %s", constraintList_printDetailed (t) ) ) ); - constraintList_free(c2); - } - - if (constraintList_isDefined(c) ) - { - DPRINTF((message ("The Function %s has the preconditions %s", uentry_unparse(ue), constraintList_printDetailed(c) ) ) ); - } - else - { - DPRINTF((message ("The Function %s has no preconditions", uentry_unparse(ue) ) ) ); - } - - implicitFcnConstraints = getImplicitFcnConstraints(); - - if (constraintList_isDefined(implicitFcnConstraints) ) - { - if (context_getFlag (FLG_IMPLICTCONSTRAINT) ) - { - body->requiresConstraints = constraintList_reflectChangesFreePre (body->requiresConstraints, implicitFcnConstraints ); - } - } - - body->requiresConstraints = constraintList_sort (body->requiresConstraints); - - constraintList_printError(body->requiresConstraints, g_currentloc); - - post = uentry_getFcnPostconditions (ue); + if (constraintList_isDefined(c) ) + { + DPRINTF ((message ("Function preconditions are %s \n\n\n\n\n", constraintList_printDetailed (c) ) ) ); + + body->requiresConstraints = constraintList_reflectChangesFreePre (body->requiresConstraints, c); + + c2 = constraintList_copy (c); + fix = constraintList_makeFixedArrayConstraints (body->uses); + c2 = constraintList_reflectChangesFreePre (c2, fix); + constraintList_free (fix); + + if (context_getFlag (FLG_ORCONSTRAINT)) + { + t = constraintList_reflectChangesOr (body->requiresConstraints, c2 ); + } + else + { + t = constraintList_reflectChanges(body->requiresConstraints, c2); + } + + constraintList_free (body->requiresConstraints); + DPRINTF ((message ("The body has the required constraints: %s", constraintList_printDetailed (t) ) ) ); + + body->requiresConstraints = t; + + t = constraintList_mergeEnsures (c, body->ensuresConstraints); + constraintList_free(body->ensuresConstraints); + + body->ensuresConstraints = t; + + DPRINTF ((message ("The body has the ensures constraints: %s", constraintList_printDetailed (t) ) ) ); + constraintList_free(c2); + } + + if (constraintList_isDefined(c)) + { + DPRINTF ((message ("The Function %s has the preconditions %s", + uentry_unparse(ue), constraintList_printDetailed(c)))); + } + else + { + DPRINTF((message ("The Function %s has no preconditions", uentry_unparse(ue)))); + } + + implicitFcnConstraints = getImplicitFcnConstraints(); + + if (constraintList_isDefined(implicitFcnConstraints) ) + { + if (context_getFlag (FLG_IMPLICTCONSTRAINT) ) + { + body->requiresConstraints = constraintList_reflectChangesFreePre (body->requiresConstraints, + implicitFcnConstraints ); + } + } + + body->requiresConstraints = constraintList_sort (body->requiresConstraints); + + constraintList_printError(body->requiresConstraints, g_currentloc); + + post = uentry_getFcnPostconditions (ue); + + if (context_getFlag (FLG_CHECKPOST)) + { + if (constraintList_isDefined (post)) + { + constraintList post2; + + DPRINTF ((message ("The declared function postconditions are %s \n\n\n\n\n", + constraintList_printDetailed (post) ) ) ); + + post = constraintList_reflectChangesFreePre (post, body->ensuresConstraints); + + post2 = constraintList_copy (post); + fix = constraintList_makeFixedArrayConstraints (body->uses); + post2 = constraintList_reflectChangesFreePre (post2, fix); + constraintList_free(fix); + if ( context_getFlag (FLG_ORCONSTRAINT) ) + { + t = constraintList_reflectChangesOr (post2, body->ensuresConstraints); + } + else + { + t = constraintList_reflectChanges(post2, body->ensuresConstraints); + } + + constraintList_free(post2); + constraintList_free(post); + post = t; - if ( context_getFlag (FLG_CHECKPOST) ) - { - if (constraintList_isDefined(post) ) - { - - constraintList post2; - - DPRINTF ( (message ("The declared function postconditions are %s \n\n\n\n\n", constraintList_printDetailed (post) ) ) ); - - post = constraintList_reflectChangesFreePre (post, body->ensuresConstraints); - - post2 = constraintList_copy (post); - fix = constraintList_makeFixedArrayConstraints (body->uses); - post2 = constraintList_reflectChangesFreePre (post2, fix); - constraintList_free(fix); - if ( context_getFlag (FLG_ORCONSTRAINT) ) - { - t = constraintList_reflectChangesOr (post2, body->ensuresConstraints); - } - else - { - t = constraintList_reflectChanges(post2, body->ensuresConstraints); - } - - constraintList_free(post2); - - constraintList_free(post); - post = t; - - - - printf("Unresolved post conditions\n"); - constraintList_printErrorPostConditions(post, g_currentloc); - } - } - - if (constraintList_isDefined(post) ) - { - constraintList_free(post); - } + printf("Unresolved post conditions\n"); + constraintList_printErrorPostConditions(post, g_currentloc); + } + } + + if (constraintList_isDefined (post)) + { + constraintList_free (post); + } body->ensuresConstraints = constraintList_sort(body->ensuresConstraints);