ConstraintManager.h revision 8bef8238181a30e52dea380789a7e2d760eac532
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//== ConstraintManager.h - Constraints on symbolic values.-------*- C++ -*--==//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details.
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//  This file defined the interface to manage constraints on symbolic values.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===----------------------------------------------------------------------===//
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef LLVM_CLANG_GR_CONSTRAINT_MANAGER_H
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define LLVM_CLANG_GR_CONSTRAINT_MANAGER_H
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "clang/StaticAnalyzer/Core/PathSensitive/SymbolManager.h"
182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h"
191320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace llvm {
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class APSInt;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)
24868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)namespace clang {
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ento {
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SubEngine;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class ConstraintManager {
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)public:
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~ConstraintManager();
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ProgramStateRef assume(ProgramStateRef state,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     DefinedSVal Cond,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     bool Assumption) = 0;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::pair<ProgramStateRef , ProgramStateRef >
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assumeDual(ProgramStateRef state, DefinedSVal Cond)
385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::pair<ProgramStateRef , ProgramStateRef > res =
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::make_pair(assume(state, Cond, true), assume(state, Cond, false));
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    assert(!(!res.first && !res.second) && "System is over constrained.");
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return res;
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual const llvm::APSInt* getSymVal(ProgramStateRef state,
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        SymbolRef sym) const = 0;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool isEqual(ProgramStateRef state,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                       SymbolRef sym,
515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                       const llvm::APSInt& V) const = 0;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ProgramStateRef removeDeadBindings(ProgramStateRef state,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                 SymbolReaper& SymReaper) = 0;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void print(ProgramStateRef state,
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     raw_ostream &Out,
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const char* nl,
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                     const char *sep) = 0;
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void EndPath(ProgramStateRef state) {}
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)protected:
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// canReasonAbout - Not all ConstraintManagers can accurately reason about
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///  all SVal values.  This method returns true if the ConstraintManager can
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///  reasonably handle a given SVal value.  This is typically queried by
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///  ExprEngine to determine if the value should be replaced with a
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ///  conjured symbolic value in order to recover some precision.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool canReasonAbout(SVal X) const = 0;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ConstraintManager* CreateBasicConstraintManager(ProgramStateManager& statemgr,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                SubEngine &subengine);
7434680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)ConstraintManager* CreateRangeConstraintManager(ProgramStateManager& statemgr,
7534680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)                                                SubEngine &subengine);
7634680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
7734680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)} // end GR namespace
7834680572440d7894ef8dafce81d8039ed80726a2Torne (Richard Coles)
795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} // end clang namespace
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif
825d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)