Получить значение параметра сообщения 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 
         } 
    }

Я думаю, что я в правильном направлении / пути. Если нет, пожалуйста, покажите мне лучший способ сделать это.

Большое спасибо.

0 ответов

Другие вопросы по тегам