]> CyberLeo.Net >> Repos - FreeBSD/stable/9.git/blob - contrib/llvm/tools/clang/lib/StaticAnalyzer/Core/SimpleConstraintManager.h
MFC r234353:
[FreeBSD/stable/9.git] / contrib / llvm / tools / clang / lib / StaticAnalyzer / Core / SimpleConstraintManager.h
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   ProgramStateRef assume(ProgramStateRef state, DefinedSVal Cond,
35                         bool Assumption);
36
37   ProgramStateRef assume(ProgramStateRef state, Loc Cond, bool Assumption);
38
39   ProgramStateRef assume(ProgramStateRef state, NonLoc Cond, bool Assumption);
40
41   ProgramStateRef assumeSymRel(ProgramStateRef state,
42                               const SymExpr *LHS,
43                               BinaryOperator::Opcode op,
44                               const llvm::APSInt& Int);
45
46 protected:
47
48   //===------------------------------------------------------------------===//
49   // Interface that subclasses must implement.
50   //===------------------------------------------------------------------===//
51
52   // Each of these is of the form "$sym+Adj <> V", where "<>" is the comparison
53   // operation for the method being invoked.
54   virtual ProgramStateRef assumeSymNE(ProgramStateRef state, SymbolRef sym,
55                                      const llvm::APSInt& V,
56                                      const llvm::APSInt& Adjustment) = 0;
57
58   virtual ProgramStateRef assumeSymEQ(ProgramStateRef state, SymbolRef sym,
59                                      const llvm::APSInt& V,
60                                      const llvm::APSInt& Adjustment) = 0;
61
62   virtual ProgramStateRef assumeSymLT(ProgramStateRef state, SymbolRef sym,
63                                      const llvm::APSInt& V,
64                                      const llvm::APSInt& Adjustment) = 0;
65
66   virtual ProgramStateRef assumeSymGT(ProgramStateRef state, SymbolRef sym,
67                                      const llvm::APSInt& V,
68                                      const llvm::APSInt& Adjustment) = 0;
69
70   virtual ProgramStateRef assumeSymLE(ProgramStateRef state, SymbolRef sym,
71                                      const llvm::APSInt& V,
72                                      const llvm::APSInt& Adjustment) = 0;
73
74   virtual ProgramStateRef assumeSymGE(ProgramStateRef state, SymbolRef sym,
75                                      const llvm::APSInt& V,
76                                      const llvm::APSInt& Adjustment) = 0;
77
78   //===------------------------------------------------------------------===//
79   // Internal implementation.
80   //===------------------------------------------------------------------===//
81
82   bool canReasonAbout(SVal X) const;
83
84   ProgramStateRef assumeAux(ProgramStateRef state,
85                                 Loc Cond,
86                                 bool Assumption);
87
88   ProgramStateRef assumeAux(ProgramStateRef state,
89                                 NonLoc Cond,
90                                 bool Assumption);
91
92   ProgramStateRef assumeAuxForSymbol(ProgramStateRef State,
93                                          SymbolRef Sym,
94                                          bool Assumption);
95 };
96
97 } // end GR namespace
98
99 } // end clang namespace
100
101 #endif