1

我是clang的新手。在我尝试实现的检查器中,我想获取传递给 NSFileManager 的以下 ObjC 消息的参数“属性”的值。


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

获得 NSDictionary 类型的“fileAttributes”后,我需要获取键“NSFileProtectionKey”的值。'fileAttributes' 声明如下。


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

通过实现检查器回调 checkPostObjCMessag,我能够将参数“属性”作为 Expr 获取。现在,我无法使用 Expr 对象 *en 获取指向该对象“fileAttributes”的指针或其他内容,因此我可以转到“fileAttributes”的声明并检查我感兴趣的键值对。以下是我的检查器实现的代码。


    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 
         } 
    }

我想,我的方向/方式是正确的。如果没有,请指导我一个更好的方法。

非常感谢。

4

0 回答 0