diff --git a/buddy/ChangeLog b/buddy/ChangeLog index 650dbd68e..73c2d10e6 100644 --- a/buddy/ChangeLog +++ b/buddy/ChangeLog @@ -1,3 +1,12 @@ +2009-09-07 Alexandre Duret-Lutz + + Fix some issues reported by LLVM/Clang's static analyser. + + * src/bddop.c (bdd_operator_varresize): Do not write into + quantvarset if it could not be allocated. + * src/reorder.c (reorder_win3): Do not initialize THIS, its + initial value is never read. + 2009-08-28 Alexandre Duret-Lutz * configure.ac: Switch from Libtool 1.5.x to Libtool 2.x, and diff --git a/buddy/src/bddop.c b/buddy/src/bddop.c index d2a9960e8..cd54dc05f 100644 --- a/buddy/src/bddop.c +++ b/buddy/src/bddop.c @@ -244,8 +244,8 @@ void bdd_operator_varresize(void) if ((quantvarset=NEW(int,bddvarnum)) == NULL) bdd_error(BDD_MEMORY); - - memset(quantvarset, 0, sizeof(int)*bddvarnum); + else + memset(quantvarset, 0, sizeof(int)*bddvarnum); quantvarsetID = 0; } diff --git a/buddy/src/reorder.c b/buddy/src/reorder.c index 018cfeeb3..a7923f473 100644 --- a/buddy/src/reorder.c +++ b/buddy/src/reorder.c @@ -100,7 +100,7 @@ static bddsizehandler reorder_nodenum; /* Number of live nodes before and after a reordering session */ static int usednum_before; static int usednum_after; - + /* Kernel variables needed for reordering */ extern int bddfreepos; extern int bddfreenum; @@ -141,7 +141,7 @@ void bdd_reorder_init(void) { reorderdisabled = 0; vartree = NULL; - + bdd_clrvarblocks(); bdd_reorder_hook(bdd_default_reohandler); bdd_reorder_verbose(0); @@ -181,7 +181,7 @@ static BddTree *reorder_win2(BddTree *t) { int best = reorder_nodenum(); blockdown(this); - + if (best < reorder_nodenum()) { blockdown(this->prev); @@ -197,7 +197,7 @@ static BddTree *reorder_win2(BddTree *t) fflush(stdout); } } - + if (verbose > 1) printf("\nWin2 end: %d nodes\n", reorder_nodenum()); fflush(stdout); @@ -211,10 +211,10 @@ static BddTree *reorder_win2ite(BddTree *t) BddTree *this, *first=t; int lastsize; int c=1; - + if (t == NULL) return t; - + if (verbose > 1) printf("Win2ite start: %d nodes\n", reorder_nodenum()); @@ -262,11 +262,11 @@ static BddTree *reorder_swapwin3(BddTree *this, BddTree **first) int setfirst = (this->prev == NULL ? 1 : 0); BddTree *next = this; int best = reorder_nodenum(); - + if (this->next->next == NULL) /* Only two blocks left -> win2 swap */ { blockdown(this); - + if (best < reorder_nodenum()) { blockdown(this->prev); @@ -292,7 +292,7 @@ static BddTree *reorder_swapwin3(BddTree *this, BddTree **first) pos = 0; best = reorder_nodenum(); } - + blockdown(this); /* B C A* (3) */ X(printf("B")); pos++; @@ -302,7 +302,7 @@ static BddTree *reorder_swapwin3(BddTree *this, BddTree **first) pos = 0; best = reorder_nodenum(); } - + this = this->prev->prev; blockdown(this); /* C B* A (2) */ X(printf("C")); @@ -313,7 +313,7 @@ static BddTree *reorder_swapwin3(BddTree *this, BddTree **first) pos = 0; best = reorder_nodenum(); } - + blockdown(this); /* C A B* (1) */ X(printf("D")); pos++; @@ -323,7 +323,7 @@ static BddTree *reorder_swapwin3(BddTree *this, BddTree **first) pos = 0; best = reorder_nodenum(); } - + this = this->prev->prev; blockdown(this); /* A C* B (0)*/ X(printf("E")); @@ -334,9 +334,9 @@ static BddTree *reorder_swapwin3(BddTree *this, BddTree **first) pos = 0; best = reorder_nodenum(); } - + X(printf(" -> ")); - + if (pos >= 1) /* A C B -> C A* B */ { this = this->prev; @@ -346,7 +346,7 @@ static BddTree *reorder_swapwin3(BddTree *this, BddTree **first) *first = this->prev; X(printf("a(%d)", reorder_nodenum())); } - + if (pos >= 2) /* C A B -> C B A* */ { blockdown(this); @@ -355,7 +355,7 @@ static BddTree *reorder_swapwin3(BddTree *this, BddTree **first) *first = this->prev->prev; X(printf("b(%d)", reorder_nodenum())); } - + if (pos >= 3) /* C B A -> B C* A */ { this = this->prev->prev; @@ -365,7 +365,7 @@ static BddTree *reorder_swapwin3(BddTree *this, BddTree **first) *first = this->prev; X(printf("c(%d)", reorder_nodenum())); } - + if (pos >= 4) /* B C A -> B A C* */ { blockdown(this); @@ -374,7 +374,7 @@ static BddTree *reorder_swapwin3(BddTree *this, BddTree **first) *first = this->prev->prev; X(printf("d(%d)", reorder_nodenum())); } - + if (pos >= 5) /* B A C -> A B* C */ { this = this->prev->prev; @@ -393,7 +393,7 @@ static BddTree *reorder_swapwin3(BddTree *this, BddTree **first) static BddTree *reorder_win3(BddTree *t) { - BddTree *this=t, *first=t; + BddTree *this, *first=t; if (t == NULL) return t; @@ -405,14 +405,14 @@ static BddTree *reorder_win3(BddTree *t) while (this->next != NULL) { this = reorder_swapwin3(this, &first); - + if (verbose > 1) { printf("."); fflush(stdout); } } - + if (verbose > 1) printf("\nWin3 end: %d nodes\n", reorder_nodenum()); fflush(stdout); @@ -425,10 +425,10 @@ static BddTree *reorder_win3ite(BddTree *t) { BddTree *this=t, *first=t; int lastsize; - + if (t == NULL) return t; - + if (verbose > 1) printf("Win3ite start: %d nodes\n", reorder_nodenum()); @@ -436,7 +436,7 @@ static BddTree *reorder_win3ite(BddTree *t) { lastsize = reorder_nodenum(); this = first; - + while (this->next != NULL && this->next->next != NULL) { this = reorder_swapwin3(this, &first); @@ -455,7 +455,7 @@ static BddTree *reorder_win3ite(BddTree *t) if (verbose > 1) printf("Win3ite end: %d nodes\n", reorder_nodenum()); - + return first; } @@ -472,7 +472,7 @@ static void reorder_sift_bestpos(BddTree *blk, int middlePos) int bestpos = 0; int dirIsUp = 1; int n; - + if (bddmaxnodesize > 0) maxAllowed = MIN(best/5+best, bddmaxnodesize-bddmaxnodeincrease-2); else @@ -486,7 +486,7 @@ static void reorder_sift_bestpos(BddTree *blk, int middlePos) for (n=0 ; n<2 ; n++) { int first = 1; - + if (dirIsUp) { while (blk->prev != NULL && @@ -495,13 +495,13 @@ static void reorder_sift_bestpos(BddTree *blk, int middlePos) first = 0; blockdown(blk->prev); bestpos--; - + if (verbose > 1) { printf("-"); fflush(stdout); } - + if (reorder_nodenum() < best) { best = reorder_nodenum(); @@ -523,18 +523,18 @@ static void reorder_sift_bestpos(BddTree *blk, int middlePos) first = 0; blockdown(blk); bestpos++; - + if (verbose > 1) { printf("+"); fflush(stdout); } - + if (reorder_nodenum() < best) { best = reorder_nodenum(); bestpos = 0; - + if (bddmaxnodesize > 0) maxAllowed = MIN(best/5+best, bddmaxnodesize-bddmaxnodeincrease-2); @@ -543,7 +543,7 @@ static void reorder_sift_bestpos(BddTree *blk, int middlePos) } } } - + if (reorder_nodenum() > maxAllowed && verbose > 1) { printf("!"); @@ -574,14 +574,14 @@ static BddTree *reorder_sift_seq(BddTree *t, BddTree **seq, int num) { BddTree *this; int n; - + if (t == NULL) return t; for (n=0 ; n 1) { printf("Sift "); @@ -635,7 +635,7 @@ static BddTree *reorder_sift(BddTree *t) for (this=t,num=0 ; this!=NULL ; this=this->next) this->pos = num++; - + if ((p=NEW(sizePair,num)) == NULL) return t; if ((seq=NEW(BddTree*,num)) == NULL) @@ -658,17 +658,17 @@ static BddTree *reorder_sift(BddTree *t) /* Sort according to the number of nodes at each level */ qsort(p, num, sizeof(sizePair), siftTestCmp); - + /* Create sequence */ for (n=0 ; n 1) printf("Reorder %d\n", c++); - + lastsize = reorder_nodenum(); first = reorder_sift(first); } @@ -708,13 +708,13 @@ static BddTree *reorder_random(BddTree *t) if (t == NULL) return t; - + for (this=t ; this!=NULL ; this=this->next) num++; seq = NEW(BddTree*,num); for (this=t,num=0 ; this!=NULL ; this=this->next) seq[num++] = this; - + for (n=0 ; n<4*num ; n++) { int blk = random(num); @@ -811,7 +811,7 @@ static void addref_rec(int r, char *dep) { if (r < 2) return; - + if (bddnodes[r].refcou == 0) { bddfreenum--; @@ -821,20 +821,20 @@ static void addref_rec(int r, char *dep) /* Make sure the nodenum field is updated. Used in the initial GBC */ levels[VAR(r) & MARKHIDE].nodenum++; - + addref_rec(LOW(r), dep); addref_rec(HIGH(r), dep); } else { int n; - + /* Update (from previously found) variable dependencies * for the interaction matrix */ for (n=0 ; n 0) { SETMARK(n); extrootsize++; } } - + if ((extroots=(int*)(malloc(sizeof(int)*extrootsize))) == NULL) return bdd_error(BDD_MEMORY); @@ -896,7 +896,7 @@ static int mark_roots(void) memset(dep,0,bddvarnum); dep[VARp(node)] = 1; levels[VARp(node)].nodenum++; - + addref_rec(LOWp(node), dep); addref_rec(HIGHp(node), dep); @@ -928,7 +928,7 @@ static void reorder_gbc(void) bddfreenum = 0; /* No need to zero all hash fields - this is done in mark_roots */ - + for (n=bddnodesize-1 ; n>=2 ; n--) { register BddNode *node = &bddnodes[n]; @@ -936,7 +936,7 @@ static void reorder_gbc(void) if (node->refcou > 0) { register unsigned int hash; - + hash = NODEHASH(VARp(node), LOWp(node), HIGHp(node)); node->next = bddnodes[hash].hash; bddnodes[hash].hash = n; @@ -971,7 +971,7 @@ static void reorder_setLevellookup(void) if (levels[n].size >= 4) levels[n].size = bdd_prime_lte(levels[n].size); - + #if 0 printf("L%3d: start %d, size %d, nodes %d\n", n, levels[n].start, levels[n].size, levels[n].nodenum); @@ -989,7 +989,7 @@ static void reorder_rehashAll(void) for (n=bddnodesize-1 ; n>=0 ; n--) bddnodes[n].hash = 0; - + for (n=bddnodesize-1 ; n>=2 ; n--) { register BddNode *node = &bddnodes[n]; @@ -997,7 +997,7 @@ static void reorder_rehashAll(void) if (node->refcou > 0) { register unsigned int hash; - + hash = NODEHASH(VARp(node), LOWp(node), HIGHp(node)); node->next = bddnodes[hash].hash; bddnodes[hash].hash = n; @@ -1025,10 +1025,10 @@ static int reorder_makenode(int var, int low, int high) #ifdef CACHESTATS bddcachestats.uniqueAccess++; #endif - + /* Note: We know that low,high has a refcou greater than zero, so there is no need to add reference *recursively* */ - + /* check whether childs are equal */ if (low == high) { @@ -1039,7 +1039,7 @@ static int reorder_makenode(int var, int low, int high) /* Try to find an existing node of this kind */ hash = NODEHASH(var, low, high); res = bddnodes[hash].hash; - + while(res != 0) { if (LOW(res) == low && HIGH(res) == high) @@ -1051,12 +1051,12 @@ static int reorder_makenode(int var, int low, int high) return res; } res = bddnodes[res].next; - + #ifdef CACHESTATS bddcachestats.uniqueChain++; #endif } - + /* No existing node -> build one */ #ifdef CACHESTATS bddcachestats.uniqueMiss++; @@ -1067,7 +1067,7 @@ static int reorder_makenode(int var, int low, int high) { if (bdderrorcond) return 0; - + /* Try to allocate more nodes - call noderesize without * enabling rehashing. * Note: if ever rehashing is allowed here, then remember to @@ -1090,7 +1090,7 @@ static int reorder_makenode(int var, int low, int high) levels[var].nodenum++; bddproduced++; bddfreenum--; - + node = &bddnodes[res]; VARp(node) = var; LOWp(node) = low; @@ -1104,7 +1104,7 @@ static int reorder_makenode(int var, int low, int high) node->refcou = 1; INCREF(LOWp(node)); INCREF(HIGHp(node)); - + return res; } @@ -1123,7 +1123,7 @@ static int reorder_downSimple(int var0) int n; levels[var0].nodenum = 0; - + for (n=0 ; nnext = bddnodes[hash].hash; @@ -1258,9 +1258,9 @@ static void reorder_localGbc(int var0) { DECREF(LOWp(node)); DECREF(HIGHp(node)); - + LOWp(node) = -1; - node->next = bddfreepos; + node->next = bddfreepos; bddfreepos = r; levels[var1].nodenum--; bddfreenum++; @@ -1268,7 +1268,7 @@ static void reorder_localGbc(int var0) r = next; } - } + } } @@ -1279,7 +1279,7 @@ static void reorder_localGbc(int var0) static void reorder_swapResize(int toBeProcessed, int var0) { int var1 = bddlevel2var[bddvar2level[var0]+1]; - + while (toBeProcessed) { BddNode *node = &bddnodes[toBeProcessed]; @@ -1287,7 +1287,7 @@ static void reorder_swapResize(int toBeProcessed, int var0) int f0 = LOWp(node); int f1 = HIGHp(node); int f00, f01, f10, f11; - + /* Find the cofactors for the new nodes */ if (VAR(f0) == var1) { @@ -1296,7 +1296,7 @@ static void reorder_swapResize(int toBeProcessed, int var0) } else f00 = f01 = f0; - + if (VAR(f1) == var1) { f10 = LOW(f1); @@ -1318,16 +1318,16 @@ static void reorder_swapResize(int toBeProcessed, int var0) DECREF(LOWp(node)); DECREF(HIGHp(node)); - + /* Update in-place */ VARp(node) = var1; LOWp(node) = f0; HIGHp(node) = f1; - + levels[var1].nodenum++; - + /* Do not rehash yet since we are going to resize the hash table */ - + toBeProcessed = next; } } @@ -1360,9 +1360,9 @@ static void reorder_localGbcResize(int toBeProcessed, int var0) { DECREF(LOWp(node)); DECREF(HIGHp(node)); - + LOWp(node) = -1; - node->next = bddfreepos; + node->next = bddfreepos; bddfreepos = r; levels[var1].nodenum--; bddfreenum++; @@ -1387,12 +1387,12 @@ static void reorder_localGbcResize(int toBeProcessed, int var0) BddNode *node = &bddnodes[toBeProcessed]; int next = node->next; int hash = NODEHASH(VARp(node), LOWp(node), HIGHp(node)); - + node->next = bddnodes[hash].hash; bddnodes[hash].hash = toBeProcessed; toBeProcessed = next; - } + } } #endif /* USERESIZE */ @@ -1413,15 +1413,15 @@ static void sanitycheck(void) { int n,v,r; int cou=0; - + for (v=0 ; vnodenum < (l->size)/3 || l->nodenum >= (l->size*3)/2 && l->size < l->maxsize) { @@ -1478,16 +1478,16 @@ static int reorder_vardown(int var) reorder_localGbc(var); } } - + /* Swap the var<->level tables */ n = bddlevel2var[level]; bddlevel2var[level] = bddlevel2var[level+1]; bddlevel2var[level+1] = n; - + n = bddvar2level[var]; bddvar2level[var] = bddvar2level[ bddlevel2var[level] ]; bddvar2level[ bddlevel2var[level] ] = n; - + /* Update all rename pairs */ bdd_pairs_vardown(level); @@ -1526,7 +1526,7 @@ int bdd_swapvar(int v1, int v2) /* Do not swap when variable-blocks are used */ if (vartree != NULL) return bdd_error(BDD_VARBLK); - + /* Don't bother swapping x with x */ if (v1 == v2) return 0; @@ -1549,7 +1549,7 @@ int bdd_swapvar(int v1, int v2) } reorder_init(); - + /* Move v1 to v2's position */ while (bddvar2level[v1] < l2) reorder_vardown(v1); @@ -1559,7 +1559,7 @@ int bdd_swapvar(int v1, int v2) reorder_varup(v2); reorder_done(); - + return 0; } @@ -1623,18 +1623,18 @@ int bdd_reorder_ready(void) return 1; } - + void bdd_reorder_auto(void) { if (!bdd_reorder_ready) return; - + if (reorder_handler != NULL) reorder_handler(1); bdd_reorder(bddreordermethod); bddreordertimes--; - + if (reorder_handler != NULL) reorder_handler(0); } @@ -1646,14 +1646,14 @@ static int reorder_init(void) if ((levels=NEW(levelData,bddvarnum)) == NULL) return -1; - + for (n=0 ; nseq != NULL) qsort(t->seq, t->last-t->first+1, sizeof(int), varseqCmp); - + return t; } @@ -1803,7 +1803,7 @@ void bdd_reorder(int method) BddTree *top; int savemethod = bddreordermethod; int savetimes = bddreordertimes; - + bddreordermethod = method; bddreordertimes = 1; @@ -1813,7 +1813,7 @@ void bdd_reorder(int method) return; usednum_before = bddnodesize - bddfreenum; - + top->first = 0; top->last = bdd_varnum()-1; top->fixed = 0; @@ -1823,9 +1823,9 @@ void bdd_reorder(int method) reorder_block(top, method); vartree = top->nextlevel; free(top); - + usednum_after = bddnodesize - bddfreenum; - + reorder_done(); bddreordermethod = savemethod; bddreordertimes = savetimes; @@ -1848,7 +1848,7 @@ int bdd_reorder_gain(void) { if (usednum_before == 0) return 0; - + return (100*(usednum_before - usednum_after)) / usednum_before; } @@ -2141,14 +2141,14 @@ int bdd_addvarblock(BDD b, int fixed) BddTree *t; int n, *v, size; int first, last; - + if ((n=bdd_scanset(b, &v, &size)) < 0) return n; if (size < 1) return bdd_error(BDD_VARBLK); first = last = v[0]; - + for (n=0 ; n= bddvarnum || last < 0 || last >= bddvarnum) return bdd_error(BDD_VAR); - + if ((t=bddtree_addrange(vartree, first,last, fixed,blockid)) == NULL) return bdd_error(BDD_VARBLK); @@ -2257,9 +2257,9 @@ void bdd_setvarorder(int *neworder) bdd_error(BDD_VARBLK); return; } - + reorder_init(); - + for (level=0 ; level level) reorder_varup(lowvar); } - + reorder_done(); } @@ -2285,16 +2285,16 @@ static void print_order_rec(FILE *o, BddTree *t, int level) else fprintf(o, "%3d", t->id); fprintf(o, "{\n"); - + print_order_rec(o, t->nextlevel, level+1); - + fprintf(o, "%*s", level*3, ""); if (reorder_filehandler) reorder_filehandler(o,t->id); else fprintf(o, "%3d", t->id); fprintf(o, "}\n"); - + print_order_rec(o, t->next, level); } else @@ -2305,7 +2305,7 @@ static void print_order_rec(FILE *o, BddTree *t, int level) else fprintf(o, "%3d", t->id); fprintf(o, "\n"); - + print_order_rec(o, t->next, level); } }