From: Ted Kremenek Date: Fri, 15 Feb 2008 00:52:26 +0000 (+0000) Subject: Added boilerplate transfer function support for pointer arithmetic operations. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b640b3b5dfccaf259967cb2cb6755c9aa20d4423;p=clang Added boilerplate transfer function support for pointer arithmetic operations. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@47147 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/Analysis/GRExprEngine.cpp b/Analysis/GRExprEngine.cpp index 15f1aa2e37..bbf06d92fc 100644 --- a/Analysis/GRExprEngine.cpp +++ b/Analysis/GRExprEngine.cpp @@ -706,9 +706,17 @@ void GRExprEngine::VisitBinaryOperator(BinaryOperator* B, if (isa(V1)) { // FIXME: Add support for RHS being a non-lvalue. const LValue& L1 = cast(V1); - const LValue& L2 = cast(V2); - Nodify(Dst, B, N2, SetValue(St, B, EvalBinaryOp(ValMgr, Op, L1, L2))); + if (isa(V2)) { + const LValue& L2 = cast(V2); + Nodify(Dst, B, N2, SetValue(St, B, + EvalBinaryOp(ValMgr, Op, L1, L2))); + } + else { + const NonLValue& R2 = cast(V2); + Nodify(Dst, B, N2, SetValue(St, B, + EvalBinaryOp(ValMgr, Op, L1, R2))); + } } else { const NonLValue& R1 = cast(V1); diff --git a/Analysis/GRSimpleVals.cpp b/Analysis/GRSimpleVals.cpp index e856c3e5d0..c9827d9d10 100644 --- a/Analysis/GRSimpleVals.cpp +++ b/Analysis/GRSimpleVals.cpp @@ -162,6 +162,15 @@ NonLValue GRSimpleVals::EvalBinaryOp(ValueManager& ValMgr, } } + +// Pointer arithmetic. + +LValue GRSimpleVals::EvalBinaryOp(ValueManager& ValMgr, + BinaryOperator::Opcode Op, + LValue LHS, NonLValue RHS) { + return cast(UnknownVal()); +} + // Equality operators for LValues. diff --git a/Analysis/GRSimpleVals.h b/Analysis/GRSimpleVals.h index 0f517fe5eb..b00dd3ca39 100644 --- a/Analysis/GRSimpleVals.h +++ b/Analysis/GRSimpleVals.h @@ -44,6 +44,11 @@ public: BinaryOperator::Opcode Op, NonLValue LHS, NonLValue RHS); + // Pointer arithmetic. + + virtual LValue EvalBinaryOp(ValueManager& ValMgr, BinaryOperator::Opcode Op, + LValue LHS, NonLValue RHS); + // Equality operators for LValues. virtual NonLValue EvalEQ(ValueManager& ValMgr, LValue LHS, LValue RHS); virtual NonLValue EvalNE(ValueManager& ValMgr, LValue LHS, LValue RHS); diff --git a/include/clang/Analysis/PathSensitive/GRExprEngine.h b/include/clang/Analysis/PathSensitive/GRExprEngine.h index 1c88b30b88..ffb4420965 100644 --- a/include/clang/Analysis/PathSensitive/GRExprEngine.h +++ b/include/clang/Analysis/PathSensitive/GRExprEngine.h @@ -330,5 +330,10 @@ public: LValue LHS, LValue RHS) { return TF->EvalBinaryOp(ValMgr, Op, LHS, RHS); } + + inline RValue EvalBinaryOp(ValueManager& ValMgr, BinaryOperator::Opcode Op, + LValue LHS, NonLValue RHS) { + return TF->EvalBinaryOp(ValMgr, Op, LHS, RHS); + } }; } // end clang namespace \ No newline at end of file diff --git a/include/clang/Analysis/PathSensitive/GRTransferFuncs.h b/include/clang/Analysis/PathSensitive/GRTransferFuncs.h index b38ac0c91a..87ff170372 100644 --- a/include/clang/Analysis/PathSensitive/GRTransferFuncs.h +++ b/include/clang/Analysis/PathSensitive/GRTransferFuncs.h @@ -47,6 +47,12 @@ public: BinaryOperator::Opcode Op, LValue LHS, LValue RHS); + + // Pointer arithmetic. + + virtual LValue EvalBinaryOp(ValueManager& ValMgr, BinaryOperator::Opcode Op, + LValue LHS, NonLValue RHS) = 0; + // Equality operators for LValues. virtual NonLValue EvalEQ(ValueManager& ValMgr, LValue LHS, LValue RHS) = 0; virtual NonLValue EvalNE(ValueManager& ValMgr, LValue LHS, LValue RHS) = 0;