]> granicus.if.org Git - clang/commitdiff
Change LLVMConventionsChecker to accept an entire translation unit instead
authorTed Kremenek <kremenek@apple.com>
Sun, 14 Feb 2010 19:09:05 +0000 (19:09 +0000)
committerTed Kremenek <kremenek@apple.com>
Sun, 14 Feb 2010 19:09:05 +0000 (19:09 +0000)
of operating on each code decl.  This exposes two flaws in AnalysisConsumer
that should eventually be fixed:

(1) It is not possible to associate multiple "actions" with a single
    command line argument.  This will require the notion of an
"analysis" group, and possibly tablegen support.  (although eventually
    we want to support dynamically loading analyses as well)

(2) AnalysisConsumer may not actually be scanning the declarations in namespaces.
    We'll experiment first in LLVMConventionsChecker before changing the
    behavior in AnalysisConsumer.

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

include/clang/Checker/Checkers/LocalCheckers.h
include/clang/Frontend/Analyses.def
lib/Checker/LLVMConventionsChecker.cpp
lib/Frontend/AnalysisConsumer.cpp

index a262aaa1fb1c46b8715adee888404c92e2e614ba..4a9e381a7c156342498444387540f5340d8b6372 100644 (file)
@@ -31,6 +31,7 @@ class BugReporter;
 class ObjCImplementationDecl;
 class LangOptions;
 class GRExprEngine;
+class TranslationUnitDecl;
 
 void CheckDeadStores(CFG &cfg, LiveVariables &L, ParentMap &map, 
                      BugReporter& BR);
@@ -50,7 +51,7 @@ void RegisterAppleChecks(GRExprEngine& Eng, const Decl &D);
 void RegisterExperimentalChecks(GRExprEngine &Eng);
 void RegisterExperimentalInternalChecks(GRExprEngine &Eng);
 
-void CheckLLVMConventions(const Decl *D, BugReporter &BR);
+void CheckLLVMConventions(TranslationUnitDecl &TU, BugReporter &BR);
 void CheckSecuritySyntaxOnly(const Decl *D, BugReporter &BR);
 void CheckSizeofPointer(const Decl *D, BugReporter &BR);
 
index 6ea43f73414dd2c8b1f02edc0c2625bfebd2aa54..287c67ebb7efadc1d7dc960335cb5da93e51f6c8 100644 (file)
@@ -30,7 +30,7 @@ ANALYSIS(SecuritySyntacticChecks, "analyzer-check-security-syntactic",
 
 ANALYSIS(LLVMConventionChecker, "analyzer-check-llvm-conventions",
   "Check code for LLVM codebase conventions (domain-specific)",
-  Code)
+  TranslationUnit)
 
 ANALYSIS(WarnDeadStores, "analyzer-check-dead-stores",
          "Warn about stores to dead variables", Code)
index 7cd98b0319202ee8950e1937504c1cb56fec628e..17a17a8bbfe12fb88224d4e1cec7196f58e0d728 100644 (file)
@@ -42,7 +42,7 @@ static bool IsStdString(QualType T) {
   if (!TT)
     return false;
 
-  const TypedefDecl *TD = TT->getDecl();    
+  const TypedefDecl *TD = TT->getDecl();
   const NamespaceDecl *ND = dyn_cast<NamespaceDecl>(TD->getDeclContext());
   if (!ND)
     return false;
@@ -94,7 +94,7 @@ void StringRefCheckerVisitor::VisitDeclStmt(DeclStmt *S) {
 void StringRefCheckerVisitor::VisitVarDecl(VarDecl *VD) {
   Expr *Init = VD->getInit();
   if (!Init)
-    return; 
+    return;
 
   // Pattern match for:
   // llvm::StringRef x = call() (where call returns std::string)
@@ -129,6 +129,22 @@ void StringRefCheckerVisitor::VisitVarDecl(VarDecl *VD) {
 // Entry point for all checks.
 //===----------------------------------------------------------------------===//
 
-void clang::CheckLLVMConventions(const Decl *D, BugReporter &BR) {
-  CheckStringRefAssignedTemporary(D, BR);
+static void ScanCodeDecls(DeclContext *DC, BugReporter &BR) {
+  for (DeclContext::decl_iterator I=DC->decls_begin(), E=DC->decls_end();
+       I!=E ; ++I) {
+
+    Decl *D = *I;
+    if (D->getBody()) {
+      CheckStringRefAssignedTemporary(D, BR);
+    }
+
+    if (DeclContext *DC_child = dyn_cast<DeclContext>(D))
+      ScanCodeDecls(DC_child, BR);
+  }
 }
+
+void clang::CheckLLVMConventions(TranslationUnitDecl &TU,
+                                 BugReporter &BR) {
+  ScanCodeDecls(&TU, BR);
+}
+
index b03d65afcdf1f2738dd19aaab60ff1f615bda557..d764fd078968331fe6d728ddef1e344eb3c8468f 100644 (file)
@@ -434,10 +434,9 @@ static void ActionSecuritySyntacticChecks(AnalysisConsumer &C,
 
 static void ActionLLVMConventionChecker(AnalysisConsumer &C,
                                         AnalysisManager &mgr,
-                                        Decl *D) {
-  C.DisplayFunction(D);
+                                        TranslationUnitDecl &TU) {
   BugReporter BR(mgr);
-  CheckLLVMConventions(D, BR);
+  CheckLLVMConventions(TU, BR);
 }
 
 static void ActionWarnObjCDealloc(AnalysisConsumer &C, AnalysisManager& mgr,