Home | History | Annotate | Download | only in Core
      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