SValBuilder.h revision 846eabd187be4bfe992e8bca131166b734d86e0d
1846eabd187be4bfe992e8bca131166b734d86e0dTed Kremenek// SValBuilder.h - Construction of SVals from evaluating expressions -*- C++ -*-
2e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek//
3e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek//                     The LLVM Compiler Infrastructure
4e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek//
5e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek// This file is distributed under the University of Illinois Open Source
6e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek// License. See LICENSE.TXT for details.
7e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek//
8e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek//===----------------------------------------------------------------------===//
9e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek//
10846eabd187be4bfe992e8bca131166b734d86e0dTed Kremenek//  This file defines SValBuilder, a class that defines the interface for
11e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek//  "symbolical evaluators" which construct an SVal from an expression.
121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump//
13e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek//===----------------------------------------------------------------------===//
14e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek
15846eabd187be4bfe992e8bca131166b734d86e0dTed Kremenek#ifndef LLVM_CLANG_ANALYSIS_SVALBUILDER
16846eabd187be4bfe992e8bca131166b734d86e0dTed Kremenek#define LLVM_CLANG_ANALYSIS_SVALBUILDER
17e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek
18e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek#include "clang/AST/Expr.h"
191309f9a3b225ea846e5822691c39a77423125505Ted Kremenek#include "clang/Checker/PathSensitive/SVals.h"
20e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek
21e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremeneknamespace clang {
22e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek
23e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenekclass GRState;
24e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenekclass ValueManager;
25e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek
26846eabd187be4bfe992e8bca131166b734d86e0dTed Kremenekclass SValBuilder {
2732c3fa4195762ba93f0b7114ab36c0941bc34432Ted Kremenek  friend class ValueManager;
28e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenekprotected:
29e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek  ValueManager &ValMgr;
3032c3fa4195762ba93f0b7114ab36c0941bc34432Ted Kremenek
31c50e6df965ff264952d8d5805d151f89c89af302Ted Kremenekpublic:
32c50e6df965ff264952d8d5805d151f89c89af302Ted Kremenek  // FIXME: Make these protected again one RegionStoreManager correctly
33c50e6df965ff264952d8d5805d151f89c89af302Ted Kremenek  // handles loads from differening bound value types.
341eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  virtual SVal EvalCastNL(NonLoc val, QualType castTy) = 0;
3532c3fa4195762ba93f0b7114ab36c0941bc34432Ted Kremenek  virtual SVal EvalCastL(Loc val, QualType castTy) = 0;
3632c3fa4195762ba93f0b7114ab36c0941bc34432Ted Kremenek
37e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenekpublic:
38846eabd187be4bfe992e8bca131166b734d86e0dTed Kremenek  SValBuilder(ValueManager &valMgr) : ValMgr(valMgr) {}
39846eabd187be4bfe992e8bca131166b734d86e0dTed Kremenek  virtual ~SValBuilder() {}
401eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
41814e6b915450456eb2a1ba15d82fc7f8ae3bc8a6Zhongxing Xu  SVal EvalCast(SVal V, QualType castTy, QualType originalType);
425b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek
43e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek  virtual SVal EvalMinus(NonLoc val) = 0;
441eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
45e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek  virtual SVal EvalComplement(NonLoc val) = 0;
46e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek
47cd8f6ac9b613e1fe962ebf9c87d822ce765275e6Ted Kremenek  virtual SVal EvalBinOpNN(const GRState *state, BinaryOperator::Opcode Op,
48cd8f6ac9b613e1fe962ebf9c87d822ce765275e6Ted Kremenek                           NonLoc lhs, NonLoc rhs, QualType resultTy) = 0;
49e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek
50eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose  virtual SVal EvalBinOpLL(const GRState *state, BinaryOperator::Opcode Op,
51eac4a00e1d93aa963903031ed76425c231f0f0b9Jordy Rose                           Loc lhs, Loc rhs, QualType resultTy) = 0;
52e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek
53e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek  virtual SVal EvalBinOpLN(const GRState *state, BinaryOperator::Opcode Op,
541eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump                           Loc lhs, NonLoc rhs, QualType resultTy) = 0;
5532f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose
5632f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  /// getKnownValue - Evaluates a given SVal. If the SVal has only one possible
5732f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  ///  (integer) value, that value is returned. Otherwise, returns NULL.
5832f2656b90900ac04c4b50e87c16749d0ceb9ef2Jordy Rose  virtual const llvm::APSInt *getKnownValue(const GRState *state, SVal V) = 0;
595b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek
60ff4264dae31cf42807b64ecc114906b0b835690aTed Kremenek  SVal EvalBinOp(const GRState *ST, BinaryOperator::Opcode Op,
61ff4264dae31cf42807b64ecc114906b0b835690aTed Kremenek                 SVal L, SVal R, QualType T);
625b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek
635b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek  DefinedOrUnknownSVal EvalEQ(const GRState *ST, DefinedOrUnknownSVal L,
645b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek                              DefinedOrUnknownSVal R);
65e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek};
661eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
67846eabd187be4bfe992e8bca131166b734d86e0dTed KremenekSValBuilder* createSimpleSValBuilder(ValueManager &valMgr);
681eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump
69e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek} // end clang namespace
70e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek#endif
71