/*
-** LCLint - annotation-assisted static program checker
-** Copyright (C) 1994-2000 University of Virginia,
+** Splint - annotation-assisted static program checker
+** Copyright (C) 1994-2002 University of Virginia,
** Massachusetts Institute of Technology
**
** This program is free software; you can redistribute it and/or modify it
**
** 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
+** For more information: http://www.splint.org
*/
/*
** usymtab
# include "basic.h"
# include "structNames.h"
# include "exprChecks.h"
-# include "aliasChecks.h"
+# include "transferChecks.h"
/*
** Keep track of type definitions inside a function.
static bool dbgfree = FALSE;
static bool dbgload = TRUE;
-/*@access ekind usymId@*/
+/*@access ekind@*/
/*
** Hack to prevent shadow errors from appearing when function parameters
static /*@checkedstrict@*/ /*@owned@*/ usymtab oldtab;
static int usymtab_lexicalLevel (void) /*@globals utab@*/ ;
-static bool usymtab_isProbableNullAltBranch (sRef p_s) /*@globals utab@*/ ;
+static bool usymtab_isAltDefinitelyNull (sRef p_s) /*@globals utab@*/ ;
static void refTable_free (/*@only@*/ /*@null@*/ refTable p_x, int p_nentries);
static ctype usymtab_suFieldsType (uentryList p_f, bool p_isStruct) /*@globals globtab@*/ ;
+extern int usymtab_getCurrentDepth (void) /*@globals utab@*/
+{
+ return utab->lexlevel;
+}
+
static void
usymtab_freeLevel (/*@notnull@*/ /*@only@*/ usymtab p_u)
/*@globals globtab, utab, filetab@*/ /*@modifies p_u@*/ ;
-static bool usymtab_isProbableNullAux (sRef p_s) /*@globals utab@*/ ;
+static bool usymtab_isDefinitelyNullAux (sRef p_s) /*@globals utab@*/ ;
static /*@only@*/ cstring usymtab_unparseStackTab (usymtab p_t);
static /*@exposed@*/ /*@dependent@*/ uentry
usymtab_getRefTab (/*@notnull@*/ usymtab p_u, int p_level, usymId p_index);
+
+# ifdef __LCLINT__
+/* These are not used anymore... */
static /*@unused@*/ /*@only@*/ cstring
usymtab_unparseLocalAux (/*@notnull@*/ usymtab p_s);
static /*@unused@*/ /*@only@*/ cstring
usymtab_unparseLocalList (/*@notnull@*/ usymtab p_s);
+# endif
+
static /*@only@*/ cstring usymtab_typeName (/*@notnull@*/ usymtab p_t);
static void usymtab_handleParams (void)
/*@globals utab, globtab, filetab@*/
static /*@exposed@*/ /*@dependent@*/ uentry
usymtab_getRefNoisy (/*@notnull@*/ usymtab p_s, int p_level, usymId p_index);
+static /*@exposed@*/ /*@dependent@*/ uentry
+ usymtab_lookupQuietAux (usymtab p_s, cstring p_k, bool p_noalt);
+
static /*@exposed@*/ /*@dependent@*/ uentry
usymtab_lookupQuiet (usymtab p_s, cstring p_k);
+
+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 void recordFunctionType (uentry ue)
{
- llassert (uentry_isDatatype (ue) || uentry_isAnyTag (ue)
+ llassert (uentry_isDatatype (ue) || uentry_isAnyTag (ue)
|| uentry_isEnumConstant (ue));
-
+ DPRINTF (("Function type: %s", uentry_unparseFull (ue)));
/*@-temptrans@*/
functypes = uentryList_add (functypes, ue);
/*@=temptrans@*/
{
if (cstring_isDefined (uentry_rawName (el)))
{
- if (globtab->htable != NULL)
+ if (cstringTable_isDefined (globtab->htable))
{
- hashTable_remove (globtab->htable, uentry_rawName (el));
+ cstringTable_remove (globtab->htable, uentry_rawName (el));
}
uentry_setName (el, cstring_undefined);
}
}
-bool usymtab_isAltProbablyDeepNull (sRef s)
+bool usymtab_isAltDefinitelyNullDeep (sRef s)
{
- return (sRef_deepPred (usymtab_isProbableNullAltBranch, s));
+ return (sRef_deepPred (usymtab_isAltDefinitelyNull, s));
}
-static bool usymtab_isProbableNullAltBranch (sRef s)
+static bool usymtab_isAltDefinitelyNull (sRef s)
/*@globals utab@*/
{
guardSet t;
/*@=mods@*/
llassert (usymtab_isDefined (utab));
- res = usymtab_isProbableNull (s);
+ res = usymtab_isDefinitelyNull (s);
/*
** This reports a spurious error. It is okay, because of
t->nentries = 0;
t->nspace = CBASESIZE;
t->entries = (uentry *) dmalloc (sizeof (*t->entries) * CBASESIZE);
+
+ /* We only use a reftable for branch-level symbol tables.
+ */
+
t->reftable = (nextlevel
? NULL
: (refentry *) dmalloc (sizeof (*t->reftable) * CBASESIZE));
t->kind = kind;
t->lexlevel = (env == GLOBAL_ENV ? 0 : env->lexlevel) + (nextlevel ? 1 : 0);
-
+
t->env = env;
t->htable = NULL;
t->guards = guardSet_undefined;
t->aliases = aliasTable_undefined;
- t->mustBreak = FALSE;
+ t->mustBreak = FALSE;
t->exitCode = XK_NEVERESCAPE;
-
+
return t;
}
u->entries = (uentry *) dmalloc (sizeof (*u->entries) * CGLOBBASESIZE);
u->env = GLOBAL_ENV;
u->lexlevel = 0;
- u->htable = hashTable_create (CGLOBHASHSIZE);
+ u->htable = cstringTable_create (CGLOBHASHSIZE);
u->reftable = NULL;
-
+
u->guards = guardSet_new ();
u->aliases = aliasTable_new ();
u->exitCode = XK_NEVERESCAPE;
u->kind = US_NORMAL;
- /*@i23@*/ return (u);
+ return (u);
}
void
oldtab = usymtab_undefined;
}
+
+void
+usymtab_initGlobalMarker () /*@globals globtab@*/
+{
+ if (uentry_isValid (usymtab_lookupAux (globtab, GLOBAL_MARKER_NAME)))
+ {
+ ; /* Already entered from load table. */
+ }
+ else
+ {
+ usymtab_addGlobalEntry (uentry_makeGlobalMarker ());
+ }
+}
+
/*
** utab should be empty? (requires?)
**
}
# endif
- if (s->htable != NULL)
+ if (cstringTable_isDefined (s->htable))
{
- hashTable_insert (s->htable, uentry_rawName (e), s->nentries);
+ cstringTable_insert (s->htable, cstring_copy (uentry_rawName (e)), s->nentries);
}
s->nentries++;
if (uentry_isVar (e))
{
uentry_setSref (e, sRef_makeCvar (globScope, thisentry,
- uentry_getType (e)));
+ uentry_getType (e),
+ stateInfo_makeLoc (uentry_whereLast (e))));
}
usymtab_addEntryQuiet (s, e);
}
}
+
+static /*@observer@*/ uentry /*@alt void@*/
+usymtab_addEntryAlways (/*@notnull@*/ usymtab s, /*@only@*/ uentry e)
+{
+ /*
+ ** In theory, we shouldn't need this test because it this is
+ ** only called when a library is being read, and it shouldn't
+ ** ever have a duplicate entry. In practice, its safer to
+ ** leave it in, though.
+ */
+
+ uentry old;
+ int thisentry = s->nentries;
+
+ if (uentry_isValid (old = usymtab_lookupQuiet (s, uentry_rawName (e))))
+ {
+ llcontbug
+ (message ("Duplicate entry in load library: %s. "
+ "Old entry: %q. New entry: %q",
+ uentry_rawName (e),
+ uentry_unparseFull (old),
+ uentry_unparseFull (e)));
+
+ uentry_setName (e, message ("__x_%s", uentry_rawName (e)));
+ /* This shouldn't happen...unless the library is bad! */
+ }
+
+
+ if (uentry_isVar (e) && !uentry_isGlobalMarker (e))
+ {
+ uentry_setSref (e, sRef_makeCvar (globScope, thisentry,
+ uentry_getType (e),
+ stateInfo_makeLoc (uentry_whereLast (e))));
+ }
+
+ usymtab_addEntryQuiet (s, e);
+ return e;
+}
+
static usymId
usymtab_addEntryAux (/*@notnull@*/ usymtab st, /*@keep@*/ uentry e, bool isSref)
/*@globals globtab@*/
if (uentry_isFunction (e) && ctype_isFunction (ct))
{
- ct = ctype_returnValue (ct);
+ ct = ctype_getReturnType (ct);
}
if (uentry_isStatic (e))
{
- sRef sr = sRef_makeCvar (st->lexlevel, thisentry, ct);
+ sRef sr = sRef_makeCvar (st->lexlevel, thisentry, ct, stateInfo_makeLoc (uentry_whereLast (e)));
if (sRef_isStack (sr) || sRef_isLocalState (sr))
{
}
else
{
- uentry_setSref (e, sRef_makeCvar (st->lexlevel, thisentry, ct));
+ uentry_setSref (e, sRef_makeCvar (st->lexlevel, thisentry, ct, stateInfo_makeLoc (uentry_whereLast (e))));
}
-
- }
+ }
if (uentry_isDatatype (e))
{
exprChecks_checkExport (e);
}
-
uentry_checkName (e);
usymtab_addEntryQuiet (st, e);
+ DPRINTF (("Adding entry: [%p] %s", e, uentry_unparseFull (e)));
return (thisentry);
}
usymtab_addEntry (uentry e)
/*@globals utab, globtab@*/
/*@modifies utab, e@*/
-{
-
+{
llassertprint (!usymtab_exists (uentry_rawName (e)),
("Entry already exists: %s", uentry_unparse (e)));
bool staticEntry = FALSE;
int eindex;
+ DPRINTF (("Sup entry aux: %s", uentry_unparseFull (e)));
+
/* static tags in global scope */
if (st->lexlevel == fileScope
&& (!(uentry_isStatic (e)) || uentry_isAnyTag (e)))
st->entries[eindex] = st->entries[st->nentries - 1];
}
- if (st->htable != NULL)
+ if (cstringTable_isDefined (st->htable))
{
- hashTable_replaceKey (st->htable, uentry_rawName (ce),
- uentry_rawName (e));
+ cstringTable_replaceKey (st->htable, uentry_rawName (ce),
+ cstring_copy (uentry_rawName (e)));
}
uentry_free (ce);
if (uentry_isStatic (e)) {
if (uentry_isFunction (e)) {
- /* Static function declarations are at the file level, even if they are in a deeped scope. */
+ /*
+ ** Static function declarations are at the file level,
+ ** even if they are in a deeper scope.
+ */
+
st = usymtab_getFileTab ();
staticEntry = TRUE;
} else {
if (eindex != NOT_FOUND)
{
uentry ce = st->entries[eindex];
-
+
DPRINTF (("Found entry: %s", uentry_unparse (ce)));
if (uentry_isPriv (ce)
llassert ((st->lexlevel > fileScope || !sRef_modInFunction ()));
+ DPRINTF (("Overloading!"));
+
st->entries[eindex] = e;
if (uentry_isDatatype (e))
exprChecks_checkExport (e);
}
- if (st->htable != NULL)
+ if (cstringTable_isDefined (st->htable))
{
- hashTable_replaceKey (st->htable, uentry_rawName (ce),
- uentry_rawName (e));
+ cstringTable_replaceKey (st->htable, uentry_rawName (ce),
+ cstring_copy (uentry_rawName (e)));
}
uentry_free (ce);
{
if (uentry_isSpecified (e))
{
+ DPRINTF (("Here we are: %s", uentry_unparseFull (e)));
+
if (fileloc_isImport (uentry_whereSpecified (ce)))
- {
-
- if (st->htable != NULL)
+ {
+ if (cstringTable_isDefined (st->htable))
{
- hashTable_replaceKey (st->htable,
- uentry_rawName (ce),
- uentry_rawName (e));
+ cstringTable_replaceKey (st->htable,
+ uentry_rawName (ce),
+ cstring_copy (uentry_rawName (e)));
}
uentry_free (ce);
}
else
{
- /* respecification errors already reported */
-
+ /* Respecification errors already reported */
+ DPRINTF (("Respecification: %s / %s",
+ fileloc_unparse (uentry_whereSpecified (e)),
+ bool_unparse (fileloc_isSpec (uentry_whereSpecified (e)))));
+
if (uentry_isDatatype (e))
{
uentry_setDatatype (e, eindex);
}
- if (st->htable != NULL)
+ if (cstringTable_isDefined (st->htable))
{
- hashTable_replaceKey (st->htable,
- uentry_rawName (ce),
- uentry_rawName (e));
+ cstringTable_replaceKey (st->htable,
+ uentry_rawName (ce),
+ cstring_copy (uentry_rawName (e)));
}
llassert ((st->lexlevel > fileScope || !sRef_modInFunction ()));
}
else /* e not specified */
{
+ DPRINTF (("Merging..."));
+
if (uentry_isDeclared (ce))
{
- llassert ((st->lexlevel > fileScope || !sRef_modInFunction ()));
+ /* evans 2001-08-26
+ No - this can happen for internal typedefs
+ llassert ((st->lexlevel > fileScope || !sRef_modInFunction ()));
+ */
+
+ DPRINTF (("Merge defn"));
uentry_mergeDefinition (ce, e);
}
else
{
- llassert ((st->lexlevel > fileScope || !sRef_modInFunction ()));
+ /* evans 2001-08-26
+ No - this can happen for internal typedefs
+ llassert ((st->lexlevel > fileScope || !sRef_modInFunction ()));
+ */
+
+ DPRINTF (("Merge entries..."));
uentry_mergeEntries (ce, e);
+ DPRINTF (("After: %s", uentry_unparseFull (ce)));
}
}
}
}
}
+ DPRINTF (("Merge.."));
uentry_mergeDefinition (ce, e);
}
if (uentry_isFunction (ce) && ctype_isFunction (ct))
{
- ct = ctype_returnValue (ct);
+ ct = ctype_getReturnType (ct);
}
- uentry_setSref (ce, sRef_makeCvar (st->lexlevel, eindex, ct));
- }
+ uentry_setSref (ce, sRef_makeCvar (st->lexlevel, eindex, ct, stateInfo_makeLoc (uentry_whereLast (ce))));
+ }
}
else /* no previous entry */
{
outer = usymtab_lookupQuiet (st->env, ename);
+ DPRINTF (("New : [%p] %s", e, uentry_unparseFull (e)));
+ DPRINTF (("Outer: [%p] %s", outer, uentry_unparseFull (outer)));
+
/*
** no previous definition, add the new one
*/
&& uentry_isValid (outer)
&& !(uentry_isYield (e) || uentry_isYield (outer))
&& fileloc_isDefined (uentry_whereLast (e))
- && fileloc_isDefined (uentry_whereLast (outer)))
+ && !fileloc_isXHFile (uentry_whereLast (e))
+ && fileloc_isDefined (uentry_whereLast (outer))
+ && !fileloc_isXHFile (uentry_whereLast (outer)))
{
if (!uentry_sameKind (outer, e))
{
{
uentry ce = st->entries[eindex];
- if (st->htable != NULL)
+ if (cstringTable_isDefined (st->htable))
{
- hashTable_replaceKey (st->htable, uentry_rawName (ce), uentry_rawName (e));
+ cstringTable_replaceKey (st->htable, uentry_rawName (ce),
+ cstring_copy (uentry_rawName (e)));
}
uentry_free (ce);
bool stat = (tab == globtab) && uentry_isStatic (e);
uentry ret;
-
(void) usymtab_supEntryAux (tab, e, isref);
if (stat)
ret = usymtab_supEntryReturnAux (globtab, e, FALSE);
+ /*
+ ** We need to keep track of internal function declarations, so
+ ** we can remove them from the symbol table after exiting this
+ ** function. This is a bit bogus, of course.
+ */
+
if (sRef_modInFunction ())
{
recordFunctionType (ret);
/*@modifies globtab@*/
{
usymId uid;
-
+
+ DPRINTF (("Abstract? %s", uentry_unparseFull (e)));
+
if (uentry_isAbstractDatatype (e))
{
uid = usymtab_supAbstractTypeEntry (e, FALSE);
}
+ else if (uentry_isMaybeAbstract (e) && context_getFlag (FLG_IMPABSTRACT))
+ {
+ bool maybeabs = TRUE;
+ cstring sname = uentry_getName (e);
+ uentry ue = usymtab_lookupGlobSafe (sname);
+ cstring_free (sname);
+
+ if (uentry_isValid (ue))
+ {
+ DPRINTF (("Lookup: %s", uentry_unparseFull (ue)));
+
+ if (uentry_isDatatype (ue))
+ {
+ if (uentry_isMaybeAbstract (ue))
+ {
+ ;
+ }
+ else
+ {
+ maybeabs = FALSE;
+ }
+ }
+ else
+ {
+ DPRINTF (("Not datatype!"));
+ }
+ }
+
+ if (maybeabs)
+ {
+ uentry ux;
+ uid = usymtab_supAbstractTypeEntry (e, FALSE);
+ ux = usymtab_getTypeEntry (uid);
+ uentry_setAbstract (ux);
+ }
+ else
+ {
+ uid = usymtab_supEntryAux (globtab, e, FALSE);
+ e = usymtab_getTypeEntry (uid);
+
+ if (uentry_isMaybeAbstract (e))
+ {
+ uentry_setConcrete (e);
+ }
+ }
+ }
else
{
uid = usymtab_supEntryAux (globtab, e, FALSE);
+ e = usymtab_getTypeEntry (uid);
+
+ if (uentry_isMaybeAbstract (e))
+ {
+ uentry_setConcrete (e);
+ }
}
if (sRef_modInFunction ())
/*@modifies globtab, e@*/
{
usymId uid;
+ uentry ue;
+
uid = usymtab_supEntryAux (globtab, e, FALSE);
+ ue = usymtab_getTypeEntry (uid);
if (dodef)
{
- uentry ue = usymtab_getTypeEntry (uid);
uentry_setDatatype (ue, uid);
}
- if (context_getFlag (FLG_ACCESSMODULE))
+ if (context_getFlag (FLG_ACCESSMODULE)) /* was accessfile */
{
context_addFileAccessType (uid);
}
{
int i;
- if (s->htable != NULL)
- {
- i = hashTable_lookup (s->htable, k);
+ DPRINTF (("Lookup %s", k));
+ if (cstringTable_isDefined (s->htable))
+ {
+ i = cstringTable_lookup (s->htable, k);
return i;
}
else
{
uentry current = s->entries[i];
+ DPRINTF (("Check %d: %s", i, uentry_rawName (current)));
+
if (!uentry_isUndefined (current)
&& cstring_equal (uentry_rawName (current), k))
{
{
cstring sname = makeStruct (k);
uentry ue = usymtab_lookupGlob (sname);
- cstring_free (sname);
+
+ cstring_free (sname);
return (ue);
}
}
else
{
- llassert (uid >= 0 && uid < globtab->nentries);
-
+ llassert (uid >= 0 && uid < globtab->nentries);
return (globtab->entries[uid]);
}
}
return (uentry_getName (ue));
}
-static void
+# if 0
+/*@unused@*/ static void
usymtab_rehash (/*@notnull@*/ usymtab s)
{
int i;
- if (s->htable != NULL)
+ if (cstringTable_isDefined (s->htable))
{
- hashTable_free (s->htable);
+ cstringTable_free (s->htable);
}
- s->htable = hashTable_create (LLHASHSIZE);
+ s->htable = cstringTable_create (LLHASHSIZE);
for (i = 0; i < s->nentries; i++)
{
- hashTable_insert (s->htable, uentry_rawName (s->entries[i]), i);
+ cstringTable_insert (s->htable, cstring_copy (uentry_rawName (s->entries[i])), i);
}
}
+# endif
/*
** superficial copy of usymtab
name = uentry_rawName (ue);
ret = usymtab_getIndex (utab, name);
+ llassert (ret == uid); /*! for now, no rehash! */
+ DPRINTF (("Convert: %s [%d] -> %s [%d]",
+ uentry_unparse (ue), uid,
+ uentry_unparse (utab->entries[ret]), ret));
llassertprint (ret != USYMIDINVALID, ("convertId: return is invalid"));
/*@modifies oldtab, utab@*/
{
llassert (usymtab_inGlobalScope ());
-
llassert (oldtab == usymtab_undefined);
+ /*
+ DPRINTF (("Preparing to dump:"));
+ usymtab_printAll ();
+ */
+
oldtab = usymtab_shallowCopy (utab);
/*
- alpha compare - make sure order is same on different platforms
- error messages appear in same order
+ ** alpha compare - make sure order is same on different platforms
+ ** error messages appear in same order
*/
+ /*
qsort (utab->entries, (size_t)utab->nentries,
- sizeof (*utab->entries), (int (*)(const void *, const void *)) uentry_xcomparealpha);
-
+ sizeof (*utab->entries),
+ (int (*)(const void *, const void *)) uentry_xcomparealpha);
+
usymtab_rehash (utab);
+ */
+
+ /*
+ DPRINTF (("After rehash:"));
+ usymtab_printAll ();
+ */
}
-void
- usymtab_dump (FILE *fout)
- /*@globals utab, oldtab@*/
+void usymtab_dump (FILE *fout)
+ /*@globals utab, oldtab@*/
{
int i;
bool neednl = FALSE;
uentry thisentry = utab->entries[i];
ekind thisekind = uentry_getKind (thisentry);
-
- if (uentry_hasRealName (thisentry)) {
- if (thisekind != lastekind)
- {
- if (neednl)
- {
- check (fputc ('\n', fout) == (int) '\n');
- }
-
- neednl = FALSE;
- lastentry = uentry_undefined;
- fprintf (fout, "*%d (%s)\n", ekind_toInt (thisekind),
- cstring_toCharsSafe (ekind_capName (thisekind)));
- lastekind = thisekind;
- linelen = 0;
- }
-
- if (uentry_isInvalid (lastentry) || !uentry_equiv (lastentry, thisentry)
- || (linelen > (MAX_DUMP_LINE_LENGTH - (2 * MAX_NAME_LENGTH))))
- {
- cstring cdump = uentry_dump (thisentry);
-
- lastentry = thisentry;
- if (neednl)
- {
- check (fputc ('\n', fout) == (int) '\n');
- linelen = 0;
- }
-
- linelen += cstring_length (cdump);
-
- /* no new line here! */
- if (cstring_length (cdump) > 0)
- {
- check (fputs (cstring_toCharsSafe (cdump), fout) != EOF);
- }
-
- cstring_free (cdump);
- neednl = TRUE;
- }
- else
- {
- cstring cdump = uentry_rawName (thisentry);
- linelen += cstring_length (cdump);
- fprintf (fout, "#%s", cstring_toCharsSafe (cdump));
- }
- }
+ if (!uentry_hasRealName (thisentry))
+ {
+ llassert (uentry_isGlobalMarker (thisentry));
+
+ if (neednl)
+ {
+ check (fputc ('\n', fout) == (int) '\n');
+ }
+
+ fprintf (fout, "*%d (GlobalMarker)\n", KGLOBALMARKER);
+ lastekind = KINVALID;
+ linelen = 0;
+ neednl = FALSE;
+ }
+ else
+ {
+ if (thisekind != lastekind)
+ {
+ if (neednl)
+ {
+ check (fputc ('\n', fout) == (int) '\n');
+ }
+
+ neednl = FALSE;
+ lastentry = uentry_undefined;
+ fprintf (fout, "*%d (%s)\n", ekind_toInt (thisekind),
+ cstring_toCharsSafe (ekind_capName (thisekind)));
+ lastekind = thisekind;
+ linelen = 0;
+ }
+
+ /*
+ ** evans - 2001-02-18 - added the - 48 fudge factor...
+ ** extra characters dumped, but I haven't counded them carefully...
+ */
+
+ if (uentry_isInvalid (lastentry) || !uentry_equiv (lastentry, thisentry)
+ || (linelen > (MAX_DUMP_LINE_LENGTH - (2 * MAX_NAME_LENGTH) - 48)))
+ {
+ cstring cdump;
+
+ DPRINTF (("Dumping entry: %d", i));
+ cdump = message ("^%d %q", i, uentry_dump (thisentry));
+ /* was: cdump = uentry_dump (thisentry)); */
+
+ lastentry = thisentry;
+ if (neednl)
+ {
+ check (fputc ('\n', fout) == (int) '\n');
+ linelen = 0;
+ }
+
+ linelen += cstring_length (cdump);
+
+ /* no new line here! */
+ if (cstring_length (cdump) > 0)
+ {
+ check (fputs (cstring_toCharsSafe (cdump), fout) != EOF);
+ }
+
+ cstring_free (cdump);
+ neednl = TRUE;
+ }
+ else
+ {
+ cstring cdump = uentry_rawName (thisentry);
+ DPRINTF (("Raw name: %s", cdump));
+ linelen += (cstring_length (cdump) + 1);
+ fprintf (fout, "#%s", cstring_toCharsSafe (cdump));
+ }
+ }
}
if (neednl)
{
check (fputc ('\n', fout) == (int) '\n');
}
+
+ lastekind = KINVALID;
+
+ fprintf(fout, ";; Library constraints\n");
+ for (i = 0; i < utab->nentries; i++)
+ {
+ uentry thisentry = utab->entries[i];
+
+ if (uentry_isFunction (thisentry) )
+ {
+ constraintList preconditions;
+ constraintList postconditions;
+
+ preconditions = uentry_getFcnPreconditions (thisentry);
+ postconditions = uentry_getFcnPostconditions (thisentry);
+
+ if ( constraintList_isDefined(preconditions) ||
+ constraintList_isDefined(postconditions) )
+ {
+ fprintf(fout,"%s\n", cstring_toCharsSafe (uentry_rawName(thisentry) ) );
+ if (constraintList_isDefined(preconditions) )
+ {
+ fprintf(fout,"pre:\n");
+ constraintList_dump(preconditions, fout);
+ fprintf (fout, ";; end precondition constraints\n" );
+ constraintList_free(preconditions);
+ }
+ else
+ {
+ fprintf(fout,"pre:EMPTY\n");
+ }
+ if (constraintList_isDefined(postconditions) )
+ {
+ fprintf(fout,"post:\n");
+ constraintList_dump(postconditions, fout);
+ fprintf (fout, ";; end precondition constraints\n" );
+ constraintList_free(postconditions);
+ }
+ else
+ {
+ fprintf(fout,"post:EMPTY\n");
+ }
+ }
+
+ }
+ }
+
+
+
}
void usymtab_load (FILE *f)
llassert (utab == globtab);
llassert (utab->nentries == 0);
- while (fgets (s, MAX_DUMP_LINE_LENGTH, f) != NULL
+ while (((s = reader_readLine (f, s, MAX_DUMP_LINE_LENGTH)) != NULL)
&& *s == ';')
{
- ; /* ignore ;-comments */
+ /* ignore ; comments */ ;
}
-
+
while (s != NULL && *s != ';')
{
-
+ int index;
+
if (*s == '*')
{
+ int ek;
s++;
- kind = ekind_fromInt (getInt (&s));
+ ek = reader_getInt (&s);
- goto nextiter;
+ if (ek == KGLOBALMARKER)
+ {
+ uentry lue = uentry_makeGlobalMarker ();
+ DPRINTF (("Adding global marker: %s", uentry_unparseFull (lue)));
+ usymtab_addEntryAlways (utab, lue);
+ kind = KINVALID;
+ goto nextiter;
+ }
+ else
+ {
+ kind = ekind_fromInt (ek);
+ goto nextiter;
+ }
}
if (*s == '$')
"to see which library is being loaded."));
}
+ if (reader_optCheckChar (&s, '^'))
+ {
+ index = reader_getInt (&s);
+ }
+ else
+ {
+ index = -1;
+ }
+
+ llassert (kind != KINVALID);
ue = uentry_undump (kind, loc, &s);
- DPRINTF (("Load: %s", uentry_unparseFull (ue)));
+
+ llassert (utab->nentries == index || index == -1);
if (uentry_isValid (ue))
{
- ue = usymtab_addEntryBase (utab, ue);
+ int lastindex = utab->nentries;
+ ue = usymtab_addEntryAlways (utab, ue);
+ if (utab->nentries != lastindex + 1)
+ {
+ DPRINTF (("No add: %s", uentry_unparseFull (ue)));
+ BADBRANCH;
+ }
/*@-branchstate@*/
}
/*@=branchstate@*/
while (*(s++) == '#')
{
- cstring name = cstring_fromCharsO (getWord (&s));
+ cstring name = cstring_fromCharsO (reader_getWord (&s));
uentry nue = uentry_nameCopy (name, ue);
+ /*
+ DPRINTF (("Name copy: %s", uentry_unparseFull (nue)));
+ BADBRANCH;
+ */
- DPRINTF (("Name copy: %s", uentry_unparseFull (nue)));
- usymtab_addEntryBase (utab, nue);
+ usymtab_addEntryAlways (utab, nue);
}
while ((c = *s) != '\0' && (c !='\n'))
}
nextiter:
- s = fgets (os, MAX_DUMP_LINE_LENGTH, f);
+ {
+ s = reader_readLine (f, os, MAX_DUMP_LINE_LENGTH);
+ }
}
+ /*DRL added 6/21/01
+ to handle reading of buffer overflow related constraints
+ */
+ while (fgets (s, MAX_DUMP_LINE_LENGTH, f) != NULL
+ && *s == ';')
+ {
+ ; /* ignore ;-comments */
+ }
+
+ while (s != NULL && *s != ';')
+ {
+ constraintList preconditions;
+ constraintList postconditions;
+
+ cstring name = cstring_fromChars(reader_getWord(&s) );
+ cstring temp;
+ ue = usymtab_lookup ( name );
+
+ cstring_free(name);
+
+ preconditions = constraintList_undefined;
+ postconditions = constraintList_undefined;
+
+ if (!uentry_isValid(ue) )
+ {
+ llfatalbug ((message("Invalid uentry for %s library file may be corrupted", cstring_fromChars(s) ) ));
+ }
+ s = fgets (os, MAX_DUMP_LINE_LENGTH, f);
+
+ temp = cstring_fromChars (reader_getWord(&s) );
+
+ if (cstring_compareLit (temp,"pre:") == 0 )
+ {
+ preconditions = constraintList_undump (f);
+ }
+ else
+ {
+ if (cstring_compareLit (temp,"pre:EMPTY") != 0 )
+ llfatalbug ((message("Error reading library file pre:EMPTY expected but got %s", temp ) ));
+ }
+
+ cstring_free(temp);
+
+ s = fgets (os, MAX_DUMP_LINE_LENGTH, f);
+
+ temp = cstring_fromChars(reader_getWord(&s) );
+ if (cstring_compareLit (temp, "post:") == 0 )
+ {
+ postconditions = constraintList_undump (f);
+ }
+ else
+ {
+ if (cstring_compareLit (temp, "post:EMPTY") != 0 )
+ llfatalbug ((message("Error reading library file post:EMPTY expected but got %s", temp ) ));
+ }
+
+ cstring_free (temp);
+
+ uentry_setPreconditions (ue, functionConstraint_createBufferConstraint (preconditions));
+ uentry_setPostconditions (ue, functionConstraint_createBufferConstraint (postconditions));
+
+ s = fgets (os, MAX_DUMP_LINE_LENGTH, f);
+ }
+
dbgload = FALSE;
sfree (os);
}
usymtab ptab = utab->env;
uentry fcn = context_getHeader ();
-
usymtab_entries (ptab, param)
{
uentry ue;
{
sRef uref;
sRef pref = uentry_getSref (param);
-
- llassertprint (uentry_isAnyParam (param),
- ("not param: %s",
- uentry_unparseFull (param)));
-
-
- ue = uentry_makeVariable (fixParamName (uentry_rawName (param)),
- uentry_getType (param),
- fileloc_copy (uentry_whereDeclared (param)),
- FALSE);
- uentry_copyState (ue, param);
- uentry_setRefParam (ue);
+ /* Could be a global. */
- ue = usymtab_supEntrySrefReturn (ue);
-
- /* must be after supercede! */
-
- if (!sRef_stateKnown (pref))
- {
- uentry_setDefState (ue, SS_DEFINED);
- uentry_setDefState (param, SS_DEFINED);
- }
- else
- {
- if (sRef_isStateSpecial (pref))
+ if (uentry_isAnyParam (param))
+ {
+ ue = uentry_makeVariable (fixParamName (uentry_rawName (param)),
+ uentry_getType (param),
+ fileloc_copy (uentry_whereDeclared (param)),
+ FALSE);
+
+ uentry_copyState (ue, param);
+ uentry_setRefParam (ue);
+
+ ue = usymtab_supEntrySrefReturn (ue);
+
+ /* must be after supercede! */
+
+ if (!sRef_stateKnown (pref))
{
- uentry_setDefState (ue, SS_ALLOCATED);
+ uentry_setDefState (ue, SS_DEFINED);
+ uentry_setDefState (param, SS_DEFINED);
}
else
{
- uentry_setDefState (ue, sRef_getDefState (pref));
- }
- }
-
- uref = uentry_getSref (ue);
-
- if (sRef_isStack (uref))
- {
- alkind pkind = sRef_getAliasKind (pref);
-
- if (alkind_isKnown (pkind) && !alkind_isLocal (pkind)
- && !alkind_isStack (pkind))
- {
- sRef_setAliasKind (uref, pkind, fileloc_undefined);
- sRef_setOrigAliasKind (uref, pkind);
+ if (sRef_isStateSpecial (pref))
+ {
+ uentry_setDefState (ue, SS_ALLOCATED);
+ }
+ else
+ {
+ uentry_setDefState (ue, sRef_getDefState (pref));
+ }
}
- else
+
+ uref = uentry_getSref (ue);
+
+ if (sRef_isStack (uref))
{
- sRef_setAliasKind (uref, AK_IMPTEMP, fileloc_undefined);
- sRef_setOrigAliasKind (uref, AK_IMPTEMP);
-
- if (uentry_isOut (param))
+ alkind pkind = sRef_getAliasKind (pref);
+
+ if (alkind_isKnown (pkind) && !alkind_isLocal (pkind)
+ && !alkind_isStack (pkind))
{
- ;
+ sRef_setAliasKind (uref, pkind, fileloc_undefined);
+ sRef_setOrigAliasKind (uref, pkind);
}
else
{
- sRef_setDefined (uref, fileloc_undefined);
+ sRef_setAliasKind (uref, AK_IMPTEMP, fileloc_undefined);
+ sRef_setOrigAliasKind (uref, AK_IMPTEMP);
+
+ if (uentry_isOut (param))
+ {
+ ;
+ }
+ else
+ {
+ sRef_setDefined (uref, fileloc_undefined);
+ }
}
+
}
+
+ usymtab_addMustAlias (uref, pref);
+
+ if (!(uentry_isOnly (param) || uentry_isUnique (param)))
+ {
+ /*
+ ** This is needed for detecting possibly aliased parameters.
+ */
- }
-
- usymtab_addMustAlias (uref, pref);
-
- if (!(uentry_isOnly (param) || uentry_isUnique (param)))
- {
- sRef s = sRef_makeExternal (uref);
-
- usymtab_addMustAlias (uref, s);
- }
-
- if (sRef_isKillRef (pref))
- {
- sRef_setAliasKind (uref, AK_NEWREF, fileloc_undefined);
- sRef_setOrigAliasKind (uref, AK_KILLREF);
- }
- else if (sRef_isRefCounted (uref))
- {
- sRef_setOrigAliasKind (uref, AK_REFCOUNTED);
+ sRef s = sRef_makeExternal (uref);
+ usymtab_addMustAlias (uref, s);
+ }
+
+ if (sRef_isKillRef (pref))
+ {
+ sRef_setAliasKind (uref, AK_NEWREF, fileloc_undefined);
+ sRef_setOrigAliasKind (uref, AK_KILLREF);
+ }
+ else if (sRef_isRefCounted (uref))
+ {
+ sRef_setOrigAliasKind (uref, AK_REFCOUNTED);
+ }
+ else
+ {
+ /* was AK_UNIQUE */
+ sRef_setOrigAliasKind (uref, AK_LOCAL);
+ }
}
else
{
- /* was AK_UNIQUE */
- sRef_setOrigAliasKind (uref, AK_LOCAL);
}
}
- else
- {
- }
} end_usymtab_entries;
-
-
- if (uentry_hasSpecialClauses (fcn))
+
+
+ if (uentry_hasStateClauseList (fcn))
{
- specialClauses clauses = uentry_getSpecialClauses (fcn);
-
- specialClauses_preElements (clauses, cl)
+ stateClauseList clauses = uentry_getStateClauseList (fcn);
+
+ stateClauseList_preElements (clauses, cl)
{
- sRefSet refs = specialClause_getRefs (cl);
- sRefMod modf = specialClause_getEntryFunction (cl);
-
+ fileloc loc = stateClause_loc (cl);
+ sRefSet osrs = sRefSet_undefined;
+ sRefSet srs;
+
+ if (stateClause_isGlobal (cl))
+ {
+ DPRINTF (("Global Marker: %s",
+ sRef_unparseFull (usymtab_lookupGlobalMarker ())));
+ llassert (sRef_isGlobalMarker (usymtab_lookupGlobalMarker ()));
+ srs = sRefSet_single (usymtab_lookupGlobalMarker ());
+ osrs = srs;
+ }
+ else
+ {
+ srs = stateClause_getRefs (cl);
+ }
- sRefSet_elements (refs, el)
+ sRefSet_elements (srs, el)
{
sRef base = sRef_getRootBase (el);
-
+ sRef sb = sRef_updateSref (el);
+
if (sRef_isResult (base))
{
; /* nothing to do before */
}
- else if (sRef_isParam (base))
+ else if (sRef_isParam (base) || sRef_isGlobalMarker (base))
{
- if (modf != NULL)
+ if (stateClause_setsMetaState (cl))
{
- sRef sb = sRef_updateSref (el);
- sRefSet aliases = usymtab_allAliases (sb);
+ /* copied from exprNode.c:3040 */
+ qual ql = stateClause_getMetaQual (cl);
+ annotationInfo ainfo = qual_getAnnotationInfo (ql);
+ metaStateInfo minfo = annotationInfo_getState (ainfo);
+ cstring key = metaStateInfo_getName (minfo);
+ int mvalue = annotationInfo_getValue (ainfo);
- modf (sb, fileloc_undefined);
-
- sRefSet_elements (aliases, sr)
+ DPRINTF (("Sets meta state! %s", stateClause_unparse (cl)));
+
+ if (sRef_isResult (base))
{
- modf (sr, fileloc_undefined);
- } end_sRefSet_elements ;
-
- sRefSet_free (aliases);
+ BADBRANCH;
+ }
+ else
+ {
+ sRef_setMetaStateValueComplete (sb, key, mvalue, loc);
+ }
+ }
+ else
+ {
+ sRefMod modf = stateClause_getEntryFunction (cl);
+
+ if (modf != NULL)
+ {
+ sRefSet aliases = usymtab_allAliases (sb);
+
+ modf (sb, loc);
+
+ sRefSet_elements (aliases, sr)
+ {
+ modf (sr, loc);
+ } end_sRefSet_elements ;
+
+ sRefSet_free (aliases);
+ }
}
}
else
{
if (sRef_isValid (base))
{
+ DPRINTF (("Base: %s", sRef_unparseFull (base)));
BADBRANCH;
}
}
} end_sRefSet_elements ;
- } end_specialClauses_preElements ;
+ } end_stateClauseList_preElements ;
}
- }
-
+}
+
void
usymtab_enterFunctionScope (uentry fcn)
/*@globals utab, filetab, globtab@*/
{
if (utab->lexlevel > fileScope)
{
- llparseerror (cstring_makeLiteral ("New function scope inside function."));
+ llparseerror (cstring_makeLiteral ("New function scope inside function"));
while (utab->lexlevel > fileScope)
{
}
/*@-branchstate@*/ } /*@=branchstate@*/
+ utab = t;
+
+ DPRINTF (("Globs: %s", globSet_unparse (uentry_getGlobs (fcn))));
+
globSet_allElements (uentry_getGlobs (fcn), el)
{
+ DPRINTF (("Here we go: %s", sRef_unparseFull (el)));
if (sRef_isUndefGlob (el))
{
int index = sRef_getScopeIndex (el);
sRef sr = sRef_updateSref (el);
fileloc loc = uentry_whereEarliest (fcn);
-
+
+ DPRINTF (("update: %s", sRef_unparseFull (sr)));
+ DPRINTF (("Undef!"));
if (sRef_isFileStatic (el))
{
ctype ct = sRef_getType (el);
}
else
{
- /* defined */ ;
+ /*
+ sRef sr = sRef_updateSref (el);
+ fileloc loc = uentry_whereEarliest (fcn);
+
+ sRef_setDefined (sr, loc);
+ */
+
+ /* defined */
+ /* shouldn't need to do anything! */
}
} end_globSet_allElements;
- utab = t;
+ DPRINTF (("Globs after: %s", globSet_unparse (uentry_getGlobs (fcn))));
}
static void
usymtab t = usymtab_create (US_SWITCH, utab, FALSE);
t->aliases = aliasTable_copy (utab->aliases);
- utab = t;
+ utab = t;
}
void
guardSet_free (t->guards);
t->guards = guards;
-
- aliasTable_free (t->aliases);
+
+ aliasTable_free (t->aliases);
t->aliases = aliasTable_copy (utab->aliases);
- utab = t;
+ utab = t;
}
/*
*/
void
-usymtab_popTrueBranch (exprNode pred, exprNode expr, clause cl)
+usymtab_popTrueBranch (exprNode pred, exprNode expr, clause cl) /*@modifies utab@*/
{
/*
** add a false branch
** it is better to only maintain one version of the code)
*/
- usymtab_altBranch (guardSet_invert (exprNode_getGuards (pred)));
- usymtab_popBranches (pred, expr, exprNode_undefined, TRUE, cl);
+ if (utab->kind != US_TBRANCH
+ && context_inIterDef ())
+ {
+ usymtab_exitScope (expr);
+ }
+ else
+ {
+ DPRINTF (("pop true branch.."));
+ usymtab_altBranch (guardSet_invert (exprNode_getGuards (pred)));
+ usymtab_popBranches (pred, expr, exprNode_undefined, TRUE, cl);
+ }
}
void
usymtab otab= utab;
int i = 0;
- llassert (utab->kind == US_TBRANCH);
+ llassert (utab->kind == US_TBRANCH);
/*
** merge each entry in table with its original
/*@notnull@*/ usymtab ftab, bool trueGuard)
{
sRef base = sRef_getRootBase (el);
- int level = sRef_lexLevel (base);
-
-
+ int level = sRef_lexLevel (base);
if (sRef_isCvar (base))
{
}
else
{
- }
-
- }
-
- }
+ ;
+ }
+ }
+}
void
usymtab_popBranches (exprNode pred, exprNode tbranch, exprNode fbranch,
sRefSet fguards = guardSet_getFalseGuards (guards);
bool mustReturnT = exprNode_mustEscape (tbranch);
bool mustReturnF = exprNode_mustEscape (fbranch);
-
+
+ DPRINTF (("Pop branches: %s [mustreturn: %s/%s]", exprNode_unparse (pred),
+ bool_unparse (mustReturnT),
+ bool_unparse (mustReturnF)));
+
if (exprNode_isDefined (fbranch))
{
loc = exprNode_loc (fbranch);
**
** if an entry is in one table, merge it with the original.
*/
-
+
+ DPRINTF (("ftab: %d", ftab->nentries));
+
for (i = 0; i < ftab->nentries; i++)
{
uentry fthis = ftab->entries[i];
uentry old = usymtab_lookupAux (env, uentry_rawName (fthis));
int tindex = usymtab_getIndex (ttab, uentry_rawName (fthis));
+ DPRINTF (("Entry: %s / %s", uentry_unparseFull (fthis), uentry_unparseFull (old)));
+
if (uentry_isUndefined (old))
{
/* possible entry was added as an undefined id */
+ DPRINTF (("Undefined! %s", uentry_rawName (fthis)));
continue;
}
if (tindex != NOT_FOUND)
{
uentry tthis = ttab->entries[tindex];
-
+
/* note that is this is in a nested branch,
it may create a "new" old entry. */
{
if (!mustReturnT)
{
-
uentry_mergeState (fthis, tthis, loc,
mustReturnT, FALSE, FALSE, cl);
}
{
uentry current = ttab->entries[i];
+ DPRINTF (("ttab: %s", uentry_unparseFull (current)));
+
if (!uentry_isUndefined (current))
{
uentry old = usymtab_lookupAux (env, uentry_rawName (current));
- llassertprint (!uentry_isUndefined (old), ("name: <%s>",
- uentry_rawName (current)));
+ DPRINTF (("Old: %s", uentry_unparseFull (old)));
+
+ if (uentry_isUndefined (old))
+ {
+ llcontbug (message ("Undefined entry: %s", uentry_rawName (current)));
+ continue;
+ }
+
if (mustReturnF)
{
uentry_mergeUses (current, old);
else
{
/*
- ** assumes false branch is a fall-through if
+ ** Assumes false branch is a fall-through if
** fbranch is not defined. This is true, unless
** where was some greivous error in processing
** the else branch of an if-then, in which case
uentry_mergeState (old, current, loc, mustReturnT,
FALSE, isOpt, cl);
}
+
+ DPRINTF (("==> %s", uentry_unparseFull (old)));
}
}
-
/*
** Plain levelUnion doesn't work, since we need to use the sRef's in env->aliases
ftab->aliases, env->lexlevel);
aliasTable_fixSrefs (env->aliases);
+
+ DPRINTF (("Aliases: %s", aliasTable_unparse (env->aliases)));
/* exit true and false scopes */
usymtab_quietPlainExitScope ();
usymtab_altBranch (/*@only@*/ guardSet guards)
/*@modifies utab@*/
{
- usymtab t = usymtab_create (US_FBRANCH, utab, FALSE);
+ usymtab t;
usymtab parent = utab->env;
+ t = usymtab_create (US_FBRANCH, utab, FALSE);
+
/*
** If we are in a case, need to close it. The C syntax
** is very liberal, so this kludge is necessary.
usymtab_fixCases ();
DPRINTF (("Current kind: %s", usymtab_unparseStack ()));
+
llassert (utab->kind == US_TBRANCH);
llassert (parent != GLOBAL_ENV);
-
+
guardSet_free (t->guards);
t->guards = guards;
-
+
aliasTable_free (t->aliases);
t->aliases = aliasTable_copy (parent->aliases);
-
+
utab = t;
}
{
fileloc dloc = uentry_whereDeclared (e);
- if (fileloc_isLib (dloc))
+ if (fileloc_isLib (dloc) || fileloc_isXHFile (dloc))
{
;
}
ekind_capName (uentry_getKind (e)),
uentry_getName (e)),
dloc);
+ DPRINTF (("decl: %s", uentry_unparseFull (e)));
}
}
}
if (fileloc_isDefined (fwhere)
&& !fileloc_isHeader (fwhere)
+ && !fileloc_isXHFile (fwhere)
&& !(fileloc_isSpecialFile (fwhere)
&& !context_getFlag (FLG_UNUSEDSPECIAL)))
{
/*@globals utab@*/
{
int i;
-
for (i = 0; i < utab->nentries; i++)
{
uentry ce = utab->entries[i];
-
if (!uentry_isDatatype (ce) && !uentry_isAnyTag (ce)
&& !uentry_isEitherConstant (ce)
; /* no errors */
}
} /* unused */
- else if (uentry_isDatatype (ce) || uentry_isAnyTag (ce))
+ else if ((uentry_isDatatype (ce) || uentry_isAnyTag (ce)))
{ /* check all fields */
ctype ct = uentry_getRealType (ce);
ct = ctype_getBaseType (ct);
}
-
if (ctype_isSU (ct))
{
uentryList fields = ctype_getFields (ct);
}
else
{
+ /*
+ ** evans 2001-06-08
+ ** Can't report these errors for unnamed structs.
+ ** No way to tell when there are multiple consistent
+ ** unnamed structure types. (Could go through table
+ ** and mark them all unused...)
+
hasError |= optgenerror
(FLG_FIELDUNUSED,
message ("Field %q of unnamed %s declared but not used",
cstring_makeLiteralTemp
(ctype_isStruct (ct) ? "structure" : "union")),
uentry_whereEarliest (field));
+
+ */
}
uentry_setUsed (field, fileloc_undefined);
{
sRef sr = uentry_getSref (glob);
-
+ DPRINTF (("Check global return: %s / orig: %s / sr: %s",
+ uentry_unparseFull (glob),
+ sRef_unparseFull (orig),
+ sRef_unparseFull (sr)));
+
+ DPRINTF (("Is killed: %s", bool_unparse (sRef_isKilledGlob (orig))));
+
if (context_getFlag (FLG_GLOBSTATE))
{
+ DPRINTF (("Is killed: %s", sRef_unparseFull (orig)));
+
if (sRef_isKilledGlob (orig))
{
if (sRef_isStateUndefined (sr)
if (optgenerror
(FLG_GLOBSTATE,
message
- ("Killed global %q not released before return",
- uentry_getName (glob)),
+ ("Killed global %q (type %s) not released before return",
+ uentry_getName (glob),
+ ctype_unparse (ct)),
g_currentloc))
{
sRef_showStateInfo (sr);
- }
+ }
}
else
{
- sRef_protectDerivs ();
+ sRef_protectDerivs ();
(void) checkGlobalDestroyed (sr, g_currentloc);
sRef_clearProtectDerivs ();
}
}
else
{
- if (sRef_isDead (sr))
+ if (sRef_isDead (sr) || sRef_isKept (sr))
{
if (optgenerror
(FLG_GLOBSTATE,
message ("Function returns with global %q "
- "referencing released storage",
- uentry_getName (glob)),
+ "referencing %s storage",
+ uentry_getName (glob),
+ cstring_makeLiteralTemp (sRef_isDead (sr) ? "released" : "kept")),
g_currentloc))
{
- sRef_showStateInfo (sr);
+ if (sRef_isKept (sr))
+ {
+ sRef_showAliasInfo (sr);
+ }
+ else
+ {
+ sRef_showStateInfo (sr);
+ }
+
sRef_setDefState (sr, SS_UNKNOWN, fileloc_undefined);
}
}
- if (ctype_isRealPointer (uentry_getType (glob)) &&
- sRef_possiblyNull (sr) && !uentry_possiblyNull (glob))
+ if (ctype_isRealPointer (uentry_getType (glob))
+ && sRef_possiblyNull (sr)
+ && !uentry_possiblyNull (glob))
{
if (optgenerror
(FLG_GLOBSTATE,
uentry ce = stab->entries[i];
sRef sr = uentry_getSref (ce);
sRef rb = sRef_getRootBase (sr);
+ valueTable tvalues;
+
+ /*
+ ** Shouldn't check if shadow checked in deeper scope:
+ */
+
+ if (stab != utab)
+ {
+ uentry oue = usymtab_lookupQuietNoAlt (utab, uentry_observeRealName (ce));
+ 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? */
+ /*@innercontinue@*/ continue;
+ }
+ }
+
+ DPRINTF (("Here check final scope: %s", uentry_unparseFull (ce)));
+
if (ctype_isFunction (uentry_getType (ce)))
{
/*@innercontinue@*/ continue;
}
+ if (uentry_isAnyParam (ce)
+ || uentry_isRefParam (ce)
+ || sRef_isFileOrGlobalScope (rb))
+ {
+ /* Don't do the loseref check...but should check state! */
+ }
+ else if (sRef_isDefinitelyNull (sr)
+ || usymtab_isDefinitelyNull (sr))
+ {
+ /*
+ ** No state reference errors for definitely null references.
+ */
+ }
+ else
+ {
+ DPRINTF (("Lose ref: %s / %s", uentry_unparse (ce),
+ sRef_unparseFull (sr)));
+
+ tvalues = sRef_getValueTable (sr);
+
+ valueTable_elements (tvalues, fkey, fval) {
+ metaStateInfo minfo;
+ cstring msg = cstring_undefined;
+ int nval;
+
+ minfo = context_lookupMetaStateInfo (fkey);
+ llassert (metaStateInfo_isDefined (minfo));
+
+ if (stateValue_isError (fval)
+ || sRef_isStateUndefined (sr)) /* No errors for undefined state */
+ {
+ ;
+ }
+ else
+ {
+ DPRINTF (("Check: %s / %s / %s", fkey,
+ metaStateInfo_unparse (minfo),
+ stateValue_unparse (fval)));
+
+ minfo = context_lookupMetaStateInfo (fkey);
+
+ nval = stateCombinationTable_lookupLoseReference
+ (metaStateInfo_getTransferTable (minfo),
+ stateValue_getValue (fval), &msg);
+
+ 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
+ ("%s loses reference %q in invalid state %q (%s)",
+ cstring_makeLiteralTemp (isReturn ? "Return" : "Scope exit"),
+ uentry_getName (ce),
+ stateValue_unparseValue (fval, minfo),
+ msg),
+ g_currentloc))
+ {
+ stateValue_show (fval, minfo);
+ }
+ else
+ {
+ DPRINTF (("Suppressed transfer error: %s", msg));
+ }
+ }
+ }
+ } end_valueTable_elements;
+ }
+
if (mustFree)
{
DPRINTF (("Check entry: %s", uentry_unparseFull (ce)));
-
- if (!sRefSet_member (checked, sr) && !sRef_isGlobal (rb))
+
+ if (!sRefSet_member (checked, sr) && !sRef_isFileOrGlobalScope (rb))
{
if (ctype_isRealSU (uentry_getType (ce))
&& !uentry_isAnyParam (ce)
&& !sRef_isOwned (sr))
{
sRefSet als = usymtab_allAliases (sr);
-
if (sRefSet_isEmpty (als))
{
|| sRef_isKeep (sr) || sRef_isOwned (sr))
&& !sRef_isDead (sr))
&& (!sRef_definitelyNull (sr))
- && (!usymtab_isProbableNull (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 (canLoseReference (sr, g_currentloc))
{
+ DPRINTF (("Can lose!"));
hasError = FALSE;
}
}
{
if (ctype_isRealSU (sRef_getType (sr)))
{
- checkStructDestroyed (sr, g_currentloc);
+ checkStructDestroyed (sr, g_currentloc);
}
else
{
+ DPRINTF (("Here we are: %s", sRef_unparseFull (sr)));
+
if (optgenerror
(FLG_MUSTFREE,
message
g_currentloc))
{
sRef_showAliasInfo (sr);
+ DPRINTF (("Storage: %s", sRef_unparseFull (sr)));
}
}
}
/*
** also check state is okay
*/
-
+
if (usymtab_lexicalLevel () > functionScope
&& uentry_isVariable (ce)
&& (sRef_isLocalVar (sr)
if (sRefSet_isEmpty (ab))
{
/* and no local ref */
+ DPRINTF (("Check lose ref: %s", uentry_unparseFull (ce)));
checkLoseRef (ce);
}
else
checked = sRefSet_insert (checked, sr);
}
}
+
llassert (usymtab_isDefined (stab->env));
if (usymtab_isBranch (stab))
{
stab = stab->env;
}
-
+
llassert (stab != usymtab_undefined);
} while (isReturn && (stab->lexlevel >= paramsScope));
-
- sRefSet_free (checked);
-
+
+ sRefSet_free (checked);
+
/*
** for returns:
** all globals are appropriately defined
uentryList params = context_getParams ();
globSet uglobs = context_getUsedGlobs ();
globSet sglobs = context_getGlobs ();
-
if (isReturn && context_maybeSet (FLG_GLOBALIAS))
{
}
/*
- ** special clauses (defines, sets, allocates, releases)
+ ** state clauses (ensures, defines, sets, allocates, releases)
*/
-
- if (uentry_hasSpecialClauses (fcn))
+
+ if (uentry_hasStateClauseList (fcn))
{
- specialClauses clauses = uentry_getSpecialClauses (fcn);
+ stateClauseList clauses = uentry_getStateClauseList (fcn);
- specialClauses_elements (clauses, cl)
+ stateClauseList_elements (clauses, cl)
{
- if (specialClause_isAfter (cl))
- { /* evs - 2000 07 10 - added this */
- sRefTest tst = specialClause_getPostTestFunction (cl);
- sRefSet rfs = specialClause_getRefs (cl);
-
- sRefSet_elements (rfs, el)
+ if (stateClause_isAfter (cl) && !stateClause_isGlobal (cl))
+ {
+ if (stateClause_setsMetaState (cl))
{
- sRef base = sRef_getRootBase (el);
-
- if (sRef_isResult (base))
- {
- ;
- }
- else if (sRef_isParam (base))
+ sRefSet rfs = stateClause_getRefs (cl);
+ qual q = stateClause_getMetaQual (cl);
+ annotationInfo ainfo = qual_getAnnotationInfo (q);
+ metaStateInfo minfo = annotationInfo_getState (ainfo);
+ cstring key = metaStateInfo_getName (minfo);
+ int mvalue = annotationInfo_getValue (ainfo);
+
+ DPRINTF (("Post meta state clause: %s", stateClause_unparse (cl)));
+
+ sRefSet_elements (rfs, el)
{
- sRef sr = sRef_updateSref (base);
- sr = sRef_fixBase (el, sr);
+ sRef base = sRef_getRootBase (el);
- if (tst != NULL && !tst (sr))
+ if (sRef_isResult (base))
{
- if (optgenerror
- (specialClause_postErrorCode (cl),
- message ("%s storage %qcorresponds to "
- "storage listed in %q clause",
- specialClause_postErrorString (cl, sr),
- sRef_unparseOpt (sr),
- specialClause_unparseKind (cl)),
- g_currentloc))
+ /*
+ ** This is checked for return transfers.
+ */
+ ;
+ }
+ else if (sRef_isParam (base) || sRef_isGlobalMarker (base))
+ {
+ sRef sr = sRef_updateSref (base);
+ sr = sRef_fixBase (el, sr);
+
+ if (!sRef_checkMetaStateValue (sr, key, mvalue))
{
- sRefShower ss = specialClause_getPostTestShower (cl);
-
- if (ss != NULL)
+ if (optgenerror
+ (FLG_STATETRANSFER,
+ message
+ ("Ensures clause not satisfied%q (state is %q): %q",
+ sRef_isGlobalMarker (sr)
+ ? message ("")
+ : message (" by %q", sRef_unparse (sr)),
+ stateValue_unparseValue (sRef_getMetaStateValue (sr, key),
+ minfo),
+ stateClause_unparse (cl)),
+ g_currentloc))
{
- ss (sr);
- }
- }
+ sRef_showMetaStateInfo (sr, key);
+ }
+ }
}
- }
- else
+ else
+ {
+ if (sRef_isMeaningful (el))
+ {
+ BADBRANCH;
+ }
+ }
+ } end_sRefSet_elements ;
+ }
+ else
+ {
+ /* evs - 2000 07 10 - added this */
+ sRefTest tst = stateClause_getPostTestFunction (cl);
+ sRefSet rfs = stateClause_getRefs (cl);
+
+ sRefSet_elements (rfs, el)
{
- if (sRef_isMeaningful (el))
+ sRef base = sRef_getRootBase (el);
+
+ if (sRef_isResult (base))
{
- BADBRANCH;
+ /*
+ ** This is checked for return transfers.
+ */
+
+ ;
}
- }
- } end_sRefSet_elements ;
+ else if (sRef_isParam (base))
+ {
+ sRef sr = sRef_updateSref (base);
+ sr = sRef_fixBase (el, sr);
+
+ if (tst != NULL && !tst (sr))
+ {
+ if (optgenerror
+ (stateClause_postErrorCode (cl),
+ message ("%s storage %qcorresponds to "
+ "storage listed in %q clause",
+ stateClause_postErrorString (cl, sr),
+ sRef_unparseOpt (sr),
+ stateClause_unparseKind (cl)),
+ g_currentloc))
+ {
+ sRefShower ss = stateClause_getPostTestShower (cl);
+
+ if (ss != NULL)
+ {
+ ss (sr);
+ }
+
+ DPRINTF (("Storage: %s", sRef_unparseFull (sr)));
+ }
+ }
+ }
+ else
+ {
+ if (sRef_isMeaningful (el))
+ {
+ BADBRANCH;
+ }
+ }
+ } end_sRefSet_elements ;
+ }
}
- } end_specialClauses_elements ;
+ } end_stateClauseList_elements ;
}
/*
if (ctype_isMutable (rt) || ctype_isSU (rt))
{
uentry param = usymtab_lookupQuiet (utab, uentry_rawName (arg));
+ DPRINTF (("Check param return: %s", uentry_unparseFull (param)));
checkParamReturn (param);
}
}
} end_uentryList_elements;
+ DPRINTF (("Check global return: %s",
+ globSet_unparse (sglobs)));
+
globSet_allElements (sglobs, el)
{
+ sRef orig = el; /*! sRef_updateSref (el); */ /*!!!*/
uentry current = sRef_getUentry (el);
+ DPRINTF (("Check global return: %s / %s", sRef_unparseFull (el),
+ uentry_unparseFull (current)));
+
if (uentry_isVariable (current) && !uentry_isRealFunction (current))
{
- checkGlobalReturn (current, el);
+ checkGlobalReturn (current, orig);
}
} end_globSet_allElements;
{
uentry current = sRef_getUentry (el);
-
if (uentry_isVariable (current)
&& !uentry_isRealFunction (current))
{
}
}
} end_globSet_allElements;
- }
-
- }
+ }
+}
void
usymtab_quietExitScope (fileloc loc)
usymtab ctab = usymtab_undefined;
usymtab lctab = usymtab_undefined;
bool mustReturn = exprNode_mustEscape (expr);
-
+
+ DPRINTF (("Exit scope"));
+
if (utab->kind == US_CBRANCH)
{
/*
/* 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 ()));
+ 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
llassert (utab != GLOBAL_ENV);
}
} else {
- llcontbug (("exitScope: in branch: %s", usymtab_unparseStack ()));
+ llcontbug (message ("exitScope: in branch: %q", usymtab_unparseStack ()));
/*@-branchstate@*/
} /*@=branchstate@*/
}
/*@i@*/ lctab->env = utab;
/*@i@*/ utab = ctab;
/*@-branchstate@*/ } /*@=branchstate@*/
-/*@-globstate@*/
-}
+ /*@-globstate@*/
+/*@i523@*/ }
/*@=globstate@*/
/*
if (sRef_lexLevel (sr) == functionScope)
{
- /*@access sRef@*/ /*@-null@*/
- int index = sr->info->cvar->index;
- /*@noaccess sRef@*/ /*@=null@*/
+ int index;
+
+ /*@access sRef@*/
+ llassert (sr->info != NULL);
+ llassert (sr->info->cvar != NULL);
+ index = sr->info->cvar->index;
+ /*@noaccess sRef@*/
if (index < uentryList_size (context_getParams ()))
{
{
uentry ue;
-
ue = usymtab_getRefNoisy (u, level, index);
-
if (uentry_isUndefined (ue))
{
llbug (message ("usymtab_getRef: out of range: %d. level = %d",
index, level));
}
-
return ue;
}
llassert (index >= 0);
if (level > s->lexlevel)
- {
-
+ {
return uentry_undefined;
}
{
usymtab otab = s;
uentry ue = uentry_undefined;
-
llassert (index >= 0);
-
while (s->lexlevel > level)
{
-
if (usymtab_isBranch (s))
{
int eindex = refTable_lookup (s, level, index);
}
else
{
- }
+ }
}
-
+
return ue;
}
llassert (rt != NULL);
-
for (i = 0; i < ut->nentries; i++)
{
if (rt[i]->level == level && rt[i]->index == index)
{
- return i;
+ return i;
}
}
-
- return NOT_FOUND;
+
+ return NOT_FOUND;
}
static
int eindex;
usymtab ut = s;
- llassert (ut->reftable != NULL);
+ if (ut->reftable == NULL)
+ {
+ DPRINTF (("Adding ref entry without reftable: %s", k));
+ return uentry_undefined;
+ }
+ llassert (ut->reftable != NULL);
+
while (s != GLOBAL_ENV)
{
eindex = usymtab_getIndex (s, k);
{
uentry ue;
- DPRINTF (("Here: copying %s", uentry_unparseFull (current)));
-
+ DPRINTF (("Here: copying %s", uentry_unparse (current)));
ue = uentry_copy (current);
-
- DPRINTF (("Here: copying %s", uentry_unparseFull (ue)));
-
+ DPRINTF (("Here: copying %s", uentry_unparse (ue)));
usymtab_addEntryQuiet (ut, ue);
-
+ DPRINTF (("Okay..."));
+
if (s->reftable != NULL)
{
refentry ref = s->reftable[eindex];
-
ut->reftable[ut->nentries - 1]
= refentry_create (ref->level, ref->index);
if (eindex != NOT_FOUND)
{
uentry ret = s->entries[eindex];
+# if 0
+
+ if (s->kind == US_TBRANCH
+ || s->kind == US_FBRANCH
+ || s->kind == US_CBRANCH)
+ /* uentry_isGlobalVariable (ret) && os->lexlevel > fileScope) */
+ {
+ uentry ret;
+ DPRINTF (("Adding global ref entry: %s", k));
+ ret = usymtab_addRefEntry (os, k);
+ DPRINTF (("Adding ref entry: %s", uentry_unparseFull (ret)));
+ return ret;
+ }
+
+# endif
DPRINTF (("Found: %s", uentry_unparseFull (ret)));
return (ret);
}
-
+
if (s->kind == US_TBRANCH || s->kind == US_FBRANCH
|| s->kind == US_CBRANCH)
{
+ /* why isn't this os??? */
uentry ret = usymtab_addRefEntry (s, k);
- DPRINTF (("Ref entry: %s", uentry_unparseFull (ret)));
+ DPRINTF (("Adding ref entry: %s", uentry_unparseFull (ret)));
return ret;
}
}
static /*@dependent@*/ /*@exposed@*/ uentry
-usymtab_lookupQuiet (usymtab s, cstring k)
+usymtab_lookupQuietAux (usymtab s, cstring k, bool noalt)
{
int eindex;
return (ret);
}
- s = s->env;
+ if (noalt && usymtab_isBranch (s))
+ {
+ s = usymtab_dropEnv (s);
+ }
+ else
+ {
+ s = s->env;
+ }
}
return uentry_undefined;
}
+static /*@exposed@*/ /*@dependent@*/ uentry
+usymtab_lookupQuiet (usymtab s, cstring k)
+{
+ return usymtab_lookupQuietAux (s, k, FALSE);
+}
+
+static /*@exposed@*/ /*@dependent@*/ uentry
+usymtab_lookupQuietNoAlt (usymtab s, cstring k)
+{
+ return usymtab_lookupQuietAux (s, k, TRUE);
+}
+
/*@dependent@*/ /*@observer@*/ uentry
usymtab_lookupSafe (cstring k)
/*@globals utab@*/
{
int i;
- if (fileloc_isSpec (g_currentloc)) return (ctype_undefined);
+ DPRINTF (("Fields: %s", uentryList_unparse (f)));
+
+ if (fileloc_isSpec (g_currentloc))
+ {
+ return (ctype_undefined);
+ }
for (i = 0; i < globtab->nentries; i++)
{
if (isFakeTag (uentry_rawName (current)))
{
ctype ct = uentry_getType (current);
+
+ DPRINTF (("Check: %s", ctype_unparse (ct)));
if ((isStruct ? ctype_isStruct (ct) : ctype_isUnion (ct))
- && (uentryList_matchFields (f, ctype_getFields (ct))))
+ &&
+ (uentry_isSpecified (current)
+ && uentryList_equivFields (f, ctype_getFields (ct))))
+ {
+ return uentry_getAbstractType (current);
+ }
+ else
{
- return uentry_getAbstractType (current);
+ ;
}
}
}
/*@globals utab@*/
{
uentry ce = usymtab_lookupSafe (k);
-
return (!(uentry_isUndefined (ce)) && !(uentry_isPriv (ce)));
}
usymtab_existsTypeEither (cstring k)
/*@globals globtab@*/
{
- uentry ce = usymtab_lookupAux (globtab, k);
-
- return (uentry_isValid (ce) && uentry_isDatatype (ce));
+ uentry ce;
+ ce = usymtab_lookupAux (globtab, k);
+ return (uentry_isValid (ce) && uentry_isDatatype (ce));
}
bool
{
cstring sname = makeStruct (k);
uentry ce = usymtab_lookupAux (globtab, sname);
-
- cstring_free (sname);
-
-
+ cstring_free (sname);
return (!(uentry_isUndefined (ce)) && !(uentry_isPriv (ce)));
}
int i;
aliasTable_free (u->aliases);
- environmentTable_free (u->environment);
+
refTable_free (u->reftable, u->nentries);
if (u == filetab || u == globtab)
&& u != utab
&& u != filetab)
{
- llassert (u->htable == NULL);
+ llassert (!cstringTable_isDefined (u->htable));
sfree (u);
}
while (tab->lexlevel >= lowlevel)
{
+ DPRINTF (("Is guarded? [%s] %s",
+ guardSet_unparse (tab->guards),
+ sRef_unparseFull (s)));
+
if (guardSet_isGuarded (tab->guards, s))
{
/*
bool usymtab_isGuarded (sRef s)
{
-
+ DPRINTF (("Is guarded? %s", sRef_unparseFull (s)));
return (sRef_aliasCompleteSimplePred (usymtab_isGuardedAux, s));
}
-bool usymtab_isProbableNull (sRef s)
+bool usymtab_isDefinitelyNull (sRef s)
{
- return (sRef_aliasCheckSimplePred (usymtab_isProbableNullAux, s));
+ return (sRef_aliasCheckSimplePred (usymtab_isDefinitelyNullAux, s));
}
-bool usymtab_isProbableDeepNull (sRef s)
+bool usymtab_isDefinitelyNullDeep (sRef s)
{
- return (sRef_deepPred (usymtab_isProbableNull, s));
+ return (sRef_deepPred (usymtab_isDefinitelyNull, s));
}
-static bool usymtab_isProbableNullAux (sRef s)
+static bool usymtab_isDefinitelyNullAux (sRef s)
/*@globals utab@*/
{
usymtab tab = utab;
while (tab->lexlevel >= lowlevel)
{
- if (guardSet_isProbableNull (tab->guards, s))
+ if (guardSet_mustBeNull (tab->guards, s))
{
return TRUE;
}
&& !fileloc_isLib (uentry_whereDefined (ue))
&& (size > 0))
{
- llmsg (message ("%q (%q), %d use%p:\n %q",
+ llmsg (message ("%q (%q), %d use%&:\n %q",
uentry_getName (ue),
fileloc_unparse (uentry_whereDefined (ue)),
size, filelocList_unparseUses (uses)));
BADEXIT;
}
-void usymtab_testInRange (sRef s, int index) /*@globals utab;@*/
-{
- /*@i22*/
- /*@-globs*/
- environmentTable_testInRange (utab->environment, s, index);
- /*@=globs*/
-}
-void usymtab_postopVar (sRef sr) /*@globals utab;@*/
-{
- environmentTable_postOpvar (utab->environment, sr);
-
-}
-/* doesn't do much check here assumes checking is done before call*/
-void usymtab_addExactValue(sRef s1, int val)
-{
- /*@i22@*/ utab->environment = environmentTable_addExactValue (utab->environment, s1, val);
-}
-
-void usymtab_addMustAlias (sRef s, sRef al)
+void usymtab_addMustAlias (/*@exposed@*/ sRef s, /*@exposed@*/ sRef al)
/*@modifies utab@*/
{
- if (sRef_isMeaningful (s) && sRef_isMeaningful (al)
- && !(sRef_isConst (s) || sRef_isConst (al))
- && !(sRef_isAddress (al) && sRef_isDirectParam (sRef_getBase (al)))
- && !(sRef_similar (s, al)))
- {
- utab->aliases = aliasTable_addMustAlias (utab->aliases, s, al);
- DPRINTF (("Must alias: %s", aliasTable_unparse (utab->aliases)));
-
- /*
- ** for local variable, aliasing is symmetric
- */
-
- if (sRef_isLocalVar (s) && sRef_isLocalVar (al))
- {
- utab->aliases = aliasTable_addMustAlias (utab->aliases, al, s);
- }
- }
- else
+ if (!sRef_similar (s, al))
{
- ;
+ usymtab_addForceMustAlias (s, al);
}
}
** Same as usymtab_addMustAlias, except does not check sRef_isSimilar.
*/
-void usymtab_addForceMustAlias (sRef s, sRef al)
+void usymtab_addForceMustAlias (/*@exposed@*/ sRef s, /*@exposed@*/ sRef al)
/*@modifies utab@*/
{
if (sRef_isMeaningful (s)
if (sRef_isMeaningful (s))
{
sRefSet ret;
-
ret = sRefSet_unionFree (aliasTable_aliasedBy (utab->aliases, s),
aliasTable_canAlias (utab->aliases, s));
- return (ret);
+ return (ret);
}
else
{
+ DPRINTF (("NOT A MEANINGFUL SREF!"));
return sRefSet_undefined;
}
}
/*@only@*/ sRefSet usymtab_canAlias (sRef s)
- /*@globals utab@*/
+ /*@globals utab@*/
{
if (sRef_isMeaningful (s))
{
sRefSet res = aliasTable_canAlias (utab->aliases, s);
-
return res;
}
-
+
return sRefSet_undefined;
}
/*@only@*/ sRefSet usymtab_aliasedBy (sRef s)
- /*@globals utab@*/
+ /*@globals utab@*/
{
return (aliasTable_aliasedBy (utab->aliases, s));
}
mstring_free (ind);
}
+# ifdef __LCLINT__
static /*@only@*/ cstring /*@unused@*/
usymtab_unparseLocalAux (/*@notnull@*/ usymtab s)
{
return (c);
}
+# endif
void
usymtab_printLocal (void)
if (hasError)
{
- uentry_setHasNameError (e);
+ uentry_setHasNameError (e);
}
}
+/*@exposed@*/ sRef usymtab_lookupGlobalMarker (void) /*@globals utab@*/
+{
+ uentry ue;
+
+ ue = usymtab_lookupAux (utab, GLOBAL_MARKER_NAME);
+ llassert (uentry_isValid (ue));
+
+ return uentry_getSref (ue);
+}
+