Fixed analyzer caching bug involving the transfer function for loads.
llvm-svn: 55494
This commit is contained in:
		
							parent
							
								
									8c8616377d
								
							
						
					
					
						commit
						f1b9209a34
					
				| 
						 | 
					@ -230,7 +230,8 @@ public:
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  NodeTy* MakeNode(ExplodedNodeSet<StateTy>& Dst, Stmt* S,
 | 
					  NodeTy* MakeNode(ExplodedNodeSet<StateTy>& Dst, Stmt* S,
 | 
				
			||||||
                   NodeTy* Pred, const StateTy* St) {    
 | 
					                   NodeTy* Pred, const StateTy* St,
 | 
				
			||||||
 | 
					                   ProgramPoint::Kind K = ProgramPoint::PostStmtKind) {    
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    const StateTy* PredState = GetState(Pred);
 | 
					    const StateTy* PredState = GetState(Pred);
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
| 
						 | 
					@ -240,7 +241,7 @@ public:
 | 
				
			||||||
      return NULL;
 | 
					      return NULL;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    NodeTy* N = generateNode(S, St, Pred);
 | 
					    NodeTy* N = generateNode(S, St, Pred, K);
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    if (N) {      
 | 
					    if (N) {      
 | 
				
			||||||
      if (BuildSinks)
 | 
					      if (BuildSinks)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -442,9 +442,10 @@ protected:
 | 
				
			||||||
    return StateMgr.Assume(St, Cond, Assumption, isFeasible);
 | 
					    return StateMgr.Assume(St, Cond, Assumption, isFeasible);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  NodeTy* MakeNode(NodeSet& Dst, Stmt* S, NodeTy* Pred, const GRState* St) {
 | 
					  NodeTy* MakeNode(NodeSet& Dst, Stmt* S, NodeTy* Pred, const GRState* St,
 | 
				
			||||||
 | 
					                   ProgramPoint::Kind K = ProgramPoint::PostStmtKind) {
 | 
				
			||||||
    assert (Builder && "GRStmtNodeBuilder not present.");
 | 
					    assert (Builder && "GRStmtNodeBuilder not present.");
 | 
				
			||||||
    return Builder->MakeNode(Dst, S, Pred, St);
 | 
					    return Builder->MakeNode(Dst, S, Pred, St, K);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
  /// Visit - Transfer function logic for all statements.  Dispatches to
 | 
					  /// Visit - Transfer function logic for all statements.  Dispatches to
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -954,6 +954,7 @@ void GRExprEngine::EvalLoad(NodeSet& Dst, Expr* Ex, NodeTy* Pred,
 | 
				
			||||||
    return;
 | 
					    return;
 | 
				
			||||||
  
 | 
					  
 | 
				
			||||||
  // Proceed with the load.
 | 
					  // Proceed with the load.
 | 
				
			||||||
 | 
					  ProgramPoint::Kind K = ProgramPoint::PostLoadKind;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  // FIXME: Currently symbolic analysis "generates" new symbols
 | 
					  // FIXME: Currently symbolic analysis "generates" new symbols
 | 
				
			||||||
  //  for the contents of values.  We need a better approach.
 | 
					  //  for the contents of values.  We need a better approach.
 | 
				
			||||||
| 
						 | 
					@ -962,14 +963,14 @@ void GRExprEngine::EvalLoad(NodeSet& Dst, Expr* Ex, NodeTy* Pred,
 | 
				
			||||||
  //  loads aren't fully implemented.  Eventually this option will go away.
 | 
					  //  loads aren't fully implemented.  Eventually this option will go away.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  if (CheckOnly)
 | 
					  if (CheckOnly)
 | 
				
			||||||
    MakeNode(Dst, Ex, Pred, St);
 | 
					    MakeNode(Dst, Ex, Pred, St, K);
 | 
				
			||||||
  else if (location.isUnknown()) {
 | 
					  else if (location.isUnknown()) {
 | 
				
			||||||
    // This is important.  We must nuke the old binding.
 | 
					    // This is important.  We must nuke the old binding.
 | 
				
			||||||
    MakeNode(Dst, Ex, Pred, SetRVal(St, Ex, UnknownVal()));
 | 
					    MakeNode(Dst, Ex, Pred, SetRVal(St, Ex, UnknownVal()), K);
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
  else    
 | 
					  else    
 | 
				
			||||||
    MakeNode(Dst, Ex, Pred, SetRVal(St, Ex, GetRVal(St, cast<LVal>(location),
 | 
					    MakeNode(Dst, Ex, Pred, SetRVal(St, Ex, GetRVal(St, cast<LVal>(location),
 | 
				
			||||||
                                                    Ex->getType())));  
 | 
					                                                    Ex->getType())), K);  
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const GRState* GRExprEngine::EvalLocation(Expr* Ex, NodeTy* Pred,
 | 
					const GRState* GRExprEngine::EvalLocation(Expr* Ex, NodeTy* Pred,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue