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