我是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
}
}
我想,我的方向/方式是正确的。如果没有,请指导我一个更好的方法。
非常感谢。