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