blob: ac07f8b32416e7146b3015540d0f535fd520e04d [file] [log] [blame]
Ted Kremenek25a484d2008-02-14 18:28:23 +00001// GRSimpleVals.h - Transfer functions for tracking simple values -*- C++ -*--//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
Gabor Greif2224fcb2008-03-06 10:40:09 +000010// This file defines GRSimpleVals, a sub-class of GRTransferFuncs that
Ted Kremenek25a484d2008-02-14 18:28:23 +000011// provides transfer functions for performing simple value tracking with
12// limited support for symbolics.
13//
14//===----------------------------------------------------------------------===//
15
16#ifndef LLVM_CLANG_ANALYSIS_GRSIMPLEVALS
17#define LLVM_CLANG_ANALYSIS_GRSIMPLEVALS
18
19#include "clang/Analysis/PathSensitive/GRTransferFuncs.h"
Ted Kremenek3862eb12008-02-14 22:36:46 +000020#include "clang/Analysis/PathSensitive/GRExprEngine.h"
Ted Kremenek25a484d2008-02-14 18:28:23 +000021
22namespace clang {
23
Ted Kremenekf00daf02008-04-03 17:57:38 +000024class PathDiagnostic;
25class ASTContext;
26
Ted Kremenek25a484d2008-02-14 18:28:23 +000027class GRSimpleVals : public GRTransferFuncs {
Ted Kremenek589f8812008-07-18 15:27:58 +000028protected:
29
30 virtual RVal DetermEvalBinOpNN(ValueStateManager& StateMgr,
31 BinaryOperator::Opcode Op,
32 NonLVal L, NonLVal R);
33
Ted Kremenek25a484d2008-02-14 18:28:23 +000034public:
35 GRSimpleVals() {}
36 virtual ~GRSimpleVals() {}
37
Ted Kremenek0e80dea2008-04-09 21:41:14 +000038 virtual void RegisterChecks(GRExprEngine& Eng);
39
Ted Kremenekc9922fd2008-02-14 18:40:24 +000040 // Casts.
41
Ted Kremenekce3ed1e2008-03-12 01:21:45 +000042 virtual RVal EvalCast(GRExprEngine& Engine, NonLVal V, QualType CastT);
43 virtual RVal EvalCast(GRExprEngine& Engine, LVal V, QualType CastT);
Ted Kremenekc9922fd2008-02-14 18:40:24 +000044
45 // Unary Operators.
46
Ted Kremenekce3ed1e2008-03-12 01:21:45 +000047 virtual RVal EvalMinus(GRExprEngine& Engine, UnaryOperator* U, NonLVal X);
Ted Kremenek07baa252008-02-21 18:02:17 +000048
Ted Kremenekce3ed1e2008-03-12 01:21:45 +000049 virtual RVal EvalComplement(GRExprEngine& Engine, NonLVal X);
Ted Kremenekb1934132008-02-14 19:37:24 +000050
51 // Binary Operators.
52
Ted Kremenekce3ed1e2008-03-12 01:21:45 +000053 virtual RVal EvalBinOp(GRExprEngine& Engine, BinaryOperator::Opcode Op,
Ted Kremenek07baa252008-02-21 18:02:17 +000054 LVal L, LVal R);
Ted Kremenek521d9722008-02-15 23:15:23 +000055
Ted Kremenek775e0d82008-02-15 00:52:26 +000056 // Pointer arithmetic.
57
Ted Kremenekce3ed1e2008-03-12 01:21:45 +000058 virtual RVal EvalBinOp(GRExprEngine& Engine, BinaryOperator::Opcode Op,
Ted Kremenek07baa252008-02-21 18:02:17 +000059 LVal L, NonLVal R);
Ted Kremenek775e0d82008-02-15 00:52:26 +000060
Ted Kremenek348d7852008-02-26 23:04:29 +000061 // Calls.
62
Ted Kremenek3eea8dd2008-03-05 00:33:14 +000063 virtual void EvalCall(ExplodedNodeSet<ValueState>& Dst,
Ted Kremenekce3ed1e2008-03-12 01:21:45 +000064 GRExprEngine& Engine,
Ted Kremenek3eea8dd2008-03-05 00:33:14 +000065 GRStmtNodeBuilder<ValueState>& Builder,
Ted Kremenek0a6a80b2008-04-23 20:12:28 +000066 CallExpr* CE, RVal L,
Ted Kremenek3eea8dd2008-03-05 00:33:14 +000067 ExplodedNode<ValueState>* Pred);
Ted Kremenek348d7852008-02-26 23:04:29 +000068
Ted Kremenekca5f6202008-04-15 23:06:53 +000069 virtual void EvalObjCMessageExpr(ExplodedNodeSet<ValueState>& Dst,
70 GRExprEngine& Engine,
71 GRStmtNodeBuilder<ValueState>& Builder,
72 ObjCMessageExpr* ME,
73 ExplodedNode<ValueState>* Pred);
74
75
76
Ted Kremenekf00daf02008-04-03 17:57:38 +000077 static void GeneratePathDiagnostic(PathDiagnostic& PD, ASTContext& Ctx,
78 ExplodedNode<ValueState>* N);
79
Ted Kremenek521d9722008-02-15 23:15:23 +000080protected:
Ted Kremenek25a484d2008-02-14 18:28:23 +000081
Ted Kremenek07baa252008-02-21 18:02:17 +000082 // Equality operators for LVals.
83
Ted Kremenekce3ed1e2008-03-12 01:21:45 +000084 RVal EvalEQ(GRExprEngine& Engine, LVal L, LVal R);
85 RVal EvalNE(GRExprEngine& Engine, LVal L, LVal R);
Ted Kremenek07baa252008-02-21 18:02:17 +000086};
Ted Kremenek25a484d2008-02-14 18:28:23 +000087
88} // end clang namespace
89
90#endif