forked from OSchip/llvm-project
[analyzer] Suppress localization diagnostics in debug classes and methods.
If the class or method name case-insensitively contains the term "debug", suppress warnings about string constants flowing to user-facing UI APIs. llvm-svn: 259875
This commit is contained in:
parent
d0807aee51
commit
084e363517
|
@ -619,11 +619,46 @@ void NonLocalizedStringChecker::setNonLocalizedState(const SVal S,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static bool isDebuggingName(std::string name) {
|
||||||
|
return StringRef(name).lower().find("debug") != StringRef::npos;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Returns true when, heuristically, the analyzer may be analyzing debugging
|
||||||
|
/// code. We use this to suppress localization diagnostics in un-localized user
|
||||||
|
/// interfaces that are only used for debugging and are therefore not user
|
||||||
|
/// facing.
|
||||||
|
static bool isDebuggingContext(CheckerContext &C) {
|
||||||
|
const Decl *D = C.getCurrentAnalysisDeclContext()->getDecl();
|
||||||
|
if (!D)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (auto *ND = dyn_cast<NamedDecl>(D)) {
|
||||||
|
if (isDebuggingName(ND->getNameAsString()))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
const DeclContext *DC = D->getDeclContext();
|
||||||
|
|
||||||
|
if (auto *CD = dyn_cast<ObjCContainerDecl>(DC)) {
|
||||||
|
if (isDebuggingName(CD->getNameAsString()))
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Reports a localization error for the passed in method call and SVal
|
/// Reports a localization error for the passed in method call and SVal
|
||||||
void NonLocalizedStringChecker::reportLocalizationError(
|
void NonLocalizedStringChecker::reportLocalizationError(
|
||||||
SVal S, const ObjCMethodCall &M, CheckerContext &C,
|
SVal S, const ObjCMethodCall &M, CheckerContext &C,
|
||||||
int argumentNumber) const {
|
int argumentNumber) const {
|
||||||
|
|
||||||
|
// Don't warn about localization errors in classes and methods that
|
||||||
|
// may be debug code.
|
||||||
|
if (isDebuggingContext(C))
|
||||||
|
return;
|
||||||
|
|
||||||
ExplodedNode *ErrNode = C.getPredecessor();
|
ExplodedNode *ErrNode = C.getPredecessor();
|
||||||
static CheckerProgramPointTag Tag("NonLocalizedStringChecker",
|
static CheckerProgramPointTag Tag("NonLocalizedStringChecker",
|
||||||
"UnlocalizedString");
|
"UnlocalizedString");
|
||||||
|
|
|
@ -90,6 +90,13 @@ NSString *KHLocalizedString(NSString* key, NSString* comment) {
|
||||||
[testLabel setText:bar]; // no-warning
|
[testLabel setText:bar]; // no-warning
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Suppress diagnostic about user-facing string constants when the method name
|
||||||
|
// contains the term "Debug".
|
||||||
|
- (void)debugScreen:(UILabel *)label {
|
||||||
|
label.text = @"Unlocalized";
|
||||||
|
}
|
||||||
|
|
||||||
// Plural Misuse Checker Tests
|
// Plural Misuse Checker Tests
|
||||||
// These tests are modeled off incorrect uses of the many-one pattern
|
// These tests are modeled off incorrect uses of the many-one pattern
|
||||||
// from real projects.
|
// from real projects.
|
||||||
|
@ -205,3 +212,15 @@ NSString *KHLocalizedString(NSString* key, NSString* comment) {
|
||||||
// }
|
// }
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
|
|
||||||
|
// Suppress diagnostic about user-facing string constants when the class name
|
||||||
|
// contains "Debug"
|
||||||
|
@interface MyDebugView : NSObject
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation MyDebugView
|
||||||
|
- (void)setupScreen:(UILabel *)label {
|
||||||
|
label.text = @"Unlocalized";
|
||||||
|
}
|
||||||
|
@end
|
||||||
|
|
Loading…
Reference in New Issue