Main Page   Alphabetical List   Compound List   File List   Compound Members   File Members  

guardSet.c

Go to the documentation of this file.
00001 /*
00002 ** LCLint - annotation-assisted static program checker
00003 ** Copyright (C) 1994-2000 University of Virginia,
00004 **         Massachusetts Institute of Technology
00005 **
00006 ** This program is free software; you can redistribute it and/or modify it
00007 ** under the terms of the GNU General Public License as published by the
00008 ** Free Software Foundation; either version 2 of the License, or (at your
00009 ** option) any later version.
00010 ** 
00011 ** This program is distributed in the hope that it will be useful, but
00012 ** WITHOUT ANY WARRANTY; without even the implied warranty of
00013 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00014 ** General Public License for more details.
00015 ** 
00016 ** The GNU General Public License is available from http://www.gnu.org/ or
00017 ** the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
00018 ** MA 02111-1307, USA.
00019 **
00020 ** For information on lclint: lclint-request@cs.virginia.edu
00021 ** To report a bug: lclint-bug@cs.virginia.edu
00022 ** For more information: http://lclint.cs.virginia.edu
00023 */
00024 /*
00025 ** guardSet.c
00026 **
00027 ** if x is in true guards, then x is not null on this branch,
00028 **                          and x is "probably" null on the other branch.
00029 ** if x is in false guards, then x is "probably" null on this branch,
00030 **                          and x is not null on the other branch.
00031 **
00032 ** Either guards is obsolete and should be removed soon.
00033 */
00034 
00035 # include "lclintMacros.nf"
00036 # include "basic.h"
00037 
00038 guardSet guardSet_new ()
00039 {
00040   return guardSet_undefined;
00041 }
00042 
00043 static /*@notnull@*/ /*@special@*/ guardSet guardSet_newEmpty (void)
00044    /*@defines result@*/
00045    /*@post:isnull result->tguard, result->fguard@*/
00046 {
00047   guardSet g = (guardSet) dmalloc (sizeof (*g));
00048 
00049   g->tguard = sRefSet_undefined;
00050   g->fguard = sRefSet_undefined;
00051 
00052   return g;
00053 }
00054 
00055 sRefSet guardSet_getTrueGuards (guardSet g)
00056 {
00057   
00058   if (guardSet_isDefined (g))
00059     {
00060       return (g->tguard);
00061     }
00062   else
00063     {
00064       return (sRefSet_undefined);
00065     }
00066 }
00067 
00068 void guardSet_delete (guardSet g, sRef s) 
00069 {
00070   bool res;
00071   llassert (guardSet_isDefined (g));
00072   res = sRefSet_delete (g->tguard, s);
00073   
00074   /*
00075   ** This assertion is no longer always true:
00076   ** llassert (res);
00077   */
00078 }
00079 
00080 /*@dependent@*/ /*@exposed@*/ sRefSet guardSet_getFalseGuards (guardSet g)
00081 {
00082   if (guardSet_isDefined (g))
00083     { 
00084       return (g->fguard);
00085     }
00086   else
00087     {
00088       return (sRefSet_undefined);
00089     }
00090 }
00091 
00092 guardSet guardSet_or (/*@returned@*/ /*@unique@*/ guardSet s, guardSet t)
00093 {
00094   
00095   llassert (NOALIAS (s, t));
00096 
00097   if (s == guardSet_undefined)
00098     {
00099       if (t == guardSet_undefined)
00100         {
00101           return s;
00102         }
00103 
00104       s = guardSet_newEmpty ();
00105     }
00106 
00107   if (t == guardSet_undefined)
00108     {
00109       sRefSet_free (s->tguard);
00110       s->tguard = sRefSet_new ();
00111     }
00112   else
00113     {
00114       sRefSet last;
00115 
00116       s->tguard = sRefSet_intersect (last = s->tguard, t->tguard);
00117       sRefSet_free (last);
00118       s->fguard = sRefSet_union (s->fguard, t->fguard);
00119     }
00120   
00121   
00122   return s;
00123 }
00124 
00125 guardSet guardSet_and (/*@returned@*/ /*@unique@*/ guardSet s, guardSet t)
00126 {
00127   llassert (NOALIAS (s, t));
00128 
00129   if (s == guardSet_undefined)
00130     {
00131       if (t == guardSet_undefined)
00132         {
00133           return s;
00134         }
00135 
00136       s = guardSet_newEmpty ();
00137     }
00138 
00139   if (t == guardSet_undefined)
00140     {
00141       sRefSet_free (s->fguard);
00142       s->fguard = sRefSet_new ();
00143     }
00144   else
00145     {
00146       sRefSet last;
00147 
00148       s->tguard = sRefSet_union (s->tguard, t->tguard);
00149 
00150       s->fguard = sRefSet_intersect (last = s->fguard, t->fguard);
00151       sRefSet_free (last);
00152     }
00153   
00154   return s;
00155 }
00156 
00157 /*@only@*/ guardSet guardSet_union (/*@only@*/ guardSet s, guardSet t)
00158 {
00159   if (t == guardSet_undefined) return s; 
00160 
00161   llassert (NOALIAS (s, t));
00162 
00163   if (guardSet_isDefined (s)) 
00164     {
00165       s->tguard = sRefSet_union (s->tguard, t->tguard);
00166       s->fguard = sRefSet_union (s->fguard, t->fguard);
00167     }
00168   else
00169     {
00170       s = guardSet_newEmpty ();
00171 
00172       s->tguard = sRefSet_newCopy (t->tguard);
00173       s->fguard = sRefSet_newCopy (t->fguard);
00174     }
00175 
00176   return s;
00177 }
00178 
00179 guardSet guardSet_levelUnion (/*@only@*/ guardSet s, guardSet t, int lexlevel)
00180 {
00181   if (t == guardSet_undefined) return s;
00182 
00183   llassert (NOALIAS (s, t));
00184 
00185   if (guardSet_isDefined (s))
00186     {
00187       s->tguard = sRefSet_levelUnion (s->tguard, t->tguard, lexlevel);
00188       s->fguard = sRefSet_levelUnion (s->fguard, t->fguard, lexlevel);
00189     }
00190   else
00191     {
00192       s = guardSet_newEmpty ();
00193 
00194       /* should be necessary! */
00195 
00196       sRefSet_free (s->tguard);
00197       sRefSet_free (s->fguard);
00198 
00199       s->tguard = sRefSet_levelCopy (t->tguard, lexlevel);
00200       s->fguard = sRefSet_levelCopy (t->fguard, lexlevel);
00201     }
00202 
00203   return s;
00204 }
00205 
00206 guardSet 
00207   guardSet_levelUnionFree (/*@returned@*/ /*@unique@*/ guardSet s,
00208                            /*@only@*/ guardSet t, int lexlevel)
00209 {
00210   if (t == guardSet_undefined) return s;
00211 
00212   if (guardSet_isDefined (s))
00213     {
00214       s->tguard = sRefSet_levelUnion (s->tguard, t->tguard, lexlevel);
00215       s->fguard = sRefSet_levelUnion (s->fguard, t->fguard, lexlevel);
00216     }
00217   else
00218     {
00219       s = guardSet_newEmpty ();
00220 
00221       /* should be necessary! */
00222 
00223       sRefSet_free (s->tguard);
00224       sRefSet_free (s->fguard);
00225 
00226       s->tguard = sRefSet_levelCopy (t->tguard, lexlevel);
00227       s->fguard = sRefSet_levelCopy (t->fguard, lexlevel);
00228     }
00229 
00230   guardSet_free (t);
00231   return s;
00232 }
00233 
00234 void guardSet_flip (guardSet g)
00235 {
00236   if (g != guardSet_undefined)
00237     {
00238       sRefSet tmp = g->tguard;
00239 
00240       g->tguard = g->fguard;      
00241       g->fguard = tmp;
00242     }
00243 }
00244 
00245 /*@only@*/ guardSet guardSet_invert (/*@temp@*/ guardSet g)
00246 {
00247   if (g != guardSet_undefined)
00248     {
00249       guardSet ret = guardSet_newEmpty ();
00250 
00251       ret->tguard = sRefSet_newCopy (g->fguard);      
00252       ret->fguard = sRefSet_newCopy (g->tguard);
00253 
00254       return ret;
00255     }
00256   return guardSet_undefined;
00257 }
00258 
00259 /*@only@*/ guardSet guardSet_copy (/*@temp@*/ guardSet g)
00260 {
00261   if (g != guardSet_undefined)
00262     {
00263       guardSet ret = guardSet_newEmpty ();
00264 
00265       ret->tguard = sRefSet_newCopy (g->tguard);      
00266       ret->fguard = sRefSet_newCopy (g->fguard);
00267 
00268       return ret;
00269     }
00270   return guardSet_undefined;
00271 }
00272   
00273 guardSet guardSet_addTrueGuard (/*@returned@*/ guardSet g, sRef s)
00274 {
00275   if (sRef_isMeaningful (s))
00276     {
00277       if (g == guardSet_undefined)
00278         {
00279           g = guardSet_newEmpty ();
00280         }
00281       
00282       g->tguard = sRefSet_insert (g->tguard, s);
00283     }
00284 
00285   return g;
00286 }
00287 
00288 guardSet guardSet_addFalseGuard (/*@returned@*/ guardSet g, sRef s)
00289 {
00290   if (sRef_isMeaningful (s))
00291     {
00292       if (g == guardSet_undefined)
00293         {
00294           g = guardSet_newEmpty ();
00295         }
00296       
00297       g->fguard = sRefSet_insert (g->fguard, s);
00298     }
00299 
00300   return g;
00301 }
00302 
00303 /*@only@*/ cstring guardSet_unparse (guardSet g)
00304 {
00305   if (g == guardSet_undefined)
00306     {
00307       return (cstring_makeLiteral ("<no guards>"));
00308     }
00309   else
00310     {
00311       return (message ("not null: %q / prob null: %q",
00312                        sRefSet_unparseDebug (g->tguard),
00313                        sRefSet_unparseDebug (g->fguard)));
00314     }
00315 }
00316 
00317 void guardSet_free (/*@only@*/ guardSet g)
00318 {
00319   if (g == guardSet_undefined) return;
00320 
00321   sRefSet_free (g->tguard);
00322   sRefSet_free (g->fguard);
00323   
00324   sfree (g);
00325 }
00326 
00327 bool
00328 guardSet_isGuarded (guardSet g, sRef s)
00329 {
00330   if (g == guardSet_undefined) return FALSE;
00331   
00332   return (sRefSet_member (g->tguard, s));
00333 }
00334 
00335 bool
00336 guardSet_isProbableNull (guardSet g, sRef s)
00337 {
00338   bool ret;
00339 
00340   if (g == guardSet_undefined) return FALSE;
00341 
00342   ret = sRefSet_member (g->fguard, s);
00343   return ret;
00344 }
00345 
00346 bool guardSet_isEmpty (guardSet g)
00347 {
00348   if (guardSet_isDefined (g))
00349     {
00350       return (sRefSet_isEmpty (g->tguard) && sRefSet_isEmpty (g->fguard));
00351     }
00352   else
00353     {
00354       return TRUE;
00355     }
00356 }

Generated at Fri Nov 3 18:57:41 2000 for LCLint by doxygen1.2.3 written by Dimitri van Heesch, © 1997-2000