2016-07-07 6 views
1

私は今clangを通してobjective-cの静的分析を行うことで新人です。 私は、RecursiveASTVisitorを介してReturnStmtを見つけると、clangがReturnStmtを見つけることができないという問題に直面しています。 このようなRecursiveASTVisitorコード:clang-3.9でobjective-cのReturn Stmtを取得するにはどうすればよいですか?

class MyASTVisitor : public RecursiveASTVisitor<MyASTVisitor> { 
public: 
    MyASTVisitor(Rewriter &R) : TheRewriter(R) {} 
    ......... 
     else if(isa<ReturnStmt>(s)){ 
      //The Return Stmt find block 
      ReturnStmt *returnStat = cast<ReturnStmt>(s); 
      TheRewriter.InsertText(returnStat->getLocStart(),"//the return stmt\n",true,true); 
     } 
     return true; 
    }} 

をそして、それは最初の結果が戻りSTMT

int main (int argc, const char* argv[]) { 
@autoreleasepool { 
    //the func--->NSLog() begin called! 
    NSLog (@"Programming is fun!"); 
} 
//the return stmt 
return 0; } 

を見つけることができますが、2番目はそれが

int main(int argc, char * argv[]) { 
@autoreleasepool { 
    return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class])); 
}} 
+0

@Nishant Sharma – CurryChen

+0

私はあなたのタグを手に入れませんでした:[どのユーザーに投稿にタグを付けるか](http://meta.stackexchange.com/questions/97471/how-to-mention-tag-任意のユーザ・イン・ア・ポスト)。私は誰かにタグを付ける場合です。質問については、なぜそれが起こるのか分かりますが、私はすぐに答えをまとめます。 –

答えて

0

私にしてみましょう見つけることができない結果 です小さな例でclang ASTがどのように動作するかを説明します。このコードは、今度は、上記のコードの打ち鳴らすのAST表現が何であるかを見てみましょうtemp.cpp

int b() 
{ 
    return 0; 
} 

int main() 
{ 
    return b(); 
} 

に存在すると想定されています。ちなみに、これはあなたがあなたのコードがやって表示されていないいつでも行うことができるものです(あなたの場合は

|-FunctionDecl 0x5f952e0 <t.cpp:2:1, line:5:1> line:2:5 used b 'int (void)' 
| `-CompoundStmt 0x5f95400 <line:3:1, line:5:1> 
| `-ReturnStmt 0x5f953e8 <line:4:2, col:9> 
|  `-IntegerLiteral 0x5f953c8 <col:9> 'int' 0 
`-FunctionDecl 0x5f95440 <line:7:1, line:10:1> line:7:5 main 'int (void)' 
    `-CompoundStmt 0x5f95620 <line:8:1, line:10:1> 
    `-ReturnStmt 0x5f95608 <line:9:2, col:11> 
     `-CallExpr 0x5f955e0 <col:9, col:11> 'int' 
     `-ImplicitCastExpr 0x5f955c8 <col:9> 'int (*)(void)' <FunctionToPointerDecay> 
      `-DeclRefExpr 0x5f95570 <col:9> 'int (void)' lvalue Function 0x5f952e0 'b' 'int (void)' 

:。。。何が間違っているかを確認するために、生のASTを見なければならない我々はこれを実行する打ち鳴らすからの生ASTダンプを取得するには

clang -Xclang -ast-dump -fsyntax-only temp.cpp 

する。これは私たちに、この出力を提供します全身を見る関数bのst FunctionDeclは整数値0を返す単純なreturn文です。しかし、今度はmainのFunctionDeclを見ると、returnStmtがCallExprを呼び出して関数bからの戻り値を取得することがわかります。これはまさにあなたのケースで起こっていることです。 1つのreturn文が検出されていますが、1つは戻っていません。

この場合、getRetValue()ReturnStmtとなります。これはExprタイプになりますので、異なる可能性のある返品ケースについて解決する必要があります。

+0

私はhava関数のreturnステートメントを記録する別の方法を作成し、このメソッドは.mと.mmファイルで使用することができます。この#defineのようにreturn(log(XXX)、1)return – CurryChen

関連する問題