Found bug... Don't update parent's list until we know we aren't going to be freed
authorbdemsky <bdemsky@uci.edu>
Tue, 5 Sep 2017 21:23:48 +0000 (14:23 -0700)
committerbdemsky <bdemsky@uci.edu>
Tue, 5 Sep 2017 21:23:48 +0000 (14:23 -0700)
src/AST/boolean.cc
src/AST/boolean.h
src/AST/element.cc
src/AST/element.h
src/AST/function.cc
src/csolver.cc
src/mymemory.h

index 4ca9c404522deb2e324fc617580e8243d2159b37..978664450ba930b9eab9b61794197519a4309632 100644 (file)
@@ -37,9 +37,6 @@ BooleanPredicate::BooleanPredicate(Predicate *_predicate, Element **_inputs, uin
        encoding(this),
        inputs(_inputs, _numInputs),
        undefStatus(_undefinedStatus) {
-       for (uint i = 0; i < _numInputs; i++) {
-               _inputs[i]->parents.push(this);
-       }
 }
 
 BooleanLogic::BooleanLogic(CSolver *solver, LogicOp _op, BooleanEdge *array, uint asize) :
@@ -47,9 +44,6 @@ BooleanLogic::BooleanLogic(CSolver *solver, LogicOp _op, BooleanEdge *array, uin
        op(_op),
        replaced(false),
        inputs(array, asize) {
-       for (uint i = 0; i < asize; i++) {
-               array[i]->parents.push(this);
-       }
 }
 
 BooleanEdge cloneEdge(CSolver *solver, CloneMap *map, BooleanEdge e) {
@@ -96,3 +90,11 @@ Boolean *BooleanPredicate::clone(CSolver *solver, CloneMap *map) {
 
        return solver->applyPredicateTable(pred, array, inputs.getSize(), defstatus).getRaw();
 }
+
+void BooleanPredicate::updateParents() {
+       for(uint i=0;i < inputs.getSize(); i++) inputs.get(i)->parents.push(this);
+}
+
+void BooleanLogic::updateParents() {
+       for(uint i=0;i < inputs.getSize(); i++) inputs.get(i)->parents.push(this);
+}
index ecaebaf69c89fef2ebfc77d5de1fffd4c53db2e6..8be1d30626c93f6c3612ab0447157bb3f4825dc1 100644 (file)
@@ -21,7 +21,8 @@ public:
        Polarity polarity;
        BooleanValue boolVal;
        Vector<Boolean *> parents;
-
+       virtual void updateParents() {}
+       
        CMEMALLOC;
 };
 
@@ -66,6 +67,8 @@ public:
        Array<Element *> inputs;
        BooleanEdge undefStatus;
        FunctionEncoding *getFunctionEncoding() {return &encoding;}
+       void updateParents();
+
        CMEMALLOC;
 };
 
@@ -77,6 +80,8 @@ public:
        LogicOp op;
        bool replaced;
        Array<BooleanEdge> inputs;
+       void updateParents();
+       
        CMEMALLOC;
 };
 BooleanEdge cloneEdge(CSolver *solver, CloneMap *map, BooleanEdge e);
index 3fe8cef45710eee5c3ced313c9325700c73629db..fd308122caee3b28cd5a71226d4f591872113f57 100644 (file)
@@ -22,8 +22,6 @@ ElementFunction::ElementFunction(Function *_function, Element **array, uint numA
        inputs(array, numArrays),
        overflowstatus(_overflowstatus),
        functionencoding(this) {
-       for (uint i = 0; i < numArrays; i++)
-               array[i]->parents.push(this);
 }
 
 ElementConst::ElementConst(uint64_t _value, VarType _type, Set *_set) :
@@ -77,3 +75,7 @@ Element *ElementFunction::clone(CSolver *solver, CloneMap *map) {
        Element *e = solver->applyFunction(function->clone(solver, map), array, inputs.getSize(), overflowstatus->clone(solver, map));
        return e;
 }
+
+void ElementFunction::updateParents() {
+       for(uint i=0;i < inputs.getSize(); i++) inputs.get(i)->parents.push(this);
+}
index c3a3ed9fe2bd764207756b8fdfbc755cd1dfd0cc..544725624c4d4ab3ef6426fd4cc8fba070a756d0 100644 (file)
@@ -15,7 +15,8 @@ public:
        Vector<ASTNode *> parents;
        ElementEncoding encoding;
        virtual Element *clone(CSolver *solver, CloneMap *map) {ASSERT(0); return NULL;};
-
+       virtual void updateParents() {}
+       
        CMEMALLOC;
 };
 
