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