]> granicus.if.org Git - clang/commitdiff
[analyzer] Suppress localization diagnostics in debug classes and methods.
authorDevin Coughlin <dcoughlin@apple.com>
Fri, 5 Feb 2016 04:22:15 +0000 (04:22 +0000)
committerDevin Coughlin <dcoughlin@apple.com>
Fri, 5 Feb 2016 04:22:15 +0000 (04:22 +0000)
If the class or method name case-insensitively contains the term "debug",
suppress warnings about string constants flowing to user-facing UI APIs.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@259875 91177308-0d34-0410-b5e6-96231b3b80d8

lib/StaticAnalyzer/Checkers/LocalizationChecker.cpp
test/Analysis/localization.m

index 56346cd4f706913b0eb0d35c9082024597c8df9d..504b8b30187810ad007d7193190eee7cdcdbe6e1 100644 (file)
@@ -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
 void NonLocalizedStringChecker::reportLocalizationError(
     SVal S, const ObjCMethodCall &M, CheckerContext &C,
     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();
   static CheckerProgramPointTag Tag("NonLocalizedStringChecker",
                                     "UnlocalizedString");
index ce55609b1bf39d6358f983389f7aa37f2acc30f5..cf0697c76f557fc11c156ccb8eda20d4f03f2eca 100644 (file)
@@ -90,6 +90,13 @@ NSString *KHLocalizedString(NSString* key, NSString* comment) {
   [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
 // These tests are modeled off incorrect uses of the many-one pattern
 // from real projects. 
@@ -205,3 +212,15 @@ NSString *KHLocalizedString(NSString* key, NSString* comment) {
 // }
 
 @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