1243791Sdim//== ConstraintManager.cpp - Constraints on symbolic values -----*- C++ -*--==// 2243791Sdim// 3243791Sdim// The LLVM Compiler Infrastructure 4243791Sdim// 5243791Sdim// This file is distributed under the University of Illinois Open Source 6243791Sdim// License. See LICENSE.TXT for details. 7243791Sdim// 8243791Sdim//===----------------------------------------------------------------------===// 9243791Sdim// 10243791Sdim// This file defined the interface to manage constraints on symbolic values. 11243791Sdim// 12243791Sdim//===----------------------------------------------------------------------===// 13243791Sdim 14243791Sdim#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h" 15243791Sdim 16243791Sdimusing namespace clang; 17243791Sdimusing namespace ento; 18243791Sdim 19243791SdimConstraintManager::~ConstraintManager() {} 20243791Sdim 21243791Sdimstatic DefinedSVal getLocFromSymbol(const ProgramStateRef &State, 22243791Sdim SymbolRef Sym) { 23243791Sdim const MemRegion *R = State->getStateManager().getRegionManager() 24243791Sdim .getSymbolicRegion(Sym); 25243791Sdim return loc::MemRegionVal(R); 26243791Sdim} 27243791Sdim 28243791SdimConditionTruthVal ConstraintManager::checkNull(ProgramStateRef State, 29243791Sdim SymbolRef Sym) { 30243791Sdim QualType Ty = Sym->getType(); 31243791Sdim DefinedSVal V = Loc::isLocType(Ty) ? getLocFromSymbol(State, Sym) 32243791Sdim : nonloc::SymbolVal(Sym); 33243791Sdim const ProgramStatePair &P = assumeDual(State, V); 34243791Sdim if (P.first && !P.second) 35243791Sdim return ConditionTruthVal(false); 36243791Sdim if (!P.first && P.second) 37243791Sdim return ConditionTruthVal(true); 38243791Sdim return ConditionTruthVal(); 39243791Sdim} 40