/*
** 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
*/
# include "splintMacros.nf"
-# include "llbasic.h"
+# include "basic.h"
-# ifndef NOLCL
# include "usymtab_interface.h"
-# endif
-
# include "exprChecks.h"
# include "filelocStack.h"
-# include "fileIdList.h"
# include "llmain.h"
# include "intSet.h"
# include "osd.h"
-# include "portab.h"
extern /*@external@*/ int yydebug;
extern /*@external@*/ int mtdebug;
typedef struct
{
cstring file;
- typeIdSet daccess ;
+ typeIdSet daccess;
} maccesst;
typedef enum {
clause inclause;
int numerrors;
+ int numbugs;
filelocStack locstack;
fileTable ftab;
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. */
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
{
gc.kind = CX_GLOBAL;
}
-# ifndef NOLCL
void
context_enterLCLfile (void)
{
gc.kind = CX_LCL;
gc.facct = typeIdSet_emptySet ();
}
-# endif
static void
addModuleAccess (/*@only@*/ cstring fname, typeIdSet mods)
addModuleAccess (cstring_copy (fname), typeIdSet_single (t));
}
-# ifndef NOLCL
void
context_exitLCLfile (void)
{
gc.kind = CX_GLOBAL;
gc.facct = typeIdSet_emptySet ();
}
-# endif
void
context_dumpModuleAccess (FILE *fout)
val = DEFAULT_LINELEN; break;
case FLG_INDENTSPACES:
val = DEFAULT_INDENTSPACES; break;
+ case FLG_LOCINDENTSPACES:
+ val = DEFAULT_LOCINDENTSPACES; break;
case FLG_EXTERNALNAMELEN:
val = ISO99_EXTERNALNAMELEN; break;
case FLG_INTERNALNAMELEN:
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:
** 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;
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;
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; */
gc.flags[FLG_SHOWFUNC] = TRUE;
gc.flags[FLG_SUPCOUNTS] = TRUE;
gc.flags[FLG_HINTS] = TRUE;
gc.flags[FLG_TYPE] = TRUE;
gc.flags[FLG_INCOMPLETETYPE] = TRUE;
gc.flags[FLG_ABSTRACT] = TRUE;
+ gc.flags[FLG_NUMABSTRACT] = TRUE;
gc.flags[FLG_ITERBALANCE] = TRUE;
gc.flags[FLG_ITERYIELD] = TRUE;
gc.flags[FLG_DUPLICATECASES] = TRUE;
*/
/* commenting ou until some output issues are fixed */
- /* gc.flags[FLG_ORCONSTRAINT] = TRUE;*/
+ gc.flags[FLG_ORCONSTRAINT] = TRUE;
gc.flags[FLG_CONSTRAINTLOCATION] = TRUE;
flagcode modeflags[] =
{
FLG_ENUMINT, FLG_MACROMATCHNAME,
- FLG_STRINGLITNOROOM,
+ FLG_STRINGLITNOROOM,
FLG_STRINGLITNOROOMFINALNULL,
FLG_MACROUNDEF, FLG_RELAXQUALS,
FLG_USEALLGLOBS, FLG_CHECKSTRICTGLOBALS,
FLG_UNSIGNEDCOMPARE,
FLG_PARAMUNUSED, FLG_VARUNUSED, FLG_FUNCUNUSED,
FLG_TYPEUNUSED,
+ FLG_ABSTRACTCOMPARE,
FLG_CONSTUNUSED, FLG_ENUMMEMUNUSED, FLG_FIELDUNUSED,
FLG_PTRNUMCOMPARE, FLG_BOOLCOMPARE, FLG_UNSIGNEDCOMPARE,
FLG_MUTREP, FLG_NOEFFECT, FLG_IMPTYPE,
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,
FLG_UNKNOWNTRANS,
FLG_KEEPTRANS,
FLG_IMMEDIATETRANS,
-
+ FLG_NUMABSTRACTCAST,
FLG_EXPORTLOCAL,
FLG_USERELEASED, FLG_ALIASUNIQUE, FLG_MAYALIASUNIQUE,
{
flagcode modeflags[] =
{
- FLG_BOOLINT, FLG_CHARINT, FLG_FLOATDOUBLE,
+ 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,
FLG_VARUNUSED, FLG_FUNCUNUSED,
FLG_TYPEUNUSED,
FLG_CHECKSTRICTGLOBALS, FLG_MACROMATCHNAME,
{
flagcode modeflags[] =
{
- FLG_EXPORTLOCAL, FLG_IMPTYPE,
+ FLG_EXPORTLOCAL, FLG_IMPTYPE,
+ FLG_NUMABSTRACTCAST,
+ FLG_ABSTRACTCOMPARE,
FLG_STATETRANSFER, FLG_STATEMERGE,
FLG_CHECKSTRICTGLOBALIAS,
FLG_CHECKEDGLOBALIAS,
FLG_SPECUNDEF, FLG_IMPCHECKMODINTERNALS,
FLG_DECLUNDEF, FLG_INCONDEFS, FLG_INCONDEFSLIB,
FLG_MISPLACEDSHAREQUAL, FLG_REDUNDANTSHAREQUAL,
+ FLG_NUMABSTRACTPRINT,
FLG_MATCHFIELDS,
FLG_MACROPARAMS,
FLG_MACROASSIGN,
FLG_NULLSTATE, FLG_NULLDEREF, FLG_NULLASSIGN,
FLG_NULLPASS, FLG_NULLRET,
+ FLG_ALLOCMISMATCH,
FLG_COMPDEF, FLG_COMPMEMPASS, FLG_UNIONDEF, FLG_RETSTACK,
{
flagcode modeflags[] =
{
- FLG_CHECKSTRICTGLOBALIAS,
+ FLG_ABSTRACTCOMPARE,
+ FLG_CHECKSTRICTGLOBALIAS,
+ FLG_NUMABSTRACTCAST,
FLG_CHECKEDGLOBALIAS,
FLG_CHECKMODGLOBALIAS,
FLG_UNCHECKEDGLOBALIAS,
FLG_MODFILESYSTEM,
FLG_MACROMATCHNAME,
FLG_FORMATCONST,
+ FLG_NUMABSTRACTPRINT,
FLG_STRINGLITNOROOM,
FLG_STRINGLITNOROOMFINALNULL,
FLG_STRINGLITSMALLER,
/* 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,
void context_enterAndClause (exprNode e)
{
-
+ DPRINTF (("enter and clause: %s", exprNode_unparse (e)));
usymtab_trueBranch (guardSet_copy (exprNode_getGuards (e)));
pushClause (ANDCLAUSE);
}
sRef_enterFunctionScope ();
}
-bool context_inOldSytleScope(void)
+bool context_inOldStyleScope(void)
{
- if (gc.kind == CX_OLDSTYLESCOPE)
- return TRUE;
- else
- return FALSE;
+ return (gc.kind == CX_OLDSTYLESCOPE);
}
void
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);
}
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:
if (cstring_lastChar (tval) != '\"')
{
- int n = cstring_length (tval) - 1;
+ int n = size_toInt (cstring_length (tval) - 1);
while (isspace ((int) cstring_getChar (tval, size_fromInt (n))))
{
{
; /* Okay not handle everything in this switch */
}
+ /*@-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) == '\"')
{
llerror_flagWarning (message
- ("setting %s to string beginning with \". You probably "
+ ("Setting %s to string beginning with \". You probably "
"don't meant to have the \"'s.",
flagcode_unparse (flag)));
}
gc.numerrors = 0;
}
+void
+context_recordBug (void)
+{
+ gc.numbugs++;
+}
+
+int
+context_numBugs (void)
+{
+ return gc.numbugs;
+}
+
void context_initMod (void)
/*@globals undef gc; @*/
{
gc.instandardlib = FALSE;
gc.numerrors = 0;
+ gc.numbugs = 0;
gc.neednl = FALSE;
gc.linesprocessed = 0;
gc.speclinesprocessed = 0;
void
context_userSetFlag (flagcode f, bool b)
{
- DPRINTF (("set flag: %s", flagcode_unparse (f)));
+ DPRINTF (("set flag: %s / %s",
+ flagcode_unparse (f),
+ bool_unparse (context_getFlag (f))));
if (f == FLG_NEVERINCLUDE && b)
{
{
llerror_flagWarning
(cstring_makeLiteral
- ("setting +neverinclude after +exportheader. "
+ ("Setting +neverinclude after +exportheader. "
"Turning off exportheader, since headers are not checked "
"when +neverinclude is used."));
{
llerror_flagWarning
(cstring_makeLiteral
- ("setting +exportheader after +neverinclude. "
+ ("Setting +exportheader after +neverinclude. "
"Not setting exportheader, since headers are not checked "
"when +neverinclude is used."));
gc.flags[FLG_EXPORTHEADER] = FALSE;
&& !flagcode_hasArgument (f))
{
llerror_flagWarning
- (message ("setting %s%s redundant with current value",
+ (message ("Setting %s%s redundant with current value",
cstring_makeLiteralTemp (b ? "+" : "-"),
flagcode_unparse (f)));
}
if (!context_getFlag (FLG_WARNUSE))
{
llerror_flagWarning
- (message ("flag +%s is canceled by -warnuse",
+ (message ("Flag +%s is canceled by -warnuse",
flagcode_unparse (f)));
}
}
&& gc.library != f)
{
llerror_flagWarning
- (message ("selecting library %s after library %s was "
+ (message ("Selecting library %s after library %s was "
"selected (only one library may be used)",
flagcode_unparse (f),
flagcode_unparse (gc.library)));
{
llerror_flagWarning
(cstring_makeLiteral
- ("selecting unix library. Unix library is "
- "ad hoc addition to POSIX library. Recommend "
- "use +posixlib to select POSIX library instead. "
+ ("Selecting unix library. Unix library is "
+ "based on the Single Unix Specification, Version 2. Not all "
+ "Unix implementations are consistend with this specification. "
"Use -warnunixlib to suppress this message."));
}
}
{
llerror_flagWarning
(message
- ("setting +%s will not produce warnings with -namechecks. "
+ ("Setting +%s will not produce warnings with -namechecks. "
"Must set +namechecks also.",
flagcode_unparse (f)));
}
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);
context_destroyMod (void)
/*@globals killed gc@*/
{
+ int i;
setCodePoint ();
ctype_destroyMod ();
+ /*
setCodePoint ();
usymtab_free ();
setCodePoint ();
+ */
+
fileTable_free (gc.ftab);
+ gc.ftab = fileTable_undefined;
+
filelocStack_free (gc.locstack);
setCodePoint ();
- gc.ftab = fileTable_undefined;
macrocache_free (gc.mc);
+
+ /* evans 2002-07-12: not reported because of reldef */
+ for (i = 0; i < gc.nmods; i++)
+ {
+ cstring_free (gc.moduleaccess[i].file);
+ }
+
sfree (gc.moduleaccess);
setCodePoint ();
}
/*
-** Flag shortcuts.
+** Flag shortcuts
*/
bool context_msgBoolInt (void)
{
- return gc.flags [FLG_BOOLINT];
+ return context_flagOn (FLG_BOOLINT, g_currentloc);
}
bool context_msgCharInt (void)
{
- return gc.flags [FLG_CHARINT];
+ return context_flagOn (FLG_CHARINT, g_currentloc);
}
bool context_msgEnumInt (void)
{
- return gc.flags [FLG_ENUMINT];
+ return context_flagOn (FLG_ENUMINT, g_currentloc);
+}
+
+bool context_msgLongInt (void)
+{
+ return context_flagOn (FLG_LONGINT, g_currentloc);
+}
+
+bool context_msgShortInt (void)
+{
+ return context_flagOn (FLG_SHORTINT, g_currentloc);
}
bool context_msgPointerArith (void)
{
- return gc.flags [FLG_POINTERARITH];
+ return context_flagOn (FLG_POINTERARITH, g_currentloc);
}
bool context_msgStrictOps (void)
{
- return gc.flags [FLG_STRICTOPS];
+ return context_flagOn (FLG_STRICTOPS, g_currentloc);
}
-# ifndef NOLCL
bool context_msgLh (void)
{
return gc.flags [FLG_DOLH];
}
-# endif
void context_pushLoc (void)
{
return (context_getValue (FLG_EXPECT));
}
-# ifndef NOLCL
int context_getLCLExpect (void)
{
return (context_getValue (FLG_LCLEXPECT));
}
-# endif
int context_getLimit (void)
{
return context_getString (FLG_MERGE);
}
-# ifndef NOLCL
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);
{
gc.inimport = FALSE;
}
-# endif
bool context_inMacro (void)
{
return (gc.speclinesprocessed);
}
-# ifndef NOLCL
void context_processedSpecLine (void)
{
gc.speclinesprocessed++;
void context_resetSpecLines (void)
{
gc.speclinesprocessed = 0;
+
}
-# endif
bool context_inGlobalContext (void)
{
/*@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);
}
}
}
}
-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)
(res,
cstring_copy (metaStateInfo_getName (msi)),
stateValue_createImplicit (metaStateInfo_getDefaultValue (msi, s),
- stateInfo_copy (sinfo)));
+ stateInfo_copy (info)));
}
else
{
}
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@*/
+constraintList context_getImplicitFcnConstraints (uentry ue)
{
- return lastStruct;
-}
-
-
-/*@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 ;
-};
-
-
-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
-*/
-
-/*
-void setGlobalStructInfo(ctype ct, constraintList list)
-{
- 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;
-
- / *abstraction violation fix it * /
- globalStructInfo.t = dmalloc(f->nelements * sizeof(struct getUe) );
-
- globalStructInfo.ngetUe = f->nelements;
-
- i = 0;
+ DPRINTF (("setImplicitfcnConstraints doing: %s", uentry_unparse(el)));
- 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;
- }
-}
-
-*/
-
-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;
}
+