1 //== SimpleConstraintManager.h ----------------------------------*- C++ -*--==// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // Code shared between BasicConstraintManager and RangeConstraintManager. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_CLANG_GR_SIMPLE_CONSTRAINT_MANAGER_H 15 #define LLVM_CLANG_GR_SIMPLE_CONSTRAINT_MANAGER_H 16 17 #include "clang/StaticAnalyzer/Core/PathSensitive/ConstraintManager.h" 18 #include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h" 19 20 namespace clang { 21 22 namespace ento { 23 24 class SimpleConstraintManager : public ConstraintManager { 25 SubEngine &SU; 26 public: 27 SimpleConstraintManager(SubEngine &subengine) : SU(subengine) {} 28 virtual ~SimpleConstraintManager(); 29 30 //===------------------------------------------------------------------===// 31 // Common implementation for the interface provided by ConstraintManager. 32 //===------------------------------------------------------------------===// 33 34 bool canReasonAbout(SVal X) const; 35 36 const ProgramState *assume(const ProgramState *state, DefinedSVal Cond, 37 bool Assumption); 38 39 const ProgramState *assume(const ProgramState *state, Loc Cond, bool Assumption); 40 41 const ProgramState *assume(const ProgramState *state, NonLoc Cond, bool Assumption); 42 43 const ProgramState *assumeSymRel(const ProgramState *state, 44 const SymExpr *LHS, 45 BinaryOperator::Opcode op, 46 const llvm::APSInt& Int); 47 48 protected: 49 50 //===------------------------------------------------------------------===// 51 // Interface that subclasses must implement. 52 //===------------------------------------------------------------------===// 53 54 // Each of these is of the form "$sym+Adj <> V", where "<>" is the comparison 55 // operation for the method being invoked. 56 virtual const ProgramState *assumeSymNE(const ProgramState *state, SymbolRef sym, 57 const llvm::APSInt& V, 58 const llvm::APSInt& Adjustment) = 0; 59 60 virtual const ProgramState *assumeSymEQ(const ProgramState *state, SymbolRef sym, 61 const llvm::APSInt& V, 62 const llvm::APSInt& Adjustment) = 0; 63 64 virtual const ProgramState *assumeSymLT(const ProgramState *state, SymbolRef sym, 65 const llvm::APSInt& V, 66 const llvm::APSInt& Adjustment) = 0; 67 68 virtual const ProgramState *assumeSymGT(const ProgramState *state, SymbolRef sym, 69 const llvm::APSInt& V, 70 const llvm::APSInt& Adjustment) = 0; 71 72 virtual const ProgramState *assumeSymLE(const ProgramState *state, SymbolRef sym, 73 const llvm::APSInt& V, 74 const llvm::APSInt& Adjustment) = 0; 75 76 virtual const ProgramState *assumeSymGE(const ProgramState *state, SymbolRef sym, 77 const llvm::APSInt& V, 78 const llvm::APSInt& Adjustment) = 0; 79 80 //===------------------------------------------------------------------===// 81 // Internal implementation. 82 //===------------------------------------------------------------------===// 83 84 const ProgramState *assumeAux(const ProgramState *state, Loc Cond,bool Assumption); 85 86 const ProgramState *assumeAux(const ProgramState *state, NonLoc Cond, bool Assumption); 87 }; 88 89 } // end GR namespace 90 91 } // end clang namespace 92 93 #endif 94