/*
** 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
*/
/*
** transferChecks.c
*/
-# include "lclintMacros.nf"
+# include "splintMacros.nf"
# include "basic.h"
# include "transferChecks.h"
{
; /* no error (will be a definition error) */
}
- else if (transferType == TT_DOASSIGN)
+ else if (transferType == TT_DOASSIGN
+ || transferType == TT_FIELDASSIGN) /* evans 2002-02-05 - added TT_FIELDASSIGN */
{
; /* no error */
}
else
{
llassert (transferType == TT_DOASSIGN
+ || transferType == TT_FIELDASSIGN /* evans 2002-02-05: no warnings for local fields */
|| transferType == TT_GLOBINIT
|| transferType == TT_LEAVETRANS);
}
}
static bool
- checkCompletelyDestroyed (exprNode p_fexp, sRef p_fref, bool p_topLevel,
- fileloc p_loc, int p_depth, dscCode p_desc,
- bool p_hideErrors);
+checkCompletelyDestroyed (exprNode p_fexp, sRef p_fref, bool p_topLevel, bool p_isField,
+ fileloc p_loc, int p_depth, dscCode p_desc,
+ bool p_hideErrors);
bool transferChecks_globalDestroyed (sRef fref, fileloc loc)
{
DPRINTF (("Global destroyed: %s", sRef_unparseFull (fref)));
- return (checkCompletelyDestroyed (exprNode_undefined, fref, TRUE,
+ return (checkCompletelyDestroyed (exprNode_undefined, fref, TRUE, FALSE,
loc, 0, DSC_GLOB, FALSE));
}
}
else
{
- (void) checkCompletelyDestroyed (exprNode_undefined, fref, TRUE,
+ (void) checkCompletelyDestroyed (exprNode_undefined, fref, TRUE, FALSE,
loc, 0, DSC_LOCAL, FALSE);
}
}
}
else
{
- (void) checkCompletelyDestroyed (exprNode_undefined, fref, TRUE,
+ (void) checkCompletelyDestroyed (exprNode_undefined, fref, TRUE, FALSE,
loc, 0, DSC_STRUCT, FALSE);
}
}
static bool
- checkCompletelyDestroyed (exprNode fexp, sRef fref, bool topLevel,
- fileloc loc, int depth,
- dscCode desc, bool hideErrors)
+checkCompletelyDestroyed (exprNode fexp, sRef fref, bool topLevel, bool isField,
+ fileloc loc, int depth,
+ dscCode desc, bool hideErrors)
{
ctype ct;
-
- DPRINTF (("Check completely destroyed: %s", sRef_unparseFull (fref)));
+
+ DPRINTF (("Check completely destroyed: %s / %s",
+ sRef_unparse (fref),
+ bool_unparse (hideErrors)));
if (depth > MAXDEPTH)
{
if (sRef_isPdefined (fref)
&& ctype_isAP (ct)
- && !context_getFlag (FLG_STRICTDESTROY))
+ && !isField
+ && !context_getFlag (FLG_STRICTDESTROY))
{
/*
** Don't report errors for array elements (unless strictdestroy)
** when at least one appears to have been destroyed.
*/
- DPRINTF (("Partial: %s", sRef_unparseFull (fref)));
+ DPRINTF (("Partial: %s / hiding errors: %s", sRef_unparseFull (fref),
+ ctype_unparse (ct)));
hideErrors = TRUE;
/* Don't report any more errors, but still change ownership. */
}
sRef fptr = sRef_constructDeadDeref (fref);
bool res;
- res = checkCompletelyDestroyed (fexp, fptr, FALSE, loc,
- depth + 1, desc, hideErrors);
+ res = checkCompletelyDestroyed (fexp, fptr, FALSE, FALSE,
+ loc, depth + 1, desc, hideErrors);
return res;
}
{
sRef farr = sRef_constructDeadDeref (fref);
- return (checkCompletelyDestroyed (fexp, farr, FALSE, loc,
- depth + 1, desc, hideErrors));
+ return (checkCompletelyDestroyed (fexp, farr, FALSE, FALSE,
+ loc, depth + 1, desc, hideErrors));
}
}
else if (ctype_isStruct (ct))
DPRINTF (("Check field: %s", sRef_unparseFull (field)));
- isOk = (checkCompletelyDestroyed (fexp, field, FALSE, loc,
- depth + 1, desc, hideErrors)
+ isOk = (checkCompletelyDestroyed (fexp, field, FALSE, TRUE,
+ loc, depth + 1, desc, hideErrors)
&& isOk);
} end_uentryList_elements;
}
-
+
return isOk;
}
else
{
if (stateClause_isGlobal (cl))
{
- ; /*@i32@*/
+ ;
}
else if (stateClause_setsMetaState (cl))
{
exprNode_loc (fexp)))
{
sRef_showAliasInfo (sr);
- /*@i32@*/
}
}
}
DPRINTF (("el: %s / %s", sRef_unparse (el),
sRef_unparse (base)));
- if (sRef_isResult (base))
+ if (sRef_isResult (base)
+ && !sRef_isDefinitelyNull (fref)) /* evans 2002-07-22: don't report allocation errors for null results */
{
sRef sr = sRef_fixBase (el, fref);
}
}
- (void) checkCompletelyDestroyed (fexp, fref, TRUE, exprNode_loc (fexp),
- 0, DSC_PARAM, FALSE);
+ (void) checkCompletelyDestroyed (fexp, fref, TRUE, FALSE,
+ exprNode_loc (fexp), 0, DSC_PARAM, FALSE);
/* make it defined now, so checkTransfer is okay */
sRef_setDefined (fref, exprNode_loc (fexp));
if (sRef_isNotNull (tref))
{
if (optgenerror
- (FLG_SYNTAX, /*@i432 kuldge flag... */
+ (FLG_NULLINIT, /* kuldge flag... */
message ("%s %q initialized to %s value: %q",
sRef_getScopeName (tref),
sRef_unparse (tref),
}
else
{
- /*@i#!@!!@*/
DPRINTF (("Cannot find meta state for: %s / to: %s / %s", sRef_unparseFull (fref),
sRef_unparseFull (tref),
fkey));
static void
checkMetaStateTransfer (exprNode fexp, sRef fref, exprNode texp, sRef tref,
exprNode fcn,
- fileloc loc, transferKind /*@i32@*/ transferType)
+ fileloc loc, transferKind transferType)
{
valueTable fvalues = sRef_getValueTable (fref);
valueTable tvalues = sRef_getValueTable (tref);
}
else
{
- /*@i#!@!!@*/
DPRINTF (("Metastate transfer: %s => %s",
exprNode_unparse (fexp), exprNode_unparse (texp)));
DPRINTF (("Cannot find meta state for: %s / to: %s / %s", sRef_unparseFull (fref),
{
if (nval == stateValue_error)
{
- /*@i32 print extra info for assignments@*/
-
if (optgenerror
(FLG_STATETRANSFER,
message