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