1218887Sdim//===- ConstraintManager.cpp - Constraints on symbolic values. ------------===//
2218887Sdim//
3218887Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4218887Sdim// See https://llvm.org/LICENSE.txt for license information.
5218887Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6218887Sdim//
7218887Sdim//===----------------------------------------------------------------------===//
8218887Sdim//
9218887Sdim//  This file defined the interface to manage constraints on symbolic values.
10218887Sdim//
11218887Sdim//===----------------------------------------------------------------------===//
12218887Sdim
13218887Sdim#include "clang/StaticAnalyzer/Core/PathSensitive/ConstraintManager.h"
14218887Sdim#include "clang/AST/Type.h"
15218887Sdim#include "clang/StaticAnalyzer/Core/PathSensitive/MemRegion.h"
16218887Sdim#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState.h"
17218887Sdim#include "clang/StaticAnalyzer/Core/PathSensitive/ProgramState_Fwd.h"
18218887Sdim#include "clang/StaticAnalyzer/Core/PathSensitive/SVals.h"
19218887Sdim
20218887Sdimusing namespace clang;
21218887Sdimusing namespace ento;
22218887Sdim
23218887SdimConstraintManager::~ConstraintManager() = default;
24218887Sdim
25218887Sdimstatic DefinedSVal getLocFromSymbol(const ProgramStateRef &State,
26218887Sdim                                    SymbolRef Sym) {
27218887Sdim  const MemRegion *R =
28218887Sdim      State->getStateManager().getRegionManager().getSymbolicRegion(Sym);
29218887Sdim  return loc::MemRegionVal(R);
30218887Sdim}
31218887Sdim
32218887SdimConditionTruthVal ConstraintManager::checkNull(ProgramStateRef State,
33218887Sdim                                               SymbolRef Sym) {
34218887Sdim  QualType Ty = Sym->getType();
35218887Sdim  DefinedSVal V = Loc::isLocType(Ty) ? getLocFromSymbol(State, Sym)
36218887Sdim                                     : nonloc::SymbolVal(Sym);
37218887Sdim  const ProgramStatePair &P = assumeDual(State, V);
38218887Sdim  if (P.first && !P.second)
39218887Sdim    return ConditionTruthVal(false);
40218887Sdim  if (!P.first && P.second)
41226633Sdim    return ConditionTruthVal(true);
42218887Sdim  return {};
43218887Sdim}
44226633Sdim