]> andersk Git - splint.git/blobdiff - src/transferChecks.c
Cahnged default LCLIMPORTDIR
[splint.git] / src / transferChecks.c
index 4d3f8511affcb6f1b5cc575c1f03d9f258f33e69..aa2dd4d4cf7e3728c5bfc648433df786e2d9eb60 100644 (file)
@@ -37,6 +37,7 @@ static void checkMetaStateConsistent (/*@exposed@*/ sRef p_fref, sRef p_tref,
 static void checkLeaveTrans (uentry p_actual, transferKind p_transferType);
 static void checkTransfer (exprNode p_fexp, /*@dependent@*/ sRef p_fref,
                           exprNode p_texp, /*@dependent@*/ sRef p_tref, 
+                          exprNode p_fcn, /* for printing better error messages */
                           fileloc p_loc, transferKind p_transferType);
 static void checkGlobTrans (uentry p_glob, transferKind p_type);
 
@@ -94,7 +95,7 @@ transferErrorMessage (transferKind transferType, alkind tkind) /*@*/
 }
 
 static /*@only@*/ cstring
-transferErrorExcerpt (transferKind transferType, exprNode fexp, exprNode texp) /*@*/ 
+transferErrorExcerpt (transferKind transferType, exprNode fexp, exprNode texp, exprNode fcn) /*@*/ 
 {
   switch (transferType)
     {
@@ -105,8 +106,16 @@ transferErrorExcerpt (transferKind transferType, exprNode fexp, exprNode texp) /
     case TT_GLOBINIT:
       return (message ("%s = %s", exprNode_unparse (texp), exprNode_unparse (fexp)));
     case TT_FCNPASS:
-      /*@i32 make it so called fcn is known here! */
-      return cstring_copy (exprNode_unparse (fexp)); 
+      if (exprNode_isDefined (fcn))
+       {
+         return message ("%s(..., %s, ...)",
+                         exprNode_unparse (fcn),
+                         exprNode_unparse (fexp));
+       }
+      else
+       {
+         return cstring_copy (exprNode_unparse (fexp));  
+       }
     BADDEFAULT;
     }
   BADEXIT;
@@ -284,7 +293,7 @@ checkCompletelyDefined (exprNode fexp, /*@exposed@*/ sRef fref, sRef ofref,
   ctype ct;
   alkind fkind = sRef_getAliasKind (fref);
   alkind tkind = sRef_getAliasKind (tref);
-
+  
   DPRINTF (("Check completely defined: %s [%s] / %s [%s]",
            exprNode_unparse (fexp), sRef_unparseFull (fref),
            exprNode_unparse (texp), sRef_unparseFull (tref)));
@@ -743,6 +752,8 @@ checkCompletelyDefined (exprNode fexp, /*@exposed@*/ sRef fref, sRef ofref,
                                      sRef_undefined, TT_FCNPASS)),
               loc))
            {
+             DPRINTF (("fref: %s", sRef_unparseFull (fref)));
+             DPRINTF (("tref: %s", sRef_unparseFull (tref)));
              sRef_showNullInfo (fref);
              sRef_setNullError (fref);
            }
