X-Git-Url: http://andersk.mit.edu/gitweb/splint.git/blobdiff_plain/16c024b587f5ddc115928d5cca7095508aa208d9..6ee276d286314ab6807ce1af746bbd88c186fddc:/src/context.c diff --git a/src/context.c b/src/context.c index 053a86e..0f1906b 100644 --- a/src/context.c +++ b/src/context.c @@ -1,6 +1,6 @@ /* ** Splint - annotation-assisted static program checker -** Copyright (C) 1994-2002 University of Virginia, +** Copyright (C) 1994-2003 University of Virginia, ** Massachusetts Institute of Technology ** ** This program is free software; you can redistribute it and/or modify it @@ -34,7 +34,7 @@ */ # include "splintMacros.nf" -# include "llbasic.h" +# include "basic.h" # include "usymtab_interface.h" # include "exprChecks.h" @@ -42,7 +42,6 @@ # include "llmain.h" # include "intSet.h" # include "osd.h" -# include "portab.h" extern /*@external@*/ int yydebug; extern /*@external@*/ int mtdebug; @@ -103,6 +102,7 @@ static struct clause inclause; int numerrors; + int numbugs; filelocStack locstack; fileTable ftab; @@ -143,7 +143,7 @@ static struct int counters[NUMVALUEFLAGS]; o_cstring strings[NUMSTRINGFLAGS]; - sRefSetList modrecs; /*@i32 ???? what is this for? */ + sRefSetList modrecs; /* Keep track of file static symbols modified. */ metaStateTable stateTable; /* User-defined state information. */ annotationTable annotTable; /* User-defined annotations table. */ @@ -340,7 +340,7 @@ context_suppressFlagMsg (flagcode flag, fileloc fl) return (!context_getFlag (flag) || context_inSuppressRegion () || context_inSuppressZone (fl) - || (/*@!@@#@ gc.inDerivedFile && */ context_inSuppressFlagZone (fl, flag))); + || (context_inSuppressFlagZone (fl, flag))); /* removed gc.inDerivedFile from this */ } else { @@ -808,9 +808,9 @@ context_resetAllFlags (void) case FLG_BOOLTYPE: val = cstring_makeLiteral (DEFAULT_BOOLTYPE); break; case FLG_BOOLFALSE: - val = cstring_makeLiteral ("FALSE"); break; + val = cstring_makeLiteral ("false"); break; case FLG_BOOLTRUE: - val = cstring_makeLiteral ("TRUE"); break; + val = cstring_makeLiteral ("true"); break; case FLG_MACROVARPREFIX: val = cstring_makeLiteral ("m_"); break; case FLG_SYSTEMDIRS: @@ -831,10 +831,9 @@ context_resetAllFlags (void) ** These flags are true by default. */ - /*@i34 move this into flags.def */ + /* eventually, move this into flags.def */ gc.flags[FLG_STREAMOVERWRITE] = TRUE; - gc.flags[FLG_OBVIOUSLOOPEXEC] = TRUE; gc.flags[FLG_MODIFIES] = TRUE; gc.flags[FLG_NESTCOMMENT] = TRUE; @@ -842,6 +841,7 @@ context_resetAllFlags (void) gc.flags[FLG_FULLINITBLOCK] = TRUE; gc.flags[FLG_INITSIZE] = TRUE; gc.flags[FLG_INITALLELEMENTS] = TRUE; + gc.flags[FLG_NULLINIT] = TRUE; gc.flags[FLG_STRINGLITTOOLONG] = TRUE; @@ -884,7 +884,7 @@ context_resetAllFlags (void) gc.flags[FLG_WARNFLAGS] = TRUE; gc.flags[FLG_WARNRC] = TRUE; gc.flags[FLG_FILEEXTENSIONS] = TRUE; - gc.flags[FLG_WARNUNIXLIB] = TRUE; + gc.flags[FLG_WARNUNIXLIB] = FALSE; gc.flags[FLG_WARNPOSIX] = TRUE; gc.flags[FLG_SHOWCOL] = TRUE; gc.flags[FLG_SHOWDEEPHISTORY] = FALSE; /* TRUE; */ @@ -935,7 +935,7 @@ context_resetAllFlags (void) ** On by default for Win32, but not Unix */ -# ifdef WIN32 +# if defined (WIN32) || defined (OS2) gc.flags[FLG_PARENFILEFORMAT] = TRUE; gc.flags[FLG_CASEINSENSITIVEFILENAMES] = TRUE; # endif @@ -1060,10 +1060,12 @@ context_setModeAux (cstring s, bool warn) FLG_NESTEDEXTERN, FLG_NUMLITERAL, FLG_ZEROBOOL, + /* memchecks flags */ FLG_NULLDEREF, FLG_NULLSTATE, FLG_NULLASSIGN, FLG_NULLPASS, FLG_NULLRET, + FLG_ALLOCMISMATCH, FLG_COMPDEF, FLG_COMPMEMPASS, FLG_UNIONDEF, FLG_RETSTACK, @@ -1116,7 +1118,7 @@ context_setModeAux (cstring s, bool warn) { FLG_BOOLINT, FLG_CHARINT, FLG_FLOATDOUBLE, FLG_LONGINT, FLG_SHORTINT, FLG_ENUMINT, FLG_RELAXQUALS, FLG_FORWARDDECL, - FLG_CHARINDEX, FLG_ABSTVOIDP, FLG_USEALLGLOBS, + FLG_CHARINDEX, FLG_NUMABSTRACTINDEX, FLG_ABSTVOIDP, FLG_USEALLGLOBS, FLG_CHARUNSIGNEDCHAR, FLG_PREDBOOLOTHERS, FLG_NUMABSTRACTLIT, @@ -1171,6 +1173,7 @@ context_setModeAux (cstring s, bool warn) FLG_SPECUNDEF, FLG_IMPCHECKMODINTERNALS, FLG_DECLUNDEF, FLG_INCONDEFS, FLG_INCONDEFSLIB, FLG_MISPLACEDSHAREQUAL, FLG_REDUNDANTSHAREQUAL, + FLG_NUMABSTRACTPRINT, FLG_MATCHFIELDS, FLG_MACROPARAMS, FLG_MACROASSIGN, @@ -1195,6 +1198,7 @@ context_setModeAux (cstring s, bool warn) FLG_NULLSTATE, FLG_NULLDEREF, FLG_NULLASSIGN, FLG_NULLPASS, FLG_NULLRET, + FLG_ALLOCMISMATCH, FLG_COMPDEF, FLG_COMPMEMPASS, FLG_UNIONDEF, FLG_RETSTACK, @@ -1252,6 +1256,7 @@ context_setModeAux (cstring s, bool warn) FLG_MODFILESYSTEM, FLG_MACROMATCHNAME, FLG_FORMATCONST, + FLG_NUMABSTRACTPRINT, FLG_STRINGLITNOROOM, FLG_STRINGLITNOROOMFINALNULL, FLG_STRINGLITSMALLER, @@ -1310,9 +1315,14 @@ context_setModeAux (cstring s, bool warn) /* memchecks flags */ FLG_NULLSTATE, FLG_NULLDEREF, FLG_NULLASSIGN, FLG_NULLPASS, FLG_NULLRET, - + FLG_ALLOCMISMATCH, FLG_COMPDEF, FLG_COMPMEMPASS, FLG_UNIONDEF, + /* memory checking flags */ + FLG_BOUNDSREAD, FLG_BOUNDSWRITE, + FLG_LIKELYBOUNDSREAD, FLG_LIKELYBOUNDSWRITE, + FLG_CHECKPOST, + /* memtrans flags */ FLG_EXPOSETRANS, FLG_OBSERVERTRANS, @@ -1569,7 +1579,7 @@ context_enterUnknownMacro (/*@dependent@*/ uentry e) void context_enterAndClause (exprNode e) { - + DPRINTF (("enter and clause: %s", exprNode_unparse (e))); usymtab_trueBranch (guardSet_copy (exprNode_getGuards (e))); pushClause (ANDCLAUSE); } @@ -2298,8 +2308,7 @@ static void context_exitClauseAux (exprNode pred, exprNode tbranch) { context_setJustPopped (); - /*@i32 was makeAlt */ - usymtab_popTrueBranch (pred, tbranch, gc.inclause); + usymtab_popTrueBranch (pred, tbranch, gc.inclause); /* evans 2003-02-02?: was makeAlt */ clauseStack_pop (gc.clauses); gc.inclause = topClause (gc.clauses); } @@ -2897,20 +2906,6 @@ context_setString (flagcode flag, cstring val) switch (flag) { - /* - case FLG_BOOLTRUE: - usymtab_supGlobalEntry - (uentry_makeConstantValue (val, ctype_bool, - fileloc_getBuiltin (), TRUE, - multiVal_makeInt (1))); - break; - case FLG_BOOLFALSE: - usymtab_supGlobalEntry - (uentry_makeConstantValue (val, ctype_bool, - fileloc_getBuiltin (), FALSE, - multiVal_makeInt (0))); - break; - */ case FLG_MESSAGESTREAM: case FLG_WARNINGSTREAM: case FLG_ERRORSTREAM: @@ -3023,8 +3018,10 @@ context_setString (flagcode flag, cstring val) { ; /* Okay not handle everything in this switch */ } - /*@i523@*/ } /* evans 2002-03-24: splintme reports a spurious (I think) warning here...need to look into it */ - + /*@-branchstate@*/ + } /* evans 2002-03-24: splintme reports a spurious (I think) warning here...need to look into it */ + /*@=branchstate@*/ + if (cstring_length (val) >= 1 && cstring_firstChar (val) == '\"') { @@ -3058,6 +3055,18 @@ context_resetErrors (void) gc.numerrors = 0; } +void +context_recordBug (void) +{ + gc.numbugs++; +} + +int +context_numBugs (void) +{ + return gc.numbugs; +} + void context_initMod (void) /*@globals undef gc; @*/ { @@ -3068,6 +3077,7 @@ void context_initMod (void) gc.instandardlib = FALSE; gc.numerrors = 0; + gc.numbugs = 0; gc.neednl = FALSE; gc.linesprocessed = 0; gc.speclinesprocessed = 0; @@ -3784,8 +3794,8 @@ context_userSetFlag (flagcode f, bool b) llerror_flagWarning (cstring_makeLiteral ("Selecting unix library. Unix library is " - "ad hoc addition to POSIX library. Recommend " - "use +posixlib to select POSIX library instead. " + "based on the Single Unix Specification, Version 2. Not all " + "Unix implementations are consistend with this specification. " "Use -warnunixlib to suppress this message.")); } } @@ -4140,11 +4150,24 @@ context_setFlagAux (flagcode f, bool b, bool inFile, DOSET (FLG_ALLMACROS, b); DOSET (FLG_FCNMACROS, b); DOSET (FLG_CONSTMACROS, b); - break; + break; case FLG_BOUNDS: DOSET (FLG_BOUNDSREAD, b); DOSET (FLG_BOUNDSWRITE, b); + DOSET (FLG_LIKELYBOUNDSREAD, b); + DOSET (FLG_LIKELYBOUNDSWRITE, b); break; + case FLG_BOUNDSREAD: + DOSET (FLG_LIKELYBOUNDSREAD, b); + break; + case FLG_BOUNDSWRITE: + DOSET (FLG_LIKELYBOUNDSWRITE, b); + break; + case FLG_LIKELYBOUNDS: + DOSET (FLG_LIKELYBOUNDSREAD, b); + DOSET (FLG_LIKELYBOUNDSWRITE, b); + break; + case FLG_CZECH: if (b) { DOSET (FLG_ACCESSCZECH, b); } DOSET (FLG_CZECHFUNCTIONS, b); @@ -4373,8 +4396,6 @@ context_destroyMod (void) globSet_free (gc.globs_used); metaStateTable_free (gc.stateTable); annotationTable_free (gc.annotTable); - - } /* @@ -4589,6 +4610,29 @@ bool context_inLCLLib (void) return (gc.kind == CX_LCLLIB); } + +/*drl add these 3/5/2003*/ +static bool inSizeof = FALSE; + +bool context_inSizeof (void) +{ + return (inSizeof); +} + +void context_enterSizeof (void) +{ + DPRINTF((message("context_enterSizeof ") ) ); + inSizeof = TRUE; +} + +void context_leaveSizeof (void) +{ + DPRINTF((message("context_leaveSizeof ") )); + inSizeof = FALSE; +} +/*end function added 3/5/2003*/ + + bool context_inImport (void) { return (gc.inimport); @@ -4773,27 +4817,23 @@ metaStateInfo context_lookupMetaStateInfo (cstring key) /*@null@*/ annotationInfo context_lookupAnnotation (cstring annot) { - annotationInfo ainfo; - - ainfo = annotationTable_lookup (gc.annotTable, annot); - - return ainfo; + return annotationTable_lookup (gc.annotTable, annot); } -void context_addAnnotation (annotationInfo ainfo) +void context_addAnnotation (annotationInfo info) { - if (annotationTable_contains (gc.annotTable, annotationInfo_getName (ainfo))) + if (annotationTable_contains (gc.annotTable, annotationInfo_getName (info))) { voptgenerror (FLG_SYNTAX, - message ("Duplicate annotation declaration: %s", annotationInfo_getName (ainfo)), - annotationInfo_getLoc (ainfo)); + message ("Duplicate annotation declaration: %s", annotationInfo_getName (info)), + annotationInfo_getLoc (info)); - annotationInfo_free (ainfo); + annotationInfo_free (info); } else { - annotationTable_insert (gc.annotTable, ainfo); + annotationTable_insert (gc.annotTable, info); } } @@ -4815,12 +4855,12 @@ void context_addMetaState (cstring mname, metaStateInfo msinfo) } } -valueTable context_createValueTable (sRef s, stateInfo sinfo) +valueTable context_createValueTable (sRef s, stateInfo info) { if (metaStateTable_size (gc.stateTable) > 0) { valueTable res = valueTable_create (metaStateTable_size (gc.stateTable)); - /*@i32 should use smaller value... */ + /* should use smaller value... */ DPRINTF (("Value table for: %s", sRef_unparse (s))); metaStateTable_elements (gc.stateTable, msname, msi) @@ -4836,7 +4876,7 @@ valueTable context_createValueTable (sRef s, stateInfo sinfo) (res, cstring_copy (metaStateInfo_getName (msi)), stateValue_createImplicit (metaStateInfo_getDefaultValue (msi, s), - stateInfo_copy (sinfo))); + stateInfo_copy (info))); } else { @@ -4845,153 +4885,88 @@ valueTable context_createValueTable (sRef s, stateInfo sinfo) } end_metaStateTable_elements ; - stateInfo_free (sinfo); + stateInfo_free (info); DPRINTF (("Value table: %s", valueTable_unparse (res))); return res; } else { - stateInfo_free (sinfo); + stateInfo_free (info); return valueTable_undefined; } } -valueTable context_createGlobalMarkerValueTable (stateInfo sinfo) +valueTable context_createGlobalMarkerValueTable (stateInfo info) { if (metaStateTable_size (gc.stateTable) > 0) { valueTable res = valueTable_create (metaStateTable_size (gc.stateTable)); - /*@i32 should use smaller value... */ + /* should use smaller value... */ metaStateTable_elements (gc.stateTable, msname, msi) { - /*@i23 only add global...*/ + /* only add global...*/ DPRINTF (("Create: %s", metaStateInfo_unparse (msi))); llassert (cstring_equal (msname, metaStateInfo_getName (msi))); valueTable_insert (res, cstring_copy (metaStateInfo_getName (msi)), stateValue_create (metaStateInfo_getDefaultGlobalValue (msi), - stateInfo_copy (sinfo))); + stateInfo_copy (info))); } end_metaStateTable_elements ; - stateInfo_free (sinfo); + stateInfo_free (info); DPRINTF (("Value table: %s", valueTable_unparse (res))); return res; } else { - stateInfo_free (sinfo); + stateInfo_free (info); return valueTable_undefined; } } - -/*drl 12/30/01 these are some ugly functions that were added to facilitate struct annotations */ - - -/*drl added */ -static ctype lastStruct; - -ctype context_setLastStruct (/*@returned@*/ ctype s) /*@globals lastStruct@*/ -{ - lastStruct = s; - return s; -} - -ctype context_getLastStruct (/*@returned@*/ /*ctype s*/) /*@globals lastStruct@*/ -{ - return lastStruct; -} - -/* -** Why is this stuff in context.c? -*/ - -/*@unused@*/ static int sInfoNum = 0; - - -struct getUe { - /*@unused@*/ uentry ue; - /*@unused@*/ sRef s; -}; - -struct sInfo { - /*@unused@*/ ctype ct; - /*@unused@*/ constraintList inv; - /*@unused@*/ int ngetUe; - /*@unused@*/ struct getUe * t ; -}; - -/* unused: static struct sInfo globalStructInfo; */ - -/*drl 1/6/2001: I didn't think these functions were solid enough to include in the - stable release of splint. I coomented them out so that they won't break anything - but didn't delete them because they will be fixed and included later - - -*/ - -/*@-paramuse@*/ - -void context_setGlobalStructInfo(ctype ct, constraintList list) +constraintList context_getImplicitFcnConstraints (uentry ue) { -# if 0 - /* int i; - uentryList f; + constraintList ret = constraintList_makeNew (); + uentryList params = uentry_getParams (ue); - f = ctype_getFields (ct); - - if (constraintList_isDefined(list) ) + uentryList_elements (params, el) { - globalStructInfo.ct = ct; - globalStructInfo.inv = list; - - globalStructInfo.ngetUe = 0; + DPRINTF (("setImplicitfcnConstraints doing: %s", uentry_unparse(el))); - /* abstraction violation fix it * / - globalStructInfo.t = dmalloc(f->nelements * sizeof(struct getUe) ); - - globalStructInfo.ngetUe = f->nelements; - - i = 0; - - uentryList_elements(f, ue) + if (uentry_isElipsisMarker (el)) { - globalStructInfo.t[i].ue = ue; - globalStructInfo.t[i].s = uentry_getSref(ue); - TPRINTF(( message(" setGlobalStructInfo:: adding ue=%s and sRef=%s", - uentry_unparse(ue), sRef_unparse( uentry_getSref(ue) ) - ) - )); - i++; + ; } - end_uentryList_elements; - } - */ -# endif -} - -# if 0 -/* - -bool hasInvariants (ctype ct) /*@* / -{ - if ( ctype_sameName(globalStructInfo.ct, ct) ) + else + { + sRef s = uentry_getSref (el); + + DPRINTF (("Trying: %s", sRef_unparse (s))); - return TRUE; + if (ctype_isPointer (sRef_getType (s))) + { + constraint c = constraint_makeSRefWriteSafeInt (s, 0); + ret = constraintList_add (ret, c); + + /*drl 10/23/2002 added support for out*/ + + if (!uentry_isOut(el)) + { + c = constraint_makeSRefReadSafeInt (s, 0); + ret = constraintList_add (ret , c); + } + } + else + { + DPRINTF (("%s is NOT a pointer", sRef_unparseFull (s))); + } + } + } end_uentryList_elements; - else - - return FALSE; - + DPRINTF (("Returns ==> %s", constraintList_unparse (ret))); + return ret; } -*/ -# endif - -/*@=paramuse@*/ - - -