SValBuilder.h revision 5b9bd2137ebef350af803c634e3fdf5d74678100
1e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek// SValuator.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// 10e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek// This file defines SValuator, a class that defines the interface for 11e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek// "symbolical evaluators" which construct an SVal from an expression. 121eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump// 13e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek//===----------------------------------------------------------------------===// 14e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek 15e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek#ifndef LLVM_CLANG_ANALYSIS_SVALUATOR 16e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek#define LLVM_CLANG_ANALYSIS_SVALUATOR 17e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek 18e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek#include "clang/AST/Expr.h" 19e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek#include "clang/Analysis/PathSensitive/SVals.h" 20e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek 21e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremeneknamespace clang { 22e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek 23e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenekclass GRState; 24e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenekclass ValueManager; 25e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek 26e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenekclass SValuator { 2732c3fa4195762ba93f0b7114ab36c0941bc34432Ted Kremenek friend class ValueManager; 28e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenekprotected: 29e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek ValueManager &ValMgr; 3032c3fa4195762ba93f0b7114ab36c0941bc34432Ted Kremenek 311eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump virtual SVal EvalCastNL(NonLoc val, QualType castTy) = 0; 321eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 3332c3fa4195762ba93f0b7114ab36c0941bc34432Ted Kremenek virtual SVal EvalCastL(Loc val, QualType castTy) = 0; 3432c3fa4195762ba93f0b7114ab36c0941bc34432Ted Kremenek 35e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenekpublic: 36e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek SValuator(ValueManager &valMgr) : ValMgr(valMgr) {} 37e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek virtual ~SValuator() {} 381eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 395b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek template <typename T> 405b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek class GenericCastResult : public std::pair<const GRState *, T> { 4132c3fa4195762ba93f0b7114ab36c0941bc34432Ted Kremenek public: 425b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek const GRState *getState() const { return this->first; } 435b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek T getSVal() const { return this->second; } 445b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek GenericCastResult(const GRState *s, T v) 455b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek : std::pair<const GRState*,T>(s, v) {} 465b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek }; 475b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek 485b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek class CastResult : public GenericCastResult<SVal> { 495b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek public: 505b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek CastResult(const GRState *s, SVal v) : GenericCastResult<SVal>(s, v) {} 515b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek }; 525b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek 535b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek class DefinedOrUnknownCastResult : 545b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek public GenericCastResult<DefinedOrUnknownSVal> { 555b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek public: 565b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek DefinedOrUnknownCastResult(const GRState *s, DefinedOrUnknownSVal v) 575b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek : GenericCastResult<DefinedOrUnknownSVal>(s, v) {} 5832c3fa4195762ba93f0b7114ab36c0941bc34432Ted Kremenek }; 591eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 605b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek CastResult EvalCast(SVal V, const GRState *ST, 6132c3fa4195762ba93f0b7114ab36c0941bc34432Ted Kremenek QualType castTy, QualType originalType); 625b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek 635b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek DefinedOrUnknownCastResult EvalCast(DefinedOrUnknownSVal V, const GRState *ST, 645b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek QualType castTy, QualType originalType); 651eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 66e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek virtual SVal EvalMinus(NonLoc val) = 0; 671eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 68e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek virtual SVal EvalComplement(NonLoc val) = 0; 69e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek 70e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek virtual SVal EvalBinOpNN(BinaryOperator::Opcode Op, NonLoc lhs, 71e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek NonLoc rhs, QualType resultTy) = 0; 72e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek 73e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek virtual SVal EvalBinOpLL(BinaryOperator::Opcode Op, Loc lhs, Loc rhs, 74e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek QualType resultTy) = 0; 75e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek 76e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek virtual SVal EvalBinOpLN(const GRState *state, BinaryOperator::Opcode Op, 771eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump Loc lhs, NonLoc rhs, QualType resultTy) = 0; 785b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek 79ff4264dae31cf42807b64ecc114906b0b835690aTed Kremenek SVal EvalBinOp(const GRState *ST, BinaryOperator::Opcode Op, 80ff4264dae31cf42807b64ecc114906b0b835690aTed Kremenek SVal L, SVal R, QualType T); 815b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek 825b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek DefinedOrUnknownSVal EvalEQ(const GRState *ST, DefinedOrUnknownSVal L, 835b9bd2137ebef350af803c634e3fdf5d74678100Ted Kremenek DefinedOrUnknownSVal R); 84e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek}; 851eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 86e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed KremenekSValuator* CreateSimpleSValuator(ValueManager &valMgr); 871eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump 88e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek} // end clang namespace 89e74eaef9b550c002e59dfc57c0dd640a5f129e8eTed Kremenek#endif 90