blob: 5adf895af885f931521e2f67f03b57a6bf625609 [file] [log] [blame]
Ted Kremenekd59cccc2008-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 Greif843e9342008-03-06 10:40:09 +000010// This file defines GRSimpleVals, a sub-class of GRTransferFuncs that
Ted Kremenekd59cccc2008-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 Kremeneke01c9872008-02-14 22:36:46 +000020#include "clang/Analysis/PathSensitive/GRExprEngine.h"
Ted Kremenekd59cccc2008-02-14 18:28:23 +000021
22namespace clang {
23
Ted Kremenekf1ae7052008-04-03 17:57:38 +000024class PathDiagnostic;
25class ASTContext;
26
Ted Kremenekd59cccc2008-02-14 18:28:23 +000027class GRSimpleVals : public GRTransferFuncs {
28public:
29 GRSimpleVals() {}
30 virtual ~GRSimpleVals() {}
31
Ted Kremenek50a6d0c2008-04-09 21:41:14 +000032 virtual void RegisterChecks(GRExprEngine& Eng);
33
Ted Kremenekc3f261d2008-02-14 18:40:24 +000034 // Casts.
35
Ted Kremenek00a3a5f2008-03-12 01:21:45 +000036 virtual RVal EvalCast(GRExprEngine& Engine, NonLVal V, QualType CastT);
37 virtual RVal EvalCast(GRExprEngine& Engine, LVal V, QualType CastT);
Ted Kremenekc3f261d2008-02-14 18:40:24 +000038
39 // Unary Operators.
40
Ted Kremenek00a3a5f2008-03-12 01:21:45 +000041 virtual RVal EvalMinus(GRExprEngine& Engine, UnaryOperator* U, NonLVal X);
Ted Kremenekaa1c4e52008-02-21 18:02:17 +000042
Ted Kremenek00a3a5f2008-03-12 01:21:45 +000043 virtual RVal EvalComplement(GRExprEngine& Engine, NonLVal X);
Ted Kremenek6cb0b542008-02-14 19:37:24 +000044
45 // Binary Operators.
46
Ted Kremenek00a3a5f2008-03-12 01:21:45 +000047 virtual RVal EvalBinOp(GRExprEngine& Engine, BinaryOperator::Opcode Op,
Ted Kremenekaa1c4e52008-02-21 18:02:17 +000048 NonLVal L, NonLVal R);
Ted Kremenek6cb0b542008-02-14 19:37:24 +000049
Ted Kremenek00a3a5f2008-03-12 01:21:45 +000050 virtual RVal EvalBinOp(GRExprEngine& Engine, BinaryOperator::Opcode Op,
Ted Kremenekaa1c4e52008-02-21 18:02:17 +000051 LVal L, LVal R);
Ted Kremenekc6fbdcd2008-02-15 23:15:23 +000052
Ted Kremenekb640b3b2008-02-15 00:52:26 +000053 // Pointer arithmetic.
54
Ted Kremenek00a3a5f2008-03-12 01:21:45 +000055 virtual RVal EvalBinOp(GRExprEngine& Engine, BinaryOperator::Opcode Op,
Ted Kremenekaa1c4e52008-02-21 18:02:17 +000056 LVal L, NonLVal R);
Ted Kremenekb640b3b2008-02-15 00:52:26 +000057
Ted Kremenek06747692008-02-26 23:04:29 +000058 // Calls.
59
Ted Kremenek330dddd2008-03-05 00:33:14 +000060 virtual void EvalCall(ExplodedNodeSet<ValueState>& Dst,
Ted Kremenek00a3a5f2008-03-12 01:21:45 +000061 GRExprEngine& Engine,
Ted Kremenek330dddd2008-03-05 00:33:14 +000062 GRStmtNodeBuilder<ValueState>& Builder,
Ted Kremenek330dddd2008-03-05 00:33:14 +000063 CallExpr* CE, LVal L,
64 ExplodedNode<ValueState>* Pred);
Ted Kremenek06747692008-02-26 23:04:29 +000065
Ted Kremeneke695e1c2008-04-15 23:06:53 +000066 virtual void EvalObjCMessageExpr(ExplodedNodeSet<ValueState>& Dst,
67 GRExprEngine& Engine,
68 GRStmtNodeBuilder<ValueState>& Builder,
69 ObjCMessageExpr* ME,
70 ExplodedNode<ValueState>* Pred);
71
72
73
Ted Kremenekf1ae7052008-04-03 17:57:38 +000074 static void GeneratePathDiagnostic(PathDiagnostic& PD, ASTContext& Ctx,
75 ExplodedNode<ValueState>* N);
76
Ted Kremenekc6fbdcd2008-02-15 23:15:23 +000077protected:
Ted Kremenekd59cccc2008-02-14 18:28:23 +000078
Ted Kremenekaa1c4e52008-02-21 18:02:17 +000079 // Equality operators for LVals.
80
Ted Kremenek00a3a5f2008-03-12 01:21:45 +000081 RVal EvalEQ(GRExprEngine& Engine, LVal L, LVal R);
82 RVal EvalNE(GRExprEngine& Engine, LVal L, LVal R);
Ted Kremenekaa1c4e52008-02-21 18:02:17 +000083};
Ted Kremenekd59cccc2008-02-14 18:28:23 +000084
85} // end clang namespace
86
87#endif