在Clang SA的Checker实现中获取ObjC消息参数的值

时间:2013-11-07 06:36:18

标签: clang llvm-clang clang-static-analyzer

我是铿锵的新手。在我正在尝试实现的检查器中,我想获取传递给NSFileManager的以下ObjC消息的参数'attribute'的值。


    NSFileManager *fileManager = [NSFileManager defaultManager]; 
    [fileManager createFileAtPath:filePath contents:dfltFileData attributes:fileAttributes]; 

一旦获得类型为NSDictionary的'fileAttributes',我需要获取键'NSFileProtectionKey'的值。 'fileAttributes'声明如下。


    NSDictionary *fileAttributes = [NSDictionary dictionaryWithObject:NSFileProtectionComplete forKey:NSFileProtectionKey]; 

通过实现checker回调checkPostObjCMessag,我能够将参数'attributes'作为Expr。 现在我无法使用Expr对象* en将指针或其他内容添加到此对象'fileAttributes'中,以便我可以转到'fileAttributes'的声明并检查我感兴趣的键值对。< / b>以下是我的检查器实现的代码。


    void FileManagerChecker::checkPreObjCMessage(const ObjCMethodCall &Msg, CheckerContext &C) const { 
        const ObjCInterfaceDecl * recv = Msg.getReceiverInterface (); 
        const StringRef name = recv->getIdentifier()->getName(); 
        Selector s = Msg.getSelector(); 
        StringRef first = s.getNameForSlot(0); 

        if(name.equals("NSFileManager")) { 
            if(first.equals("createFileAtPath")) { 
                const Expr *en = Msg.getArgExpr(2); 
                QualType ArgTy = en->getType(); 
                std::cout << "Qual type: " << ArgTy.getAsString() << std::endl; 
                std::cout << std::endl; 
                // find the variable having the attribute and check 
            } else if(first.equals("setAttributes")) { 
                // find the variable having the attribute and check 
            } else 
                ;   // should never get here 
         } 
    }

我想,我正朝着正确的方向前进。如果没有,请指导我做一个更好的方法。

非常感谢。

0 个答案:

没有答案