@@ -44,6 +45,7 @@ public:
        BooleanEdge overflowstatus;
        FunctionEncoding functionencoding;
        Element *clone(CSolver *solver, CloneMap *map);
+       void updateParents();
        CMEMALLOC;
 };
 
index 6715e79e06e0115dc91449c02c768f4a7028472d..d6b2d3af814c02d589722406614ef101b2c7f0b4 100644 (file)
@@ -3,10 +3,18 @@
 #include "set.h"
 #include "csolver.h"
 
-FunctionOperator::FunctionOperator(ArithOp _op, Set **domain, uint numDomain, Set *_range, OverFlowBehavior _overflowbehavior) : Function(OPERATORFUNC), op(_op), domains(domain, numDomain), range(_range), overflowbehavior(_overflowbehavior) {
+FunctionOperator::FunctionOperator(ArithOp _op, Set **domain, uint numDomain, Set *_range, OverFlowBehavior _overflowbehavior) :
+       Function(OPERATORFUNC),
+       op(_op),
+       domains(domain, numDomain),
+       range(_range),
+       overflowbehavior(_overflowbehavior) {
 }
 
-FunctionTable::FunctionTable (Table *_table, UndefinedBehavior _undefBehavior) : Function(TABLEFUNC), table(_table), undefBehavior(_undefBehavior) {
+FunctionTable::FunctionTable (Table *_table, UndefinedBehavior _undefBehavior) :
+       Function(TABLEFUNC),
+       table(_table),
+       undefBehavior(_undefBehavior) {
 }
 
 uint64_t FunctionOperator::applyFunctionOperator(uint numVals, uint64_t *values) {
index d94ddfce66ffed8a98b4e849c129ae8751b3c678..d8e08729ab27d2fc5dd3b90dbe0b8d73f138402a 100644 (file)
@@ -143,6 +143,7 @@ Element *CSolver::applyFunction(Function *function, Element **array, uint numArr
        Element *element = new ElementFunction(function,array,numArrays,overflowstatus);
        Element *e = elemMap.get(element);
        if (e == NULL) {
+               element->updateParents();
                allElements.push(element);
                elemMap.put(element, element);
                return element;
@@ -212,6 +213,7 @@ BooleanEdge CSolver::applyPredicateTable(Predicate *predicate, Element **inputs,
        BooleanPredicate *boolean = new BooleanPredicate(predicate, inputs, numInputs, undefinedStatus);
        Boolean *b = boolMap.get(boolean);
        if (b == NULL) {
+               boolean->updateParents();
                boolMap.put(boolean, boolean);
                allBooleans.push(boolean);
                return BooleanEdge(boolean);
@@ -336,6 +338,7 @@ BooleanEdge CSolver::applyLogicalOperation(LogicOp op, BooleanEdge *array, uint
        Boolean *boolean = new BooleanLogic(this, op, array, asize);
        Boolean *b = boolMap.get(boolean);
        if (b == NULL) {
+               boolean->updateParents();
                boolMap.put(boolean, boolean);
                allBooleans.push(boolean);
                return BooleanEdge(boolean);
index 7c63aa11c10edb99f259ab9a11fffcae8df89794..e0a60bd13294b871199b826e88c0ea13261c1b3d 100644 (file)
@@ -26,7 +26,7 @@
    void * ourrealloc(void *ptr, size_t size);
 */
 
-#if 0
+#if 1
 void * model_malloc(size_t size);
 void model_free(void *ptr);
 void * model_calloc(size_t count, size_t size);