/*
** 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
** 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
*/
/*
** weird C syntax.
*/
-# include "lclintMacros.nf"
+# include "splintMacros.nf"
# include "basic.h"
# include "structNames.h"
# include "exprChecks.h"
# include "transferChecks.h"
+/* Needed to install macros when loading libraries */
+
+# include "cpplib.h"
+# include "cpperror.h"
+# include "cpphash.h"
+
/*
** Keep track of type definitions inside a function.
*/
static void refTable_free (/*@only@*/ /*@null@*/ refTable p_x, int p_nentries);
static ctype usymtab_suFieldsType (uentryList p_f, bool p_isStruct) /*@globals globtab@*/ ;
+static void usymtab_freeAux (/*@only@*/ usymtab p_u)
+ /*@globals globtab, utab, filetab@*/
+ /*@modifies p_u@*/ ;
+
extern int usymtab_getCurrentDepth (void) /*@globals utab@*/
{
return utab->lexlevel;
static /*@exposed@*/ /*@dependent@*/ uentry
usymtab_getRefTab (/*@notnull@*/ usymtab p_u, int p_level, usymId p_index);
-# ifdef __LCLINT__
+# ifdef S_SPLINT_S
/* These are not used anymore... */
static /*@unused@*/ /*@only@*/ cstring
usymtab_unparseLocalAux (/*@notnull@*/ usymtab p_s);
static /*@exposed@*/ /*@dependent@*/ uentry
usymtab_lookupQuietNoAlt (usymtab p_s, cstring p_k);
-static void usymtab_printAllAux (usymtab p_s) /*@modifies g_msgstream@*/ ;
-static int usymtab_getIndex (/*@notnull@*/ usymtab p_s, cstring p_k);
-static /*@exposed@*/ uentry usymtab_fetchIndex (/*@notnull@*/ usymtab p_s, int p_i);
-static /*@exposed@*/ uentry
- usymtab_lookupAux (usymtab p_s, cstring p_k);
-static /*@exposed@*/ /*@dependent@*/ /*@notnull@*/ usymtab
- usymtab_getFileTab (void) /*@globals filetab@*/ ;
-static int refTable_lookup (/*@notnull@*/ usymtab p_ut, int p_level, int p_index);
+static void usymtab_printAllAux (usymtab p_s) /*@modifies g_warningstream@*/ ;
+
+/*@function bool usymtab_indexFound (usymId) @*/
+# define usymtab_indexFound(u) ((u) != usymId_notfound)
+
+static usymId usymtab_getIndex (/*@notnull@*/ usymtab p_s, cstring p_k);
+static /*@exposed@*/ uentry usymtab_fetchIndex (/*@notnull@*/ usymtab p_s, usymId p_ui);
+static /*@exposed@*/ uentry usymtab_lookupAux (usymtab p_s, cstring p_k);
+
+static /*@exposed@*/ /*@dependent@*/ /*@notnull@*/
+ usymtab usymtab_getFileTab (void) /*@globals filetab@*/ ;
+
+static int refTable_lookup (/*@notnull@*/ usymtab p_ut, int p_level, usymId p_index);
static bool usymtab_mustBreak (usymtab p_s);
static bool usymtab_mustEscape (usymtab p_s);
uentryList_clear (functypes);
}
-static /*@falsenull@*/ bool usymtab_isBranch (usymtab u)
+static /*@falsewhennull@*/ bool usymtab_isBranch (usymtab u)
{
return (usymtab_isDefined (u) &&
(u->kind == US_TBRANCH || u->kind == US_FBRANCH
t->mustBreak = FALSE;
t->exitCode = XK_NEVERESCAPE;
-
+
+ DPRINTF (("Create usymtab [%p]", t));
return t;
}
oldtab = usymtab_undefined;
}
+void
+usymtab_destroyMod (void) /*@modifies utab, globtab, filetab@*/ /*@globals killed utab@*/
+{
+ DPRINTF (("Destroy usymtab [%p]: %d", utab, utab->nentries));
+ usymtab_freeAux (utab);
+ utab = usymtab_undefined;
+ /*@-globstate@*/
+} /*@=globstate@*/
void
usymtab_initGlobalMarker () /*@globals globtab@*/
void
usymtab_initBool ()
{
+ DPRINTF (("Init bool!"));
+
if (context_getFlag (FLG_NOLIB))
{
ctype boolt = ctype_bool;
/* evs 2000-07-24: bool is now treated as abstract (always) */
- uentry boolentry = uentry_makeBoolDatatype (YES);
+ uentry boolentry = uentry_makeBoolDatatype (qual_createAbstract ());
usymtab_supGlobalEntry (boolentry);
context_addBoolAccess ();
*/
usymtab_supGlobalEntry
- (uentry_makeConstantAux (context_getFalseName (), boolt,
- fileloc_getBuiltin (), FALSE,
- multiVal_makeInt (0)));
+ (uentry_makeConstantValue (context_getFalseName (), boolt,
+ fileloc_getBuiltin (), FALSE,
+ multiVal_makeInt (0)));
+
usymtab_supGlobalEntry
- (uentry_makeConstantAux (context_getTrueName (), boolt,
- fileloc_getBuiltin (), FALSE,
- multiVal_makeInt (1)));
+ (uentry_makeConstantValue (context_getTrueName (), boolt,
+ fileloc_getBuiltin (), FALSE,
+ multiVal_makeInt (1)));
}
}
}
else
{
- int thisentry = s->nentries;
+ usymId thisentry = usymId_fromInt (s->nentries);
if (uentry_isVar (e))
{
- uentry_setSref (e, sRef_makeCvar (globScope, thisentry,
- uentry_getType (e),
- stateInfo_makeLoc (uentry_whereLast (e))));
+ uentry_setSref
+ (e, sRef_makeCvar (globScope, thisentry,
+ uentry_getType (e),
+ stateInfo_makeLoc (uentry_whereLast (e), SA_DECLARED)));
}
usymtab_addEntryQuiet (s, e);
*/
uentry old;
- int thisentry = s->nentries;
+ usymId thisentry = usymId_fromInt (s->nentries);
if (uentry_isValid (old = usymtab_lookupQuiet (s, uentry_rawName (e))))
{
if (uentry_isVar (e) && !uentry_isGlobalMarker (e))
{
- uentry_setSref (e, sRef_makeCvar (globScope, thisentry,
- uentry_getType (e),
- stateInfo_makeLoc (uentry_whereLast (e))));
+ uentry_setSref
+ (e, sRef_makeCvar (globScope, thisentry,
+ uentry_getType (e),
+ stateInfo_makeLoc (uentry_whereLast (e), SA_DECLARED)));
}
usymtab_addEntryQuiet (s, e);
/*@globals globtab@*/
/*@modifies st, e@*/
{
- usymId thisentry = st->nentries;
+ usymId thisentry = usymId_fromInt (st->nentries);
llassert (!uentry_isElipsisMarker (e));
if (uentry_isStatic (e))
{
- sRef sr = sRef_makeCvar (st->lexlevel, thisentry, ct, stateInfo_makeLoc (uentry_whereLast (e)));
+ sRef sr = sRef_makeCvar (st->lexlevel, thisentry, ct,
+ stateInfo_makeLoc (uentry_whereLast (e), SA_DECLARED));
if (sRef_isStack (sr) || sRef_isLocalState (sr))
{
}
else
{
- uentry_setSref (e, sRef_makeCvar (st->lexlevel, thisentry, ct, stateInfo_makeLoc (uentry_whereLast (e))));
+ uentry_setSref
+ (e, sRef_makeCvar (st->lexlevel, thisentry, ct,
+ stateInfo_makeLoc (uentry_whereLast (e), SA_DECLARED)));
}
}
if (uentry_isDatatype (e))
{
-
- uentry_setDatatype (e, thisentry);
+ uentry_setDatatype (e, typeId_fromUsymId (thisentry));
}
if (uentry_isFunction (e))
{
cstring ename = uentry_rawName (e);
bool staticEntry = FALSE;
- int eindex;
+ usymId eindex;
DPRINTF (("Sup entry aux: %s", uentry_unparseFull (e)));
{
eindex = usymtab_getIndex (st, ename);
- if (eindex != NOT_FOUND)
+ if (usymtab_indexFound (eindex))
{
uentry ce = st->entries[eindex];
uentry_showWhereLast (ce);
}
- if (eindex == st->nentries - 1)
+ if (eindex == usymId_fromInt (st->nentries - 1))
{
;
}
}
}
- DPRINTF (("Using symtab: %s", usymtab_unparseLocalAux (st)));
-
eindex = usymtab_getIndex (st, ename);
- if (eindex != NOT_FOUND)
+ if (usymtab_indexFound (eindex))
{
uentry ce = st->entries[eindex];
if (uentry_isDatatype (e))
{
- uentry_setDatatype (e, eindex);
+ uentry_setDatatype (e, typeId_fromUsymId (eindex));
}
if (st == globtab && !uentry_isSpecified (e))
st->entries[eindex] = e;
ce = e;
- if (uentry_isDatatype (e)) uentry_setDatatype (e, eindex);
+ if (uentry_isDatatype (e)) uentry_setDatatype (e, typeId_fromUsymId (eindex));
}
else
{
if (uentry_isDatatype (e))
{
- uentry_setDatatype (e, eindex);
+ uentry_setDatatype (e, typeId_fromUsymId (eindex));
}
if (cstringTable_isDefined (st->htable))
if (!(st->lexlevel > fileScope || !sRef_modInFunction ()))
{
if (uentry_isDatatype (e) || uentry_isAnyTag (e)
- || uentry_isEnumConstant (e))
+ || uentry_isEnumConstant (e)
+ || uentry_isStatic (e)) /* bug fix from Brian St. Pierre */
{
; /*
** Not a bug. Code like,
ct = ctype_getReturnType (ct);
}
- uentry_setSref (ce, sRef_makeCvar (st->lexlevel, eindex, ct, stateInfo_makeLoc (uentry_whereLast (ce))));
+ uentry_setSref
+ (ce, sRef_makeCvar (st->lexlevel, eindex, ct,
+ stateInfo_makeLoc (uentry_whereLast (ce), SA_DECLARED)));
}
}
else /* no previous entry */
eindex = usymtab_getIndex (filetab, ename);
- if (eindex != NOT_FOUND)
+ if (usymtab_indexFound (eindex))
{
uentry ce = filetab->entries[eindex];
}
exitPoint:
- return (staticEntry ? USYMIDINVALID : eindex);
+ return (staticEntry ? usymId_invalid : eindex);
}
-# ifndef NOLCL
static void
usymtab_replaceEntryAux (/*@notnull@*/ usymtab st, /*@only@*/ uentry e)
/*@globals globtab@*/ /*@modifies st, e@*/
{
cstring ename = uentry_rawName (e);
- int eindex;
+ usymId eindex;
/* static tags in global scope */
eindex = usymtab_getIndex (st, ename);
- if (eindex != NOT_FOUND)
+ if (usymtab_indexFound (eindex))
{
uentry ce = st->entries[eindex];
eindex = usymtab_addEntryAux (st, e, FALSE);
}
}
-# endif
/*@=deparrays@*/
if (uentry_isAbstractDatatype (e))
{
- uid = usymtab_supAbstractTypeEntry (e, FALSE);
- ret = ctype_createAbstract (uid);
+ typeId tid = usymtab_supAbstractTypeEntry (e, FALSE);
+ ret = ctype_createAbstract (tid);
+ uid = typeId_toUsymId (tid);
}
else
{
uid = usymtab_supEntryAux (globtab, e, FALSE);
- ret = ctype_createUser (uid);
+ ret = ctype_createUser (typeId_fromUsymId (uid));
}
if (sRef_modInFunction ())
if (uentry_isAbstractDatatype (e))
{
- uid = usymtab_supAbstractTypeEntry (e, FALSE);
+ uid = typeId_toUsymId (usymtab_supAbstractTypeEntry (e, FALSE));
}
else if (uentry_isMaybeAbstract (e) && context_getFlag (FLG_IMPABSTRACT))
{
if (maybeabs)
{
uentry ux;
- uid = usymtab_supAbstractTypeEntry (e, FALSE);
- ux = usymtab_getTypeEntry (uid);
+ typeId tid = usymtab_supAbstractTypeEntry (e, FALSE);
+ ux = usymtab_getTypeEntry (tid);
uentry_setAbstract (ux);
+ uid = typeId_toUsymId (tid);
}
else
{
uid = usymtab_supEntryAux (globtab, e, FALSE);
- e = usymtab_getTypeEntry (uid);
+ e = usymtab_getTypeEntry (typeId_fromUsymId (uid));
if (uentry_isMaybeAbstract (e))
{
else
{
uid = usymtab_supEntryAux (globtab, e, FALSE);
- e = usymtab_getTypeEntry (uid);
+ e = usymtab_getTypeEntry (typeId_fromUsymId (uid));
+ /*? evans 2002-12-16 removed this? it doesn't make sense
if (uentry_isMaybeAbstract (e))
{
uentry_setConcrete (e);
}
+ */
}
if (sRef_modInFunction ())
return (globtab->entries[uid]);
}
-usymId
+typeId
usymtab_supAbstractTypeEntry (/*@only@*/ uentry e, bool dodef)
/*@globals globtab, filetab@*/
/*@modifies globtab, e@*/
{
- usymId uid;
+ typeId uid;
uentry ue;
- uid = usymtab_supEntryAux (globtab, e, FALSE);
+ uid = typeId_fromUsymId (usymtab_supEntryAux (globtab, e, FALSE));
ue = usymtab_getTypeEntry (uid);
if (dodef)
return (uid);
}
-# ifndef NOLCL
-usymId
+typeId
usymtab_supExposedTypeEntry (/*@only@*/ uentry e, bool dodef)
/*@globals globtab, filetab@*/
/*@modifies globtab, e@*/
{
- usymId uid;
+ typeId uid;
- uid = usymtab_supEntryAux (globtab, e, FALSE);
+ uid = typeId_fromUsymId (usymtab_supEntryAux (globtab, e, FALSE));
if (dodef)
{
recordFunctionType (globtab->entries[uid]);
}
- return (uid);
+ return uid;
}
-# endif
ctype
usymtab_supForwardTypeEntry (/*@only@*/ uentry e)
/*@globals globtab, filetab@*/
/*@modifies globtab, e@*/
{
- usymId uid = usymtab_supEntryAux (globtab, e, FALSE);
+ typeId uid = typeId_fromUsymId (usymtab_supEntryAux (globtab, e, FALSE));
uentry ue = usymtab_getTypeEntry (uid);
uentry_setDatatype (ue, uid);
/*@modifies utab, globtab, e@*/
{
sRef old = uentry_getSref (e);
-
if (sRef_isType (old))
{
return (utab->lexlevel > paramsScope);
}
-static int
+static usymId
usymtab_getIndex (/*@notnull@*/ usymtab s, cstring k)
{
int i;
if (cstringTable_isDefined (s->htable))
{
i = cstringTable_lookup (s->htable, k);
- return i;
+ return usymId_fromInt (i);
}
else
{
if (!uentry_isUndefined (current)
&& cstring_equal (uentry_rawName (current), k))
{
- return i;
+ return usymId_fromInt (i);
}
}
- return NOT_FOUND;
+ return usymId_notfound;
}
}
static uentry
-usymtab_fetchIndex (/*@notnull@*/ usymtab s, int i)
+usymtab_fetchIndex (/*@notnull@*/ usymtab s, usymId ui)
{
+ int i = usymId_toInt (ui);
llassert (i >= 0 && i < s->nentries);
return (s->entries[i]);
}
-usymId
+typeId
usymtab_getTypeId (cstring k) /*@globals globtab@*/
{
usymId uid = usymtab_getIndex (globtab, k);
- if (uid == NOT_FOUND) return USYMIDINVALID;
-
- if (!(uentry_isDatatype (usymtab_getTypeEntry (uid)))) {
- return USYMIDINVALID;
- }
-
- return uid;
+ if (!usymtab_indexFound (uid)
+ || !(uentry_isDatatype (usymtab_getTypeEntry (typeId_fromUsymId (uid)))))
+
+ {
+ return typeId_invalid;
+ }
+ else
+ {
+ return typeId_fromUsymId (uid);
+ }
}
/*@dependent@*/ uentry
usymId uid = usymtab_getIndex (globtab, k);
uentry ue;
- if (uid == NOT_FOUND)
+ if (!usymtab_indexFound (uid))
{
- return USYMIDINVALID;
+ return usymId_invalid;
}
ue = usymtab_getGlobalEntry (uid);
if (uentry_isPriv (ue))
{
- return USYMIDINVALID;
+ return usymId_invalid;
}
return uid;
static /*@exposed@*/ uentry
usymtab_getEntryAux (/*@notnull@*/ usymtab s, usymId uid)
{
- llassert (uid != USYMIDINVALID);
+ llassert (uid != usymId_invalid);
- if (uid < 0 || uid >= s->nentries)
+ if (uid < 0 || uid >= usymId_fromInt (s->nentries))
{
llcontbug (message ("usymtab_getEntry: out of range: level = %d [%d]",
s->lexlevel, uid));
}
}
-/*@dependent@*/ /*@exposed@*/ uentry
- usymtab_getTypeEntry (usymId uid)
+/*@dependent@*/ /*@exposed@*/ uentry usymtab_getTypeEntry (typeId uid)
/*@globals globtab@*/
{
if (dbgload)
{
- if (uid >= 0 && uid < globtab->nentries)
+ if (uid >= 0 && uid < typeId_fromInt (globtab->nentries))
{
return (globtab->entries[uid]);
}
}
else
{
- llassert (uid >= 0 && uid < globtab->nentries);
+ llassert (uid >= 0 && uid < typeId_fromInt (globtab->nentries));
return (globtab->entries[uid]);
}
}
** in load files
*/
-/*@dependent@*/ /*@exposed@*/ uentry
- usymtab_getTypeEntrySafe (usymId uid)
+/*@dependent@*/ /*@exposed@*/ uentry usymtab_getTypeEntrySafe (typeId uid)
/*@globals globtab@*/
{
- if (uid < 0 || uid >= globtab->nentries)
+ if (uid < 0 || uid >= typeId_fromInt (globtab->nentries))
{
return uentry_undefined;
}
-
- return (globtab->entries[uid]);
+
+ return (globtab->entries[uid]);
}
-bool
- usymtab_isBoolType (usymId uid)
+bool usymtab_isBoolType (typeId uid)
/*@globals globtab@*/
{
- llassert (uid >= 0 && uid < globtab->nentries);
+ llassert (uid >= 0 && uid < typeId_fromInt (globtab->nentries));
return (cstring_equal (uentry_rawName (globtab->entries[uid]),
context_getBoolName ()));
}
-cstring
-usymtab_getTypeEntryName (usymId uid)
+cstring usymtab_getTypeEntryName (typeId uid)
/*@globals globtab@*/
{
uentry ue;
cstringTable_free (s->htable);
}
- s->htable = cstringTable_create (LLHASHSIZE);
+ s->htable = cstringTable_create (LLAHSHSIZE);
for (i = 0; i < s->nentries; i++)
{
/*@-compdestroy@*/ sfree (s); /*@=compdestroy@*/
}
+usymId usymtab_convertTypeId (typeId uid)
+{
+ return usymtab_convertId (typeId_toUsymId (uid));
+}
+
/*
-** converts usymId from old table to sorted one
+** usymtab_convertId: converts usymId from old table to sorted one
*/
-usymId
- usymtab_convertId (usymId uid)
+usymId usymtab_convertId (usymId uid)
/*@globals oldtab, utab@*/
{
uentry ue;
uentry_unparse (ue), uid,
uentry_unparse (utab->entries[ret]), ret));
- llassertprint (ret != USYMIDINVALID, ("convertId: return is invalid"));
+ llassertprint (ret != usymId_invalid, ("convertId: return is invalid"));
return (ret);
}
lastekind = KINVALID;
fprintf(fout, ";; Library constraints\n");
+
+ /*drl July 27 added this so that libraries without
+ buffer constraints would be handled correctly.
+ I'm trying to do this without breaking older libraries.
+
+ Splint should still be able to handle libraries without this message.
+ */
+
+
+ fprintf(fout, "start_Buffer_Constraints\n");
+
for (i = 0; i < utab->nentries; i++)
{
uentry thisentry = utab->entries[i];
}
}
-
-
-
}
+
void usymtab_load (FILE *f)
/*@globals utab, globtab@*/
/*@modifies utab, *f@*/
{
llfatalerror
(cstring_makeLiteral
- ("Library is in obsolete format. Use lclint +whichlib "
+ ("Library is in obsolete format. Use splint +whichlib "
"to see which library is being loaded."));
}
{
int lastindex = utab->nentries;
ue = usymtab_addEntryAlways (utab, ue);
+
+
+# if 0
+ if (uentry_isConstant (ue)) /*@i23! isPreProcessorMacro */
+ {
+ cstring uname = uentry_getName (ue);
+
+ /* Also check its a macro... */
+ DPRINTF (("Installing: %s", uname));
+
+ cpphash_installMacro
+ (mstring_copy (cstring_toCharsSafe (uname)),
+ cstring_length (uname),
+ cpplib_createDefinition (message ("%s 255", uname),
+ loc,
+ FALSE, FALSE).defn,
+ cpphash_hashCode (cstring_toCharsSafe (uname),
+ cstring_length (uname),
+ CPP_HASHSIZE));
+
+ DPRINTF (("After install: %s", uname));
+ }
+# endif
+
if (utab->nentries != lastindex + 1)
{
DPRINTF (("No add: %s", uentry_unparseFull (ue)));
{
; /* ignore ;-comments */
}
+
+ /*drl July 27 added this so that libraries without
+ buffer constraints would be handled correctly.
+ I'm trying to do this without breaking older libraries*/
+
+ /*check for "optional" start buffer constraints message*/
+
+ if (mstring_equalPrefix (s, "start_Buffer_Constraints"))
+ {
+ (void) fgets (s, MAX_DUMP_LINE_LENGTH, f);
+ }
while (s != NULL && *s != ';')
{
constraintList preconditions;
constraintList postconditions;
-
- cstring name = cstring_fromChars(reader_getWord(&s) );
+ cstring name = cstring_fromChars (reader_getWord (&s));
cstring temp;
- ue = usymtab_lookup ( name );
- cstring_free(name);
+ ue = usymtab_lookup (name);
+ cstring_free (name);
preconditions = constraintList_undefined;
postconditions = constraintList_undefined;
{
if (sRef_hasDerived (uentry_getSref (ue)))
{
- fprintf (g_msgstream, "Derived Global: %s\n", uentry_unparse (ue));
- fprintf (g_msgstream, "sRef: %s\n", sRef_unparseFull (ue->sref));
+ fprintf (g_warningstream, "Derived Global: %s\n", uentry_unparse (ue));
+ fprintf (g_warningstream, "sRef: %s\n", sRef_unparseFull (ue->sref));
}
} end_usymtab_entries ;
{
if (sRef_isStateSpecial (pref))
{
- uentry_setDefState (ue, SS_ALLOCATED);
+ uentry_setDefState (ue, SS_SPECIAL); /* ALLOCATED); */
+ /* evans 2002-01-01: should be unnecessary, the pre clauses
+ ** set the state if necessary.
+ */
}
else
{
{
usymtab t = usymtab_create (US_NORMAL, utab, TRUE);
+ DPRINTF (("Enter function: %s", uentry_unparse (fcn)));
+
if (utab->lexlevel != fileScope)
{
if (utab->lexlevel > fileScope)
if (sRef_isUndefGlob (el))
{
- int index = sRef_getScopeIndex (el);
+ usymId index = sRef_getScopeIndex (el);
sRef sr = sRef_updateSref (el);
fileloc loc = uentry_whereEarliest (fcn);
} end_globSet_allElements;
DPRINTF (("Globs after: %s", globSet_unparse (uentry_getGlobs (fcn))));
+# ifdef DEBUGSPLINT
+ usymtab_checkAllValid ();
+# endif
}
static void
bool mustReturn = usymtab_mustEscape (utab);
usymtab stab = utab;
+ DPRINTF (("New case!"));
+
/*
** Find last case (or outer switch)
*/
stab = stab->env;
llassert (stab != GLOBAL_ENV);
}
-
- /* ??? */
-
+
while (stab->kind == US_CBRANCH)
{
stab = stab->env;
{
usymtab_entries (stab, current)
{
- if (usymtab_getIndex (ttab, uentry_rawName (current)) == NOT_FOUND)
+ if (!usymtab_indexFound (usymtab_getIndex (ttab, uentry_rawName (current))))
{
uentry old = /*@-compmempass@*/
usymtab_lookupAux (ltab, uentry_rawName (current));
if (!guardSet_isGuarded (ttab->guards, el)
&& !sRef_isNotNull (sr))
{
+ DPRINTF (("Here! %s / %s",
+ sRef_unparseFull (sr),
+ sRef_unparseFull (el)));
sRef_setDerivNullState (sr, el, NS_DEFNULL);
- }
+ }
}
}
else
{
- }
+ ;
+ }
ue = usymtab_getRefTab (ftab, level, index);
{
sRef sr = uentry_getSref (ue);
-
if (!trueGuard) /* yikes! forgot the ! */
{
sRef_setDerivNullState (sr, el, NS_NOTNULL);
&& !sRef_isNotNull (sr))
{
sRef_setDerivNullState (sr, el, NS_DEFNULL);
- }
+ }
}
}
else
{
uentry fthis = ftab->entries[i];
uentry old = usymtab_lookupAux (env, uentry_rawName (fthis));
- int tindex = usymtab_getIndex (ttab, uentry_rawName (fthis));
+ usymId tindex = usymtab_getIndex (ttab, uentry_rawName (fthis));
DPRINTF (("Entry: %s / %s", uentry_unparseFull (fthis), uentry_unparseFull (old)));
continue;
}
- if (tindex != NOT_FOUND)
+ if (usymtab_indexFound (tindex))
{
uentry tthis = ttab->entries[tindex];
else
{
ctype ct = ctype_realType (uentry_getType (glob));
+
+ DPRINTF (("Check global destroyed: %s", uentry_unparseFull (glob)));
if (ctype_isVisiblySharable (ct))
{
else
{
sRef_protectDerivs ();
- (void) checkGlobalDestroyed (sr, g_currentloc);
+ (void) transferChecks_globalDestroyed (sr, g_currentloc);
sRef_clearProtectDerivs ();
}
}
}
else
{
- checkGlobReturn (glob);
+ DPRINTF (("Check transfer: %s", uentry_unparseFull (glob)));
+ transferChecks_globalReturn (glob);
}
}
}
void usymtab_checkFinalScope (bool isReturn)
/*@globals utab@*/
{
- bool mustFree = context_getFlag (FLG_MUSTFREE);
bool mustDefine = context_getFlag (FLG_MUSTDEFINE);
- /* bool mustNotAlias = context_getFlag (FLG_MUSTNOTALIAS); */
sRefSet checked = sRefSet_new ();
usymtab stab = utab;
int i;
if (!uentry_sameObject (ce, oue))
{
- DPRINTF (("Skipping outer entry: %s / %s", uentry_unparseFull (ce),
- uentry_unparseFull (oue)));
- /*@i32 what if it is one an alternate branch? */
+ /* what if it is one an alternate branch? */
/*@innercontinue@*/ continue;
}
}
-
+
DPRINTF (("Here check final scope: %s", uentry_unparseFull (ce)));
if (ctype_isFunction (uentry_getType (ce)))
|| sRef_isFileOrGlobalScope (rb))
{
/* Don't do the loseref check...but should check state! */
+ DPRINTF (("Skipping check 1"));
}
else if (sRef_isDefinitelyNull (sr)
|| usymtab_isDefinitelyNull (sr))
/*
** No state reference errors for definitely null references.
*/
+
+ DPRINTF (("Skipping check 2"));
}
else
{
if (stateValue_isError (fval)
|| sRef_isStateUndefined (sr)) /* No errors for undefined state */
{
- ;
+ DPRINTF (("Skipping check 3"));
}
else
{
if (cstring_isDefined (msg))
{
- /*@i32 print extra info for assignments@*/
- DPRINTF (("From: %s", sRef_unparseFull (sr)));
- DPRINTF (("Null? %s / %s",
- bool_unparse (sRef_isDefinitelyNull (sr)),
- bool_unparse (usymtab_isGuarded (sr))));
-
if (optgenerror
(FLG_STATETRANSFER,
message
} end_valueTable_elements;
}
- if (mustFree)
+ DPRINTF (("Check mustfree entry: %s", uentry_unparseFull (ce)));
+
+ if (!sRefSet_member (checked, sr) && !sRef_isFileOrGlobalScope (rb))
{
- DPRINTF (("Check entry: %s", uentry_unparseFull (ce)));
-
- if (!sRefSet_member (checked, sr) && !sRef_isFileOrGlobalScope (rb))
+ if (ctype_isRealSU (uentry_getType (ce))
+ && !uentry_isAnyParam (ce)
+ && !uentry_isRefParam (ce)
+ && !uentry_isStatic (ce)
+ && !sRef_isDependent (sr)
+ && !sRef_isOwned (sr))
{
- if (ctype_isRealSU (uentry_getType (ce))
- && !uentry_isAnyParam (ce)
- && !uentry_isRefParam (ce)
- && !uentry_isStatic (ce)
- && !sRef_isDependent (sr)
- && !sRef_isOwned (sr))
+ sRefSet als = usymtab_allAliases (sr);
+
+ if (sRefSet_isEmpty (als))
{
- sRefSet als = usymtab_allAliases (sr);
-
- if (sRefSet_isEmpty (als))
- {
- checkLocalDestroyed (sr, g_currentloc);
- }
- else
- {
- /* aliased, no problem */ ;
- }
-
- sRefSet_free (als);
+ transferChecks_localDestroyed (sr, g_currentloc);
}
- else if
- (!uentry_isStatic (ce)
- && ((sRef_isNewRef (sr))
- || (((sRef_isOnly (sr) || sRef_isFresh (sr)
- || sRef_isKeep (sr) || sRef_isOwned (sr))
- && !sRef_isDead (sr))
- && (!sRef_definitelyNull (sr))
- && (!usymtab_isDefinitelyNull (sr)))))
- {
- bool hasError = TRUE;
-
- DPRINTF (("Checking: %s", sRef_unparseFull (sr)));
-
- /*
- ** If its a scope exit, check if there is an alias.
- ** If so, make it only. If not, there is an error.
- */
-
- if (!isReturn)
- {
- if (canLoseReference (sr, g_currentloc))
- {
- DPRINTF (("Can lose!"));
- hasError = FALSE;
- }
- }
-
- if (hasError)
- {
- if (sRef_hasLastReference (sr))
- {
- sRef ar = sRef_getAliasInfoRef (sr);
-
- if (optgenerror
- (FLG_MUSTFREE,
- message
- ("Last reference %q to %s storage %qnot %q before %q",
- sRef_unparse (sr),
- alkind_unparse (sRef_getAliasKind (sr)),
- sRef_unparseOpt (ar),
- cstring_makeLiteral (sRef_isKeep (sr)
- ? "transferred" : "released"),
- cstring_makeLiteral (isReturn
- ? "return" : "scope exit")),
- g_currentloc))
- {
- sRef_showRefLost (sr);
- }
- }
- else if (sRef_isNewRef (sr))
- {
- if (optgenerror
- (FLG_MUSTFREE,
- message
- ("%q %q not released before %q",
- cstring_makeLiteral
- (alkind_isKillRef (sRef_getOrigAliasKind (sr))
- ? "Kill reference parameter" : "New reference"),
- uentry_getName (ce),
- cstring_makeLiteral (isReturn
- ? "return" : "scope exit")),
- g_currentloc))
- {
- sRef_showAliasInfo (sr);
- }
- }
- else
- {
- if (ctype_isRealSU (sRef_getType (sr)))
- {
- checkStructDestroyed (sr, g_currentloc);
- }
- else
- {
- DPRINTF (("Here we are: %s", sRef_unparseFull (sr)));
-
- if (optgenerror
- (FLG_MUSTFREE,
- message
- ("%s storage %q not %q before %q",
- alkind_capName (sRef_getAliasKind (sr)),
- uentry_getName (ce),
- cstring_makeLiteral (sRef_isKeep (sr)
- ? "transferred" : "released"),
- cstring_makeLiteral (isReturn
- ? "return" : "scope exit")),
- g_currentloc))
- {
- sRef_showAliasInfo (sr);
- DPRINTF (("Storage: %s", sRef_unparseFull (sr)));
- }
- }
- }
- }
- }
else
{
- ;
+ /* aliased, no problem */ ;
}
+
+ sRefSet_free (als);
}
- else if (mustDefine && uentry_isOut (ce))
+ else if
+ (!uentry_isStatic (ce)
+ && ((sRef_isNewRef (sr))
+ || (((sRef_isOnly (sr) || sRef_isFresh (sr)
+ || sRef_isKeep (sr) || sRef_isOwned (sr))
+ && !sRef_isDead (sr))
+ && (!sRef_definitelyNull (sr))
+ && (!usymtab_isDefinitelyNull (sr)))))
{
- if (!ynm_toBoolStrict (sRef_isReadable (sr)))
+ bool hasError = TRUE;
+
+ DPRINTF (("Checking: %s", sRef_unparseFull (sr)));
+
+ /*
+ ** If its a scope exit, check if there is an alias.
+ ** If so, make it only. If not, there is an error.
+ */
+
+ if (!isReturn)
{
- voptgenerror
- (FLG_MUSTDEFINE,
- message ("Out storage %q not defined before %q",
- uentry_getName (ce),
- cstring_makeLiteral
- (isReturn ? "return" : "scope exit")),
- g_currentloc);
-
- /* uentry_showWhereDeclared (ce); */
+ if (transferChecks_canLoseReference (sr, g_currentloc))
+ {
+ DPRINTF (("Can lose!"));
+ hasError = FALSE;
+ }
+ }
+
+ if (hasError)
+ {
+ if (sRef_hasLastReference (sr))
+ {
+ sRef ar = sRef_getAliasInfoRef (sr);
+
+ if (optgenerror
+ (sRef_isFresh (ar) ? FLG_MUSTFREEFRESH : FLG_MUSTFREEONLY,
+ message
+ ("Last reference %q to %s storage %qnot %q before %q",
+ sRef_unparse (sr),
+ alkind_unparse (sRef_getAliasKind (sr)),
+ sRef_unparseOpt (ar),
+ cstring_makeLiteral (sRef_isKeep (sr)
+ ? "transferred" : "released"),
+ cstring_makeLiteral (isReturn
+ ? "return" : "scope exit")),
+ g_currentloc))
+ {
+ sRef_showRefLost (sr);
+ }
+ }
+ else if (sRef_isNewRef (sr))
+ {
+ if (optgenerror
+ (sRef_isFresh (sr) ? FLG_MUSTFREEFRESH : FLG_MUSTFREEONLY,
+ message
+ ("%q %q not released before %q",
+ cstring_makeLiteral
+ (alkind_isKillRef (sRef_getOrigAliasKind (sr))
+ ? "Kill reference parameter" : "New reference"),
+ uentry_getName (ce),
+ cstring_makeLiteral (isReturn
+ ? "return" : "scope exit")),
+ g_currentloc))
+ {
+ sRef_showAliasInfo (sr);
+ }
+ }
+ else
+ {
+ if (ctype_isRealSU (sRef_getType (sr)))
+ {
+ transferChecks_structDestroyed (sr, g_currentloc);
+ }
+ else
+ {
+ if (optgenerror
+ (sRef_isFresh (sr) ? FLG_MUSTFREEFRESH : FLG_MUSTFREEONLY,
+ message
+ ("%s storage %q not %q before %q",
+ alkind_capName (sRef_getAliasKind (sr)),
+ uentry_getName (ce),
+ cstring_makeLiteral (sRef_isKeep (sr)
+ ? "transferred" : "released"),
+ cstring_makeLiteral (isReturn
+ ? "return" : "scope exit")),
+ g_currentloc))
+ {
+ sRef_showAliasInfo (sr);
+ DPRINTF (("Storage: %s", sRef_unparseFull (sr)));
+ }
+ }
+ }
}
}
else
{
- ;
+ ;
+ }
+ }
+
+ if (mustDefine && uentry_isOut (ce))
+ {
+ /* No error if its dead (either only or error already reported */
+ if (!sRef_isReallyDefined (sr) && !sRef_isDead (sr))
+ {
+ voptgenerror
+ (FLG_MUSTDEFINE,
+ message ("Out storage %q not defined before %q",
+ uentry_getName (ce),
+ cstring_makeLiteral
+ (isReturn ? "return" : "scope exit")),
+ g_currentloc);
+
+ DPRINTF (("sr: %s", sRef_unparseFull (sr)));
}
+ }
+
+ /*
+ ** also check state is okay
+ */
+
+ if (usymtab_lexicalLevel () > functionScope
+ && uentry_isVariable (ce)
+ && (sRef_isLocalVar (sr)
+ && (sRef_isDependent (sr) || sRef_isLocalState (sr))))
+ {
+ sRefSet ab = usymtab_aliasedBy (sr);
- /*
- ** also check state is okay
- */
+ /* should do something more efficient here */
- if (usymtab_lexicalLevel () > functionScope
- && uentry_isVariable (ce)
- && (sRef_isLocalVar (sr)
- && (sRef_isDependent (sr) || sRef_isLocalState (sr))))
+ if (sRefSet_isEmpty (ab))
{
- sRefSet ab = usymtab_aliasedBy (sr);
-
- /* should do something more efficient here */
-
- if (sRefSet_isEmpty (ab))
- {
- /* and no local ref */
- DPRINTF (("Check lose ref: %s", uentry_unparseFull (ce)));
- checkLoseRef (ce);
- }
- else
- {
- ;
- }
-
- sRefSet_free (ab);
+ /* and no local ref */
+ DPRINTF (("Check lose ref: %s", uentry_unparseFull (ce)));
+ transferChecks_loseReference (ce);
}
- else
+ else
{
;
}
- checked = sRefSet_insert (checked, sr);
+ sRefSet_free (ab);
}
+ else
+ {
+ ;
+ }
+
+ checked = sRefSet_insert (checked, sr);
}
llassert (usymtab_isDefined (stab->env));
{
uentry param = usymtab_lookupQuiet (utab, uentry_rawName (arg));
DPRINTF (("Check param return: %s", uentry_unparseFull (param)));
- checkParamReturn (param);
+ transferChecks_paramReturn (param);
}
}
} end_uentryList_elements;
{
usymtab t = utab->env;
+ DPRINTF (("Quiet exit scope [%p]", utab));
+
if (utab->reftable != NULL)
{
int i;
t->mustBreak = utab->mustBreak;
t->exitCode = utab->exitCode;
+ DPRINTF (("Free level [%p]", utab));
usymtab_freeLevel (utab);
utab = t;
+
+# ifdef DEBUGSPLINT
+ usymtab_checkAllValid ();
+# endif
}
/*
usymtab lctab = usymtab_undefined;
bool mustReturn = exprNode_mustEscape (expr);
- DPRINTF (("Exit scope"));
+ DPRINTF (("Exit scope [%p]", utab));
if (utab->kind == US_CBRANCH)
{
}
if (utab->kind == US_TBRANCH || utab->kind == US_FBRANCH
- || utab->kind == US_CBRANCH || utab->kind == US_SWITCH) {
-
- if (context_inMacro ()) {
- /* evs 2000-07-25 */
- /* Unparseable macro may end inside nested scope. Deal with it. */
-
- llerror (FLG_SYNTAX,
- message ("Problem parsing macro body of %s (unbalanced scopes). "
- "Attempting to recover, recommend /*@notfunction@*/ before "
- "macro definition.",
- context_inFunctionName ()));
-
- while (utab->kind == US_TBRANCH
- || utab->kind == US_FBRANCH
- || utab->kind == US_CBRANCH
- || utab->kind == US_SWITCH)
+ || utab->kind == US_CBRANCH || utab->kind == US_SWITCH)
+ {
+ if (context_inMacro ())
{
- utab = utab->env;
- llassert (utab != GLOBAL_ENV);
- }
- } else {
- llcontbug (message ("exitScope: in branch: %q", usymtab_unparseStack ()));
- /*@-branchstate@*/
- } /*@=branchstate@*/
- }
-
+ /* evs 2000-07-25 */
+ /* Unparseable macro may end inside nested scope. Deal with it. */
+
+ llerror (FLG_SYNTAX,
+ message ("Problem parsing macro body of %s (unbalanced scopes). "
+ "Attempting to recover, recommend /*@notfunction@*/ before "
+ "macro definition.",
+ context_inFunctionName ()));
+
+ while (utab->kind == US_TBRANCH
+ || utab->kind == US_FBRANCH
+ || utab->kind == US_CBRANCH
+ || utab->kind == US_SWITCH)
+ {
+ utab = utab->env;
+ llassert (utab != GLOBAL_ENV);
+ }
+ } else
+ {
+ llcontbug (message ("exitScope: in branch: %q", usymtab_unparseStack ()));
+ /*@-branchstate@*/
+ } /*@=branchstate@*/
+ }
+
/*
** check all variables in scope were used
*/
** NOTE: note for exiting paramsScope, since checkReturn should be
** called first.
*/
-
+
if (!mustReturn && (usymtab_lexicalLevel () > functionScope))
{
/*
uentryList params = context_getParams ();
globSet globs = context_getUsedGlobs ();
-
uentryList_elements (params, ue)
{
uentry_fixupSref (ue);
clearFunctionTypes ();
-
+ DPRINTF (("Fixing up globals: %s", globSet_unparse (globs)));
+
globSet_allElements (globs, el)
{
+ DPRINTF (("Fix: %s", sRef_unparseDebug (el)));
+
if (sRef_isCvar (el))
{
uentry current;
- int index = sRef_getScopeIndex (el);
+ usymId index = sRef_getScopeIndex (el);
if (sRef_isFileStatic (el))
{
if (uentry_isVariable (current))
{
+ DPRINTF (("Fixup: %s", uentry_unparse (current)));
uentry_fixupSref (current);
}
else
{
+ DPRINTF (("Clear: %s", uentry_getSref (current)));
sRef_clearDerived (uentry_getSref (current));
}
}
+
+ sRef_clearDerived (el); /* evans 2002-03-14 - this is the likely source of many crashes! */
} end_globSet_allElements;
}
/*@i@*/ utab = ctab;
/*@-branchstate@*/ } /*@=branchstate@*/
/*@-globstate@*/
-/*@i523@*/ }
+
+
+# ifdef DEBUGSPLINT
+ usymtab_checkAllValid ();
+# endif
+}
/*@=globstate@*/
/*
** yikes! don't let the '170 kids see this one...
*/
-int
-uentry_directParamNo (uentry ue)
+usymId
+usymtab_directParamNo (uentry ue)
{
if (uentry_isVar (ue))
{
if (sRef_lexLevel (sr) == functionScope)
{
- int index;
+ usymId index = sRef_getScopeIndex (sr);
- /*@access sRef@*/
- llassert (sr->info != NULL);
- llassert (sr->info->cvar != NULL);
- index = sr->info->cvar->index;
- /*@noaccess sRef@*/
-
- if (index < uentryList_size (context_getParams ()))
+ if (index < usymId_fromInt (uentryList_size (context_getParams ())))
{
return index;
}
}
}
- return -1;
+ return usymId_invalid;
}
/*@dependent@*/ /*@exposed@*/ uentry
s = usymtab_dropEnv (s);
}
- if (index >= s->nentries)
+ if (index >= usymId_fromInt (s->nentries))
{
return uentry_undefined;
}
while (usymtab_isBranch (s) && s->lexlevel == level)
{
int eindex = refTable_lookup (s, level, index);
-
if (eindex != NOT_FOUND)
{
s = usymtab_dropEnv (s);
}
- if (s->lexlevel == level && (index < s->nentries))
+ if (s->lexlevel == level && (index < usymId_fromInt (s->nentries)))
{
ue = s->entries[index];
}
- if (index >= s->nentries)
+ if (index >= usymId_fromInt (s->nentries))
{
return uentry_undefined;
}
*/
static
-int refTable_lookup (/*@notnull@*/ usymtab ut, int level, int index)
+int refTable_lookup (/*@notnull@*/ usymtab ut, int level, usymId index)
{
refTable rt = ut->reftable;
int i;
for (i = 0; i < ut->nentries; i++)
{
- if (rt[i]->level == level && rt[i]->index == index)
+ if (rt[i]->level == level && rt[i]->index == usymId_toInt (index))
{
return i;
}
static /*@dependent@*/ /*@exposed@*/ uentry
usymtab_addRefEntry (/*@notnull@*/ usymtab s, cstring k)
{
- int eindex;
usymtab ut = s;
if (ut->reftable == NULL)
while (s != GLOBAL_ENV)
{
- eindex = usymtab_getIndex (s, k);
+ usymId eindex = usymtab_getIndex (s, k);
- if (eindex != NOT_FOUND)
+ if (usymtab_indexFound (eindex))
{
uentry current = s->entries[eindex];
uentry ue;
DPRINTF (("Here: copying %s", uentry_unparse (current)));
- ue = uentry_copy (current);
+ if (uentry_isNonLocal (current))
+ {
+ ue = uentry_copy (current);
+ }
+ else
+ {
+ ue = uentry_copyNoSave (current);
+ }
+
DPRINTF (("Here: copying %s", uentry_unparse (ue)));
usymtab_addEntryQuiet (ut, ue);
DPRINTF (("Okay..."));
else
{
ut->reftable[ut->nentries - 1]
- = refentry_create (s->lexlevel, eindex);
+ = refentry_create (s->lexlevel, usymId_toInt (eindex));
}
return (ue);
while (s != GLOBAL_ENV)
{
- int eindex = usymtab_getIndex (s, k);
+ usymId eindex = usymtab_getIndex (s, k);
- if (eindex != NOT_FOUND)
+ if (usymtab_indexFound (eindex))
{
uentry ret = s->entries[eindex];
# if 0
static /*@dependent@*/ /*@exposed@*/ uentry
usymtab_lookupQuietAux (usymtab s, cstring k, bool noalt)
{
- int eindex;
-
while (s != GLOBAL_ENV)
{
- eindex = usymtab_getIndex (s, k);
+ usymId eindex = usymtab_getIndex (s, k);
- if (eindex != NOT_FOUND)
+ if (usymtab_indexFound (eindex))
{
uentry ret = s->entries[eindex];
return (ret);
}
else
{
+ llassert (s != NULL);
s = s->env;
}
}
if (uentry_isPriv (ce))
llfatalbug (message ("usymtab_lookup: private: %s", k));
+ DPRINTF (("Lookup global: %s", uentry_unparseFull (ce)));
return ce;
}
/*@globals globtab@*/
{
uentry ce = usymtab_lookupAux (globtab, k);
-
+ DPRINTF (("Lookup global: %s", uentry_unparseFull (ce)));
return ce;
}
if (uentry_isUndefined (ce))
llfatalerror (message ("usymtab_lookup: not found: %s", k));
+ DPRINTF (("Lookup either: %s", uentry_unparseFull (ce)));
return ce;
}
-# ifndef NOLCL
ctype
usymtab_lookupType (cstring k)
/*@globals globtab@*/
{
- usymId uid = usymtab_getTypeId (k);
+ typeId uid = usymtab_getTypeId (k);
- if (uid == USYMIDINVALID)
+ if (typeId_isInvalid (uid))
{
llcontbug (message ("usymtab_lookupType: not found: %s", k));
return ctype_unknown;
return (uentry_getRealType (usymtab_getTypeEntry (uid)));
}
-# endif
ctype
usymtab_lookupAbstractType (cstring k) /*@globals globtab@*/
{
- usymId uid = usymtab_getTypeId (k);
+ typeId uid = usymtab_getTypeId (k);
- if (uid == USYMIDINVALID)
+ if (typeId_isInvalid (uid))
{
llcontbug (message ("usymtab_lookupType: not found: %s", k));
return ctype_unknown;
return (!(uentry_isUndefined (ce)) && !(uentry_isPriv (ce)));
}
-# ifndef NOLCL
bool
usymtab_existsEither (cstring k)
/*@globals utab@*/
return (uentry_isValid (ce));
}
-# endif
bool
usymtab_existsType (cstring k)
return (!(uentry_isUndefined (ce)) && !(uentry_isPriv (ce)));
}
-# ifndef NOLCL
bool usymtab_existsVar (cstring k)
/*@globals utab@*/
{
return (!(uentry_isUndefined (ce)) && !(uentry_isPriv (ce)) && (uentry_isVar (ce)));
}
-# endif
/*
** destructors
{
int i;
+ DPRINTF (("Free level [%p]", u));
aliasTable_free (u->aliases);
refTable_free (u->reftable, u->nentries);
{
for (i = 0; i < u->nentries; i++)
{
+ DPRINTF (("Free complete: %d", i));
+ DPRINTF (("Uentry: %s", uentry_unparse (u->entries[i])));
uentry_freeComplete (u->entries[i]);
+ u->entries[i] = uentry_undefined;
}
}
else
for (i = 0; i < u->nentries; i++)
{
uentry_free (u->entries[i]);
+ u->entries[i] = uentry_undefined;
}
}
&& u != filetab)
{
llassert (!cstringTable_isDefined (u->htable));
- sfree (u);
}
-/*@-mustfree@*/
-} /*@=mustfree@*/
+ sfree (u); /* evans 2002-07-12: was inside if */
+}
static void
usymtab_freeAux (/*@only@*/ usymtab u)
{
dbgfree = TRUE;
usymtab_freeAux (utab);
-}
+ utab = usymtab_undefined;
+ /*@-globstate@*/
+} /*@=globstate@*/ /* Splint cannot tell that utab is killed */
static int usymtab_lexicalLevel (void) /*@globals utab@*/
{
return (utab->lexlevel == functionScope);
}
-# ifndef NOLCL
void
usymtab_replaceEntry (uentry s)
/*@globals utab, globtab@*/
{
usymtab_replaceEntryAux (utab, s);
}
-# endif
bool
-usymtab_matchForwardStruct (usymId u1, usymId u2)
+usymtab_matchForwardStruct (typeId u1, typeId u2)
/*@globals globtab@*/
{
uentry ue1 = usymtab_getTypeEntry (u1);
if (u2 == rtuid) return TRUE;
- if (usymId_isValid (rtuid))
+ if (typeId_isValid (rtuid))
{
- reptype = uentry_getType (usymtab_getTypeEntry (rtuid));
-
+ reptype = uentry_getType (usymtab_getTypeEntry (rtuid));
return (ctype_isUA (reptype) && (u2 == (ctype_typeId (reptype))));
}
}
usymtab_entries (copy, ue)
{
- if (uentry_isValid (ue))
+ if (uentry_isValid (ue) && !uentry_isGlobalMarker (ue))
{
filelocList uses = uentry_getUses (ue);
int size = filelocList_realSize (uses);
void usymtab_addForceMustAlias (/*@exposed@*/ sRef s, /*@exposed@*/ sRef al)
/*@modifies utab@*/
{
+ /* evans 2002-03-3: was sRef_isMeaningful -- but we need to keep aliases for new storage also! */
if (sRef_isMeaningful (s)
&& sRef_isMeaningful (al)
&& !(sRef_isConst (s) || sRef_isConst (al))
}
else
{
- ;
+ DPRINTF (("Not aliasing! %s / %s", sRef_unparseFull (s), sRef_unparseFull (al)));
+ DPRINTF (("meaningful: %d %d", sRef_isMeaningful (s), sRef_isMeaningful (al)));
}
}
+void usymtab_addReallyForceMustAlias (/*@exposed@*/ sRef s, /*@exposed@*/ sRef al)
+ /*@modifies utab@*/
+{
+ utab->aliases = aliasTable_addMustAlias (utab->aliases, s, al);
+}
+
void usymtab_clearAlias (sRef s)
/*@modifies utab, s@*/
{
sRefSet usymtab_allAliases (sRef s)
/*@globals utab@*/
{
- if (sRef_isMeaningful (s))
+ if (sRef_isSomewhatMeaningful (s))
{
sRefSet ret;
/*@only@*/ sRefSet usymtab_canAlias (sRef s)
/*@globals utab@*/
{
- if (sRef_isMeaningful (s))
+ if (sRef_isSomewhatMeaningful (s))
{
sRefSet res = aliasTable_canAlias (utab->aliases, s);
return res;
int depth = 0;
char *ind = mstring_copy (" ");
- fprintf (g_msgstream, "<<< [symbol table] >>>\n");
+ fprintf (g_warningstream, "<<< [symbol table] >>>\n");
while (s != GLOBAL_ENV && s->env != GLOBAL_ENV)
{
ind[depth * 3 + 1] = '\0';
}
- fprintf (g_msgstream, "level: %d (%s)\n", s->lexlevel,
+ fprintf (g_warningstream, "level: %d (%s)\n", s->lexlevel,
cstring_toCharsSafe (tname));
cstring_free (tname);
for (i = 0; i < s->nentries; i++)
{
cstring us = uentry_unparseFull (s->entries[i]);
- fprintf (g_msgstream, "%s\n", cstring_toCharsSafe (us));
+ fprintf (g_warningstream, "%s\n", cstring_toCharsSafe (us));
cstring_free (us);
}
if (s->reftable != NULL && s->nentries > 0)
{
- fprintf (g_msgstream, "\t<< Ref table >>\n");
+ fprintf (g_warningstream, "\t<< Ref table >>\n");
for (i = 0; i < s->nentries; i++)
{
- fprintf (g_msgstream, "\t%s %3d: %d, %d\n", ind, i,
+ fprintf (g_warningstream, "\t%s %3d: %d, %d\n", ind, i,
s->reftable[i]->level,
s->reftable[i]->index);
}
depth++;
s = s->env;
}
- fprintf (g_msgstream, "<<< end usymtab >>>\n");
+ fprintf (g_warningstream, "<<< end usymtab >>>\n");
mstring_free (ind);
return;
}
static void
usymtab_printAllAux (usymtab s)
- /*@modifies g_msgstream@*/
+ /*@modifies g_warningstream@*/
{
int i;
int depth = 0;
for (i = looplow; i < s->nentries; i++)
{
printf ("%s%3d %s\n", ind, i,
- cstring_toCharsSafe (uentry_unparse (s->entries[i])));
+ cstring_toCharsSafe (uentry_unparseFull (s->entries[i])));
}
}
else
for (i = 0; i < s->nentries; i++)
{
printf ("%s%3d %s\n", ind, i,
- cstring_toCharsSafe (uentry_unparse (s->entries[i])));
+ cstring_toCharsSafe (uentry_unparseFull (s->entries[i])));
}
}
mstring_free (ind);
}
-# ifdef __LCLINT__
+# ifdef S_SPLINT_S
static /*@only@*/ cstring /*@unused@*/
usymtab_unparseLocalAux (/*@notnull@*/ usymtab s)
{
static bool checkDistinctExternalName (uentry e)
/*@globals globtab@*/
- /*@modifies *g_msgstream@*/
+ /*@modifies *g_warningstream@*/
{
- int checklen = context_getValue (FLG_EXTERNALNAMELEN);
+ size_t checklen = size_fromInt (context_getValue (FLG_EXTERNALNAMELEN));
bool ignorecase = context_getFlag (FLG_EXTERNALNAMECASEINSENSITIVE);
bool gotone = FALSE;
bool extras = FALSE;
"in the first %d characters (%q)",
uentry_getName (e),
uentry_getName (oe),
- checklen,
+ size_toInt (checklen),
cstring_clip (uentry_getName (e), checklen)),
/*@=sefparams@*/
uentry_whereLast (e)))
"is ignored",
uentry_getName (e),
uentry_getName (oe),
- checklen),
+ size_toInt (checklen)),
uentry_whereLast (e)))
{
uentry_showWhereAny (oe);
"in the first %d characters (%q)",
uentry_getName (e),
uentry_getName (oe),
- checklen,
+ size_toInt (checklen),
cstring_clip (uentry_getName (e), checklen)),
/*@=sefparams@*/
uentry_whereLast (e)))
static bool checkDistinctInternalName (uentry e)
/*@globals utab@*/
- /*@modifies *g_msgstream@*/
+ /*@modifies *g_warningstream@*/
{
usymtab ttab = utab;
cstring name = uentry_rawName (e);
- int numchars = context_getValue (FLG_INTERNALNAMELEN);
+ size_t numchars = size_fromInt (context_getValue (FLG_INTERNALNAMELEN));
bool caseinsensitive = context_getFlag (FLG_INTERNALNAMECASEINSENSITIVE);
bool lookalike = context_getFlag (FLG_INTERNALNAMELOOKALIKE);
"in the first %d characters (%q)",
uentry_getName (e),
uentry_getName (oe),
- numchars,
+ size_toInt (numchars),
cstring_clip (uentry_getName (e), numchars)),
/*@=sefparams@*/
uentry_whereLast (e)))
/*@switchbreak@*/
break;
case CGE_CASE:
- if (numchars == 0
- || (cstring_length (name) <= numchars))
+ if (numchars == 0 || (cstring_length (name) <= numchars))
{
if (optgenerror
(FLG_DISTINCTINTERNALNAMES,
"in the first %d characters without case sensitivity",
uentry_getName (e),
uentry_getName (oe),
- numchars),
+ size_toInt (numchars)),
uentry_whereLast (e)))
{
uentry_showWhereAny (oe);
"in the first %d characters except by lookalike characters",
uentry_getName (e),
uentry_getName (oe),
- numchars),
+ size_toInt (numchars)),
uentry_whereLast (e)))
{
uentry_showWhereAny (oe);
return uentry_getSref (ue);
}
+
+# ifdef DEBUGSPLINT
+/*
+** For debugging only
+*/
+
+void
+usymtab_checkAllValid () /*@globals utab@*/
+{
+ usymtab tab = utab;
+
+ while (tab != GLOBAL_ENV)
+ {
+ int i;
+
+ for (i = 0; i < utab->nentries; i++)
+ {
+ uentry e = utab->entries[i];
+
+ uentry_checkValid (e);
+ }
+
+ aliasTable_checkValid (tab->aliases);
+ tab = tab->env;
+ }
+}
+# endif
+
+
+
+
+
+