Home | History | Annotate | Download | only in Core
      1 //== ConstraintManager.cpp - Constraints on symbolic values -----*- 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 //  This file defined the interface to manage constraints on symbolic values.
     11 //
     12 //===----------------------------------------------------------------------===//
     13 
     14 #include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h"
     15 
     16 using namespace clang;
     17 using namespace ento;
     18 
     19 ConstraintManager::~ConstraintManager() {}
     20 
     21 static DefinedSVal getLocFromSymbol(const ProgramStateRef &State,
     22                                     SymbolRef Sym) {
     23   const MemRegion *R = State->getStateManager().getRegionManager()
     24                                                .getSymbolicRegion(Sym);
     25   return loc::MemRegionVal(R);
     26 }
     27 
     28 ConditionTruthVal ConstraintManager::checkNull(ProgramStateRef State,
     29                                                SymbolRef Sym) {
     30   QualType Ty = Sym->getType();
     31   DefinedSVal V = Loc::isLocType(Ty) ? getLocFromSymbol(State, Sym)
     32                                      : nonloc::SymbolVal(Sym);
     33   const ProgramStatePair &P = assumeDual(State, V);
     34   if (P.first && !P.second)
     35     return ConditionTruthVal(false);
     36   if (!P.first && P.second)
     37     return ConditionTruthVal(true);
     38   return ConditionTruthVal();
     39 }
     40