[PATCH] Track state of function parameters

Delesley Hutchins delesley at google.com
Thu Aug 29 15:33:42 PDT 2013


LGTM.

On Thu, Aug 29, 2013 at 3:17 PM, Christian Wailes
<chriswailes at google.com> wrote:
>   Added some new tests for parameter tracking.
>
> Hi delesley, dblaikie, aaron.ballman,
>
> http://llvm-reviews.chandlerc.com/D1552
>
> CHANGE SINCE LAST DIFF
>   http://llvm-reviews.chandlerc.com/D1552?vs=3906&id=3908#toc
>
> Files:
>   lib/Analysis/Consumed.cpp
>   test/SemaCXX/warn-consumed-analysis-strict.cpp
>   test/SemaCXX/warn-consumed-analysis.cpp
>
> Index: lib/Analysis/Consumed.cpp
> ===================================================================
> --- lib/Analysis/Consumed.cpp
> +++ lib/Analysis/Consumed.cpp
> @@ -44,8 +44,6 @@
>  //       (Deferred)
>  // TODO: Test nested conditionals: A) Checking the same value multiple times,
>  //       and 2) Checking different values. (Deferred)
> -// TODO: Test IsFalseVisitor with values in the unknown state. (Deferred)
> -// TODO: Look into combining IsFalseVisitor and TestedVarsVisitor. (Deferred)
>
>  using namespace clang;
>  using namespace consumed;
> @@ -266,11 +264,13 @@
>    void VisitDeclStmt(const DeclStmt *DelcS);
>    void VisitMaterializeTemporaryExpr(const MaterializeTemporaryExpr *Temp);
>    void VisitMemberExpr(const MemberExpr *MExpr);
> +  void VisitParmVarDecl(const ParmVarDecl *Param);
>    void VisitUnaryOperator(const UnaryOperator *UOp);
>    void VisitVarDecl(const VarDecl *Var);
>
> -  ConsumedStmtVisitor(AnalysisDeclContext &AC, ConsumedAnalyzer &Analyzer)
> -      : AC(AC), Analyzer(Analyzer), StateMap(NULL) {}
> +  ConsumedStmtVisitor(AnalysisDeclContext &AC, ConsumedAnalyzer &Analyzer,
> +                      ConsumedStateMap *StateMap)
> +      : AC(AC), Analyzer(Analyzer), StateMap(StateMap) {}
>
>    PropagationInfo getInfo(const Stmt *StmtNode) const {
>      ConstInfoEntry Entry = PropagationMap.find(StmtNode);
> @@ -664,6 +664,12 @@
>    forwardInfo(MExpr->getBase(), MExpr);
>  }
>
> +
> +void ConsumedStmtVisitor::VisitParmVarDecl(const ParmVarDecl *Param) {
> +  if (Analyzer.isConsumableType(Param->getType()))
> +    StateMap->setState(Param, consumed::CS_Unknown);
> +}
> +
>  void ConsumedStmtVisitor::VisitUnaryOperator(const UnaryOperator *UOp) {
>    InfoEntry Entry = PropagationMap.find(UOp->getSubExpr()->IgnoreParens());
>    if (Entry == PropagationMap.end()) return;
> @@ -685,11 +691,16 @@
>
>  void ConsumedStmtVisitor::VisitVarDecl(const VarDecl *Var) {
>    if (Analyzer.isConsumableType(Var->getType())) {
> -    PropagationInfo PInfo =
> -      PropagationMap.find(Var->getInit())->second;
> -
> -    StateMap->setState(Var, PInfo.isVar() ?
> -      StateMap->getState(PInfo.getVar()) : PInfo.getState());
> +    if (Var->hasInit()) {
> +      PropagationInfo PInfo =
> +        PropagationMap.find(Var->getInit())->second;
> +
> +      StateMap->setState(Var, PInfo.isVar() ?
> +        StateMap->getState(PInfo.getVar()) : PInfo.getState());
> +
> +    } else {
> +      StateMap->setState(Var, consumed::CS_Unknown);
> +    }
>    }
>  }
>  }} // end clang::consumed::ConsumedStmtVisitor
> @@ -1022,7 +1033,13 @@
>    PostOrderCFGView *SortedGraph = AC.getAnalysis<PostOrderCFGView>();
>
>    CurrStates = new ConsumedStateMap();
> -  ConsumedStmtVisitor Visitor(AC, *this);
> +  ConsumedStmtVisitor Visitor(AC, *this, CurrStates);
> +
> +  // Add all trackable parameters to the state map.
> +  for (FunctionDecl::param_const_iterator PI = D->param_begin(),
> +       PE = D->param_end(); PI != PE; ++PI) {
> +    Visitor.VisitParmVarDecl(*PI);
> +  }
>
>    // Visit all of the function's basic blocks.
>    for (PostOrderCFGView::iterator I = SortedGraph->begin(),
> Index: test/SemaCXX/warn-consumed-analysis-strict.cpp
> ===================================================================
> --- test/SemaCXX/warn-consumed-analysis-strict.cpp
> +++ test/SemaCXX/warn-consumed-analysis-strict.cpp
> @@ -192,6 +192,10 @@
>    }
>  }
>
> +void testFunctionParam(ConsumableClass<int> param) {
> +  *param; // expected-warning {{invocation of method 'operator*' on object 'param' while it is in an unknown state}}
> +}
> +
>  void testSimpleForLoop() {
>    ConsumableClass<int> var;
>
> Index: test/SemaCXX/warn-consumed-analysis.cpp
> ===================================================================
> --- test/SemaCXX/warn-consumed-analysis.cpp
> +++ test/SemaCXX/warn-consumed-analysis.cpp
> @@ -224,6 +224,18 @@
>    *var;
>  }
>
> +void testFunctionParam(ConsumableClass<int> param) {
> +
> +  if (param.isValid()) {
> +    *param;
> +  } else {
> +    *param; // expected-warning {{invocation of method 'operator*' on object 'param' while it is in the 'consumed' state}}
> +  }
> +
> +  param = nullptr;
> +  *param; // expected-warning {{invocation of method 'operator*' on object 'param' while it is in the 'consumed' state}}
> +}
> +
>  void testCallingConventions() {
>    ConsumableClass<int> var(42);



-- 
DeLesley Hutchins | Software Engineer | delesley at google.com | 505-206-0315



More information about the cfe-commits mailing list