Lines Matching +full:sys +full:- +full:mgr
1 //=- LocalizationChecker.cpp -------------------------------------*- C++ -*-==//
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7 //===----------------------------------------------------------------------===//
10 // 1) A checker that warns about uses of non-localized NSStrings passed to
15 //===----------------------------------------------------------------------===//
136 .first->second;
647 D->specific_attr_begin<AnnotateAttr>(), in isAnnotatedAsReturningLocalized()
648 D->specific_attr_end<AnnotateAttr>(), [](const AnnotateAttr *Ann) { in isAnnotatedAsReturningLocalized()
649 return Ann->getAnnotation() == "returns_localized_nsstring"; in isAnnotatedAsReturningLocalized()
660 D->specific_attr_begin<AnnotateAttr>(), in isAnnotatedAsTakingLocalized()
661 D->specific_attr_end<AnnotateAttr>(), [](const AnnotateAttr *Ann) { in isAnnotatedAsTakingLocalized()
662 return Ann->getAnnotation() == "takes_localized_nsstring"; in isAnnotatedAsTakingLocalized()
671 const LocalizedState *LS = C.getState()->get<LocalizedMemMap>(mt); in hasLocalizedState()
672 if (LS && LS->isLocalized()) in hasLocalizedState()
684 const LocalizedState *LS = C.getState()->get<LocalizedMemMap>(mt); in hasNonLocalizedState()
685 if (LS && LS->isNonLocalized()) in hasNonLocalizedState()
697 C.getState()->set<LocalizedMemMap>(mt, LocalizedState::getLocalized()); in setLocalizedState()
707 ProgramStateRef State = C.getState()->set<LocalizedMemMap>( in setNonLocalizedState()
719 /// code. We use this to suppress localization diagnostics in un-localized user
723 const Decl *D = C.getCurrentAnalysisDeclContext()->getDecl(); in isDebuggingContext()
728 if (isDebuggingName(ND->getNameAsString())) in isDebuggingContext()
732 const DeclContext *DC = D->getDeclContext(); in isDebuggingContext()
735 if (isDebuggingName(CD->getNameAsString())) in isDebuggingContext()
761 BT, "User-facing text should use localized string macro", ErrNode); in reportLocalizationError()
763 R->addRange(M.getArgExpr(argumentNumber - 1)->getSourceRange()); in reportLocalizationError()
765 R->addRange(M.getSourceRange()); in reportLocalizationError()
767 R->markInteresting(S); in reportLocalizationError()
771 R->addVisitor(std::make_unique<NonLocalizedStringBRVisitor>(StringRegion)); in reportLocalizationError()
777 /// otherwise, returns -1
783 return -1; in getLocalizedArgumentForSelector()
785 auto argumentIterator = method->getSecond().find(S); in getLocalizedArgumentForSelector()
787 if (argumentIterator == method->getSecond().end()) in getLocalizedArgumentForSelector()
788 return -1; in getLocalizedArgumentForSelector()
790 int argumentNumber = argumentIterator->getSecond(); in getLocalizedArgumentForSelector()
802 const IdentifierInfo *odInfo = OD->getIdentifier(); in checkPreObjCMessage()
810 if (odInfo->isStr("NSString")) { in checkPreObjCMessage()
830 while (argumentNumber < 0 && OD->getSuperClass() != nullptr) { in checkPreObjCMessage()
831 for (const auto *P : OD->all_referenced_protocols()) { in checkPreObjCMessage()
832 argumentNumber = getLocalizedArgumentForSelector(P->getIdentifier(), S); in checkPreObjCMessage()
837 OD = OD->getSuperClass(); in checkPreObjCMessage()
838 argumentNumber = getLocalizedArgumentForSelector(OD->getIdentifier(), S); in checkPreObjCMessage()
845 for (auto [Idx, FormalParam] : llvm::enumerate(OMD->parameters())) { in checkPreObjCMessage()
863 SR->getObjCStringLiteral()->getString()->getString(); in checkPreObjCMessage()
867 if (!IsAggressive && llvm::sys::unicode::columnWidthUTF8(stringValue) < 2) in checkPreObjCMessage()
884 auto formals = FD->parameters(); in checkPreCall()
898 const ObjCObjectPointerType *PT = T->getAs<ObjCObjectPointerType>(); in isNSStringType()
902 ObjCInterfaceDecl *Cls = PT->getObjectType()->getInterface(); in isNSStringType()
906 const IdentifierInfo *ClsName = Cls->getIdentifier(); in isNSStringType()
916 /// NonLocalized only if it is not backed by a SymRegion (Non-Aggressive),
974 const IdentifierInfo *odInfo = OD->getIdentifier(); in checkPostObjCMessage()
1002 std::optional<StmtPoint> Point = Succ->getLocation().getAs<StmtPoint>(); in VisitNode()
1006 auto *LiteralExpr = dyn_cast<ObjCStringLiteral>(Point->getStmt()); in VisitNode()
1010 SVal LiteralSVal = Succ->getSVal(LiteralExpr); in VisitNode()
1023 L, "Non-localized string literal here"); in VisitNode()
1024 Piece->addRange(LiteralExpr->getSourceRange()); in VisitNode()
1037 AnalysisManager &Mgr; member in __anon79a03b4c0511::EmptyLocalizationContextChecker::MethodCrawler
1045 : MD(InMD), BR(InBR), Mgr(InMgr), Checker(Checker), DCtx(InDCtx) {} in MethodCrawler()
1054 for (const Stmt *Child : S->children()) { in VisitChildren()
1056 this->Visit(Child); in VisitChildren()
1062 void checkASTDecl(const ObjCImplementationDecl *D, AnalysisManager &Mgr,
1068 const ObjCImplementationDecl *D, AnalysisManager &Mgr, in checkASTDecl() argument
1071 for (const ObjCMethodDecl *M : D->methods()) { in checkASTDecl()
1072 AnalysisDeclContext *DCtx = Mgr.getAnalysisDeclContext(M); in checkASTDecl()
1074 const Stmt *Body = M->getBody(); in checkASTDecl()
1076 assert(M->isSynthesizedAccessorStub()); in checkASTDecl()
1080 MethodCrawler MC(M->getCanonicalDecl(), BR, this, Mgr, DCtx); in checkASTDecl()
1104 // comments as part of preprocessing and avoid this re-lexing hack. in VisitObjCMessageExpr()
1105 const ObjCInterfaceDecl *OD = ME->getReceiverInterface(); in VisitObjCMessageExpr()
1109 const IdentifierInfo *odInfo = OD->getIdentifier(); in VisitObjCMessageExpr()
1111 if (!(odInfo->isStr("NSBundle") && in VisitObjCMessageExpr()
1112 ME->getSelector().getAsString() == in VisitObjCMessageExpr()
1117 SourceRange R = ME->getSourceRange(); in VisitObjCMessageExpr()
1125 Mgr.getSourceManager().getImmediateMacroCallerLoc(R.getBegin()); in VisitObjCMessageExpr()
1127 Mgr.getSourceManager().getDecomposedLoc(SL); in VisitObjCMessageExpr()
1129 SrcMgr::SLocEntry SE = Mgr.getSourceManager().getSLocEntry(SLInfo.first); in VisitObjCMessageExpr()
1135 SLInfo = Mgr.getSourceManager().getDecomposedLoc(SL); in VisitObjCMessageExpr()
1136 SE = Mgr.getSourceManager().getSLocEntry(SLInfo.first); in VisitObjCMessageExpr()
1140 Mgr.getSourceManager().getBufferOrNone(SLInfo.first, SL); in VisitObjCMessageExpr()
1144 Lexer TheLexer(SL, LangOpts, BF->getBufferStart(), in VisitObjCMessageExpr()
1145 BF->getBufferStart() + SLInfo.second, BF->getBufferEnd()); in VisitObjCMessageExpr()
1156 --p_count; in VisitObjCMessageExpr()
1185 "Localized string macro should include a non-empty " in reportEmptyContextError()
1203 // This is true when we are the direct-child of a
1226 void checkASTCodeBody(const Decl *D, AnalysisManager &Mgr, in checkASTCodeBody() argument
1228 MethodCrawler Visitor(BR, this, Mgr.getAnalysisDeclContext(D)); in checkASTCodeBody()
1237 // 2) The condition is a binary operator with 1 or 2 on the right-hand side
1243 if (const VarDecl *VD = dyn_cast<VarDecl>(DRE->getDecl())) { in isCheckingPlurality()
1244 const Expr *InitExpr = VD->getInit(); in isCheckingPlurality()
1247 dyn_cast<BinaryOperator>(InitExpr->IgnoreParenImpCasts())) { in isCheckingPlurality()
1251 if (VD->getName().contains_insensitive("plural") || in isCheckingPlurality()
1252 VD->getName().contains_insensitive("singular")) { in isCheckingPlurality()
1264 BO->getRHS()->IgnoreParenImpCasts())) { in isCheckingPlurality()
1265 llvm::APInt Value = IL->getValue(); in isCheckingPlurality()
1279 if (const FunctionDecl *FD = CE->getDirectCallee()) { in VisitCallExpr()
1281 StringRef(FD->getNameInfo().getAsString()).lower(); in VisitCallExpr()
1283 for (const Expr *Arg : CE->arguments()) { in VisitCallExpr()
1300 const ObjCInterfaceDecl *OD = ME->getReceiverInterface(); in VisitObjCMessageExpr()
1304 const IdentifierInfo *odInfo = OD->getIdentifier(); in VisitObjCMessageExpr()
1306 if (odInfo->isStr("NSBundle") && in VisitObjCMessageExpr()
1307 ME->getSelector().getAsString() == "localizedStringForKey:value:table:") { in VisitObjCMessageExpr()
1337 const Expr *Condition = I->getCond(); in VisitIfStmt()
1340 Condition = Condition->IgnoreParenImpCasts(); in VisitIfStmt()
1370 const Expr *Condition = C->getCond()->IgnoreParenImpCasts(); in VisitConditionalOperator()
1384 BR.EmitBasicReport(AC->getDecl(), Checker, "Plural Misuse", in reportPluralMisuseError()
1391 //===----------------------------------------------------------------------===//
1393 //===----------------------------------------------------------------------===//
1395 void ento::registerNonLocalizedStringChecker(CheckerManager &mgr) { in registerNonLocalizedStringChecker() argument
1397 mgr.registerChecker<NonLocalizedStringChecker>(); in registerNonLocalizedStringChecker()
1398 checker->IsAggressive = in registerNonLocalizedStringChecker()
1399 mgr.getAnalyzerOptions().getCheckerBooleanOption( in registerNonLocalizedStringChecker()
1403 bool ento::shouldRegisterNonLocalizedStringChecker(const CheckerManager &mgr) { in shouldRegisterNonLocalizedStringChecker() argument
1407 void ento::registerEmptyLocalizationContextChecker(CheckerManager &mgr) { in registerEmptyLocalizationContextChecker() argument
1408 mgr.registerChecker<EmptyLocalizationContextChecker>(); in registerEmptyLocalizationContextChecker()
1412 const CheckerManager &mgr) { in shouldRegisterEmptyLocalizationContextChecker() argument
1416 void ento::registerPluralMisuseChecker(CheckerManager &mgr) { in registerPluralMisuseChecker() argument
1417 mgr.registerChecker<PluralMisuseChecker>(); in registerPluralMisuseChecker()
1420 bool ento::shouldRegisterPluralMisuseChecker(const CheckerManager &mgr) { in shouldRegisterPluralMisuseChecker() argument