147cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenek//== ConstraintManager.cpp - Constraints on symbolic values -----*- C++ -*--==//
247cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenek//
347cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenek//                     The LLVM Compiler Infrastructure
447cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenek//
547cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenek// This file is distributed under the University of Illinois Open Source
647cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenek// License. See LICENSE.TXT for details.
747cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenek//
847cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenek//===----------------------------------------------------------------------===//
947cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenek//
1047cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenek//  This file defined the interface to manage constraints on symbolic values.
1147cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenek//
1247cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenek//===----------------------------------------------------------------------===//
1347cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenek
1447cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenek#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h"
1547cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenek
1647cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenekusing namespace clang;
1747cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenekusing namespace ento;
1847cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenek
1947cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted KremenekConstraintManager::~ConstraintManager() {}
2047cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenek
2147cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenekstatic DefinedSVal getLocFromSymbol(const ProgramStateRef &State,
2247cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenek                                    SymbolRef Sym) {
2347cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenek  const MemRegion *R = State->getStateManager().getRegionManager()
2447cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenek                                               .getSymbolicRegion(Sym);
2547cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenek  return loc::MemRegionVal(R);
2647cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenek}
2747cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenek
28c45bb4dcb648cd8b5250492afe7df254e4157aaaJordan RoseConditionTruthVal ConstraintManager::checkNull(ProgramStateRef State,
29c45bb4dcb648cd8b5250492afe7df254e4157aaaJordan Rose                                               SymbolRef Sym) {
30732cdf383f9030ff2b9fb28dfbdae2285ded80c6Ted Kremenek  QualType Ty = Sym->getType();
3147cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenek  DefinedSVal V = Loc::isLocType(Ty) ? getLocFromSymbol(State, Sym)
3247cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenek                                     : nonloc::SymbolVal(Sym);
3347cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenek  const ProgramStatePair &P = assumeDual(State, V);
3447cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenek  if (P.first && !P.second)
3547cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenek    return ConditionTruthVal(false);
3647cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenek  if (!P.first && P.second)
3747cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenek    return ConditionTruthVal(true);
3847cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenek  return ConditionTruthVal();
3947cbd0f3892c7965cf16a58393f9f17a22d4d4d9Ted Kremenek}
40