Получить значение параметра сообщения ObjC в реализации Checker для Clang SA
Я новичок в лязг. В контролере, который я пытаюсь реализовать, я хочу получить значение для параметра 'attribute', переданного следующему сообщению ObjC в NSFileManager.
NSFileManager *fileManager = [NSFileManager defaultManager];
[fileManager createFileAtPath:filePath contents:dfltFileData attributes:fileAttributes];
Как только 'fileAttributes' получен, который имеет тип NSDictionary, тогда мне нужно получить значение ключа 'NSFileProtectionKey'. 'fileAttributes' объявлен следующим образом.
NSDictionary *fileAttributes = [NSDictionary dictionaryWithObject:NSFileProtectionComplete forKey:NSFileProtectionKey];
Реализуя функцию обратного вызова checker checkPostObjCMessag, я могу получить параметр "attribute" как Expr. Теперь я не могу получить указатель или что-то на этот объект 'fileAttributes' с помощью объекта Expr *en, чтобы я мог перейти к объявлению '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
}
}
Я думаю, что я в правильном направлении / пути. Если нет, пожалуйста, покажите мне лучший способ сделать это.
Большое спасибо.