@@ -766,6 +777,8 @@ checkCompletelyDefined (exprNode fexp, /*@exposed@*/ sRef fref, sRef ofref,
 
   ct = ctype_realType (sRef_getType (fref));
 
+  DPRINTF (("Here: %s", ctype_unparse (ct)));
+
   if (!(sRef_isAnyDefined (fref) 
        || sRef_isPdefined (fref)
        || sRef_isAllocated (fref)
@@ -867,6 +880,9 @@ checkCompletelyDefined (exprNode fexp, /*@exposed@*/ sRef fref, sRef ofref,
                        {
                          sRef rb = sRef_getRootBase (fref);
                          sRef_showStateInfo (fref);
+
+                         DPRINTF (("fref: %s", sRef_unparseFull (fref)));
+                         DPRINTF (("rb: %s", sRef_unparseFull (rb)));
                          sRef_setDefinedComplete (rb, loc);
                        }
                    }
@@ -891,7 +907,7 @@ checkCompletelyDefined (exprNode fexp, /*@exposed@*/ sRef fref, sRef ofref,
     {
       return YES;
     }
-  else if (ctype_isPointer (ct))
+  else if (ctype_isPointer (ct) || ctype_isArray (ct)) /* evans 2001-07-12 added ctype_isArray */
     {
       ctype tct = ctype_realType (sRef_getType (tref));
 
@@ -901,11 +917,16 @@ checkCompletelyDefined (exprNode fexp, /*@exposed@*/ sRef fref, sRef ofref,
        }
       else
        {
+         DPRINTF (("Here fref: %s", sRef_unparseFull (fref)));
+         DPRINTF (("Here tref: %s", sRef_unparseFull (tref)));
+
          if (ctype_isAP (tct) || ctype_isUnknown (tct))
            {
              sRef fptr = sRef_constructDeref (fref);
              sRef tptr = sRef_constructDeref (tref);
 
+             DPRINTF (("Here tptr: %s", sRef_unparseFull (tptr)));
+
              return (checkCompletelyDefined (fexp, fptr, ofref,
                                              texp, tptr,
                                              FALSE, inUnion, FALSE, loc, 
@@ -917,10 +938,6 @@ checkCompletelyDefined (exprNode fexp, /*@exposed@*/ sRef fref, sRef ofref,
            }
        }
     }
-  else if (ctype_isArray (ct))
-    {
-      return YES;
-    }
   else if (ctype_isStruct (ct))
     {
       ctype tct = ctype_realType (sRef_getType (tref));
@@ -1188,6 +1205,17 @@ checkCompletelyDefined (exprNode fexp, /*@exposed@*/ sRef fref, sRef ofref,
                                      sRef_unparse (fref)),
                             loc);
                        }
+                     /* evans 2001-08-21: added this branch for global returns */
+                     else if (transferType == TT_GLOBRETURN)
+                       {
+                         voptgenerror 
+                           (FLG_UNIONDEF,
+                            message ("Union %q reachable from global %q has "
+                                     "no defined field",
+                                     sRef_unparse (fref),
+                                     sRef_unparse (sRef_getRootBase (fref))),
+                            loc);
+                       }
                      else if (transferType == TT_DOASSIGN
                               || transferType == TT_FIELDASSIGN
                               || transferType == TT_GLOBINIT)
@@ -1716,6 +1744,7 @@ checkReturnTransfer (exprNode fexp, uentry rval)
     {
       (void) checkTransfer (fexp, exprNode_getSref (fexp),
                            exprNode_undefined, rref, 
+                           exprNode_undefined,
                            exprNode_loc (fexp), TT_FCNRETURN);
     }
 }
@@ -2137,6 +2166,7 @@ checkPassTransfer (exprNode fexp, uentry arg, bool isSpec,
   
   (void) checkTransfer (fexp, exprNode_getSref (fexp),
                        exprNode_undefined, tref,
+                       fcn,
                        exprNode_loc (fexp), TT_FCNPASS);
 
   setCodePoint ();
@@ -2311,6 +2341,7 @@ static void checkStructTransfer (exprNode lhs, sRef slhs, exprNode rhs, sRef srh
                          sRef lfld = sRef_makeField (slhs, fieldname);
 
                          (void) checkTransfer (rhs, sr, lhs, lfld, 
+                                               exprNode_undefined,
                                                exprNode_loc (lhs), tt);
                        }
                    } end_sRefSet_realElements ;
@@ -2323,7 +2354,9 @@ static void checkStructTransfer (exprNode lhs, sRef slhs, exprNode rhs, sRef srh
                    {
                      sRef rfld = sRef_makeField (srhs, uentry_rawName (field));
                      sRef lfld = sRef_makeField (slhs, uentry_rawName (field));
-                     (void) checkTransfer (rhs, rfld, lhs, lfld, exprNode_loc (lhs), tt);
+                     (void) checkTransfer (rhs, rfld, lhs, lfld, 
+                                           exprNode_undefined,
+                                           exprNode_loc (lhs), tt);
                    } end_uentryList_elements ;
                }
 
@@ -2344,7 +2377,9 @@ checkInitTransfer (exprNode lhs, exprNode rhs)
   if (sRef_isFileOrGlobalScope (slhs) || (!sRef_isCvar (slhs)))
     {
       (void) checkTransfer (rhs, exprNode_getSref (rhs), 
-                           lhs, slhs, exprNode_loc (rhs), TT_GLOBINIT);
+                           lhs, slhs, 
+                           exprNode_undefined,
+                           exprNode_loc (rhs), TT_GLOBINIT);
     }
   else
     {
@@ -2374,6 +2409,7 @@ checkAssignTransfer (exprNode lhs, exprNode rhs)
       DPRINTF (("lhs: %s", sRef_unparseFull (slhs)));
       DPRINTF (("rhs: %s", sRef_unparseFull (srhs)));
       (void) checkTransfer (rhs, srhs, lhs, slhs, 
+                           exprNode_undefined,
                            exprNode_loc (lhs), TT_DOASSIGN);
       DPRINTF (("lhs: %s", sRef_unparseFull (slhs)));
       DPRINTF (("rhs: %s", sRef_unparseFull (srhs)));
@@ -3276,7 +3312,9 @@ checkTransferExposure (sRef fref, exprNode fexp, /*@unused@*/ bool ffix,
              ;
            }
        }
-      else if (transferType == TT_DOASSIGN)
+      else if (transferType == TT_DOASSIGN
+              /* evans 2001-10-05: added TT_FIELDASSIGN: */
+              || transferType == TT_FIELDASSIGN)
        {
          if (!(sRef_isExposed (tref) 
                || !sRef_isCvar (tref)
@@ -3956,36 +3994,102 @@ checkMetaStateConsistent (/*@exposed@*/ sRef fref, sRef tref,
          {
            ;
          }
-       else if (!stateValue_sameValue (fval, tval))
+       else if (sRef_isDefinitelyNull (fref)
+                || usymtab_isDefinitelyNull (fref))
          {
-           DPRINTF (("Check: %s / %s / %s / %s", fkey,
-                     metaStateInfo_unparse (minfo),
-                     stateValue_unparse (fval),
-                     stateValue_unparse (tval)));
+           ; /* No errors for null values in state transfers. */
+         }
+       
+       else
+         {
+           stateCombinationTable sctable = metaStateInfo_getTransferTable (minfo);
+           cstring msg = cstring_undefined;
+           int nval = stateCombinationTable_lookup (sctable, 
+                                                    stateValue_getValue (fval), 
+                                                    stateValue_getValue (tval), 
+                                                    &msg);
            
-           if (sRef_isDefinitelyNull (fref)
-               || usymtab_isDefinitelyNull (fref))
-             {
-               ; /* No errors for null values in state transfers. */
-             }
-           else
+           if (nval == stateValue_error)
              {
-               if (optgenerror 
-                   (FLG_STATETRANSFER,
-                    message
-                    ("Invalid transfer from %q %x to %q",
-                     stateValue_unparseValue (fval, minfo),
-                     sRef_unparse (fref),
-                     stateValue_unparseValue (tval, minfo)),
-                    loc))
+               if (transferType == TT_LEAVETRANS)
+                 {
+                   BADBRANCH;
+                 }
+               else if (transferType == TT_GLOBRETURN)
+                 {
+                   if (optgenerror 
+                       (FLG_STATETRANSFER,
+                        message
+                        ("Function returns with global %q in inconsistent state (%q is %q, should be %q)%q",
+                         sRef_unparse (sRef_getRootBase (fref)),
+                         sRef_unparse (fref),
+                         stateValue_unparseValue (fval, minfo),
+                         stateValue_unparseValue (tval, minfo),
+                         cstring_isDefined (msg) 
+                         ? message (": %s", msg) : cstring_undefined),
+                        loc))
+                     {
+                       sRef_showMetaStateInfo (fref, fkey);
+                     }             
+                 }
+               else if (transferType == TT_GLOBPASS)
                  {
-                   sRef_showMetaStateInfo (fref, fkey);
+                   if (optgenerror 
+                       (FLG_STATETRANSFER,
+                        message
+                        ("Function called with global %q in inconsistent state (%q is %q, should be %q)%q",
+                         sRef_unparse (sRef_getRootBase (fref)),
+                         stateValue_unparseValue (fval, minfo),
+                         sRef_unparse (fref),
+                         stateValue_unparseValue (tval, minfo),
+                         cstring_isDefined (msg) 
+                         ? message (": %s", msg) : cstring_undefined),
+                        loc))
+                     {
+                       sRef_showMetaStateInfo (fref, fkey);
+                     }             
                  }
+               else if (transferType == TT_PARAMRETURN)
+                 {
+                   if (optgenerror 
+                       (FLG_STATETRANSFER,
+                        message
+                        ("Function returns with parameter %q in inconsistent state (%q is %q, should be %q)%q",
+                         sRef_unparse (sRef_getRootBase (fref)),
+                         sRef_unparse (fref),                  
+                         stateValue_unparseValue (fval, minfo),
+                         stateValue_unparseValue (tval, minfo),
+                         cstring_isDefined (msg) 
+                         ? message (": %s", msg) : cstring_undefined),
+                        loc))
+                     {
+                       sRef_showMetaStateInfo (fref, fkey);
+                     }
+                 }
+               else
+                 {
+                   if (optgenerror 
+                       (FLG_STATETRANSFER,
+                        message
+                        ("Invalid transfer from %q %x to %q (%q)%q",
+                         stateValue_unparseValue (fval, minfo),
+                         sRef_unparse (fref),
+                         stateValue_unparseValue (tval, minfo),
+                         sRef_unparse (tref),
+                         cstring_isDefined (msg) 
+                         ? message (": %s", msg) : cstring_undefined),
+                        loc))
+                     {
+                       sRef_showMetaStateInfo (fref, fkey);
+                     }
+                 }
+
+             }
+                   
+           if (stateValue_getValue (fval) != nval)
+             {
+               stateValue_updateValueLoc (fval, nval, loc);
              }
-         }
-       else
-         {
-           ; /* Match okay */
          }
       }
     
@@ -3996,13 +4100,14 @@ checkMetaStateConsistent (/*@exposed@*/ sRef fref, sRef tref,
 
 static void
 checkMetaStateTransfer (exprNode fexp, sRef fref, exprNode texp, sRef tref, 
+                       exprNode fcn,
                        fileloc loc, transferKind /*@i32@*/ transferType)
 {
   valueTable fvalues = sRef_getValueTable (fref);
   valueTable tvalues = sRef_getValueTable (tref);
 
   DPRINTF (("Metastate transfer: from %s", exprNode_unparse (fexp)));
-
+  
   DPRINTF (("Metastate transfer: %s => %s",
            sRef_unparseFull (fref),
            sRef_unparseFull (tref)));
@@ -4092,22 +4197,24 @@ checkMetaStateTransfer (exprNode fexp, sRef fref, exprNode texp, sRef tref,
              }
            else
              {
-               if (cstring_isDefined (msg)) 
+               if (nval == stateValue_error)
                  {
                    /*@i32 print extra info for assignments@*/
                    
                    if (optgenerror 
                        (FLG_STATETRANSFER,
                         message
-                        ("Invalid transfer from %q %x to %q (%s): %q",
+                        ("Invalid transfer from %q %x to %q%q: %q",
                          stateValue_unparseValue (fval, minfo),
                          sRef_unparse (fref),
                          stateValue_unparseValue (tval, minfo),
-                         msg,
-                         transferErrorExcerpt (transferType, fexp, texp)),
+                         cstring_isDefined (msg) 
+                         ? message (" (%s)", msg) : cstring_undefined,
+                         transferErrorExcerpt (transferType, fexp, texp, fcn)),
                         loc))
                      {
                        sRef_showMetaStateInfo (fref, fkey);
+                       sRef_showMetaStateInfo (tref, fkey);
                      }
                    else
                      {
@@ -4152,6 +4259,7 @@ checkMetaStateTransfer (exprNode fexp, sRef fref, exprNode texp, sRef tref,
 static void
 checkTransfer (exprNode fexp, /*@dependent@*/ sRef fref, 
               exprNode texp, /*@dependent@*/ sRef tref, 
+              exprNode fcn,
               fileloc loc, transferKind transferType)
 {
   setCodePoint ();
@@ -4168,7 +4276,8 @@ checkTransfer (exprNode fexp, /*@dependent@*/ sRef fref,
            exprNode_unparse (fexp),
            exprNode_unparse (texp)));
 
-  checkMetaStateTransfer (fexp, fref, texp, tref, loc, transferType);
+  checkMetaStateTransfer (fexp, fref, texp, tref, fcn,
+                         loc, transferType);
 
   /*
   ** for local references, we need to check
This page took 0.082666 seconds and 4 git commands to generate.