我是铿锵的新手。在我正在尝试实现的检查器中,我想获取传递给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
}
}
我想,我正朝着正确的方向前进。如果没有,请指导我做一个更好的方法。
非常感谢。