]> granicus.if.org Git - clang/commitdiff
Move duplicate uninitialized warning suppression into the
authorChandler Carruth <chandlerc@gmail.com>
Fri, 22 Jul 2011 05:27:52 +0000 (05:27 +0000)
committerChandler Carruth <chandlerc@gmail.com>
Fri, 22 Jul 2011 05:27:52 +0000 (05:27 +0000)
AnalysisBasedWarnings Sema layer and out of the Analysis library itself.
This returns the uninitialized values analysis to a more pure form,
allowing its original logic to correctly detect some categories of
definitely uninitialized values. Fixes PR10358 (again).

Thanks to Ted for reviewing and updating this patch after his rewrite of
several portions of this analysis.

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

lib/Analysis/UninitializedValues.cpp
lib/Sema/AnalysisBasedWarnings.cpp
test/Sema/uninit-variables.c

index 67f0f6740ec46d5931d7c9ec2e7fbd6a1515eea1..4301ca12937dfdd108c7f9e5a24368bcd3a68668 100644 (file)
@@ -493,7 +493,8 @@ void TransferFunctions::VisitBinaryOperator(clang::BinaryOperator *bo) {
       if (isUninitialized(val)) {
         if (bo->getOpcode() != BO_Assign)
           reportUninit(res.getDeclRefExpr(), vd, isAlwaysUninit(val));
-        val = Initialized;
+        else
+          val = Initialized;
       }
     }
   }
@@ -513,11 +514,8 @@ void TransferFunctions::VisitUnaryOperator(clang::UnaryOperator *uo) {
         lastDR = 0;
 
         ValueVector::reference val = vals[vd];
-        if (isUninitialized(val)) {
+        if (isUninitialized(val))
           reportUninit(res.getDeclRefExpr(), vd, isAlwaysUninit(val));
-          // Don't cascade warnings.
-          val = Initialized;
-        }
       }
       break;
     }
@@ -575,8 +573,6 @@ void TransferFunctions::ProcessUses(Stmt *s) {
     reportUninit(DR, VD, isAlwaysUninit(vals[VD]));
     lastLoad = 0;
     
-    // Prevent cascade of warnings.
-    vals[VD] = Initialized;
     if (DR == lastDR) {
       lastDR = 0;
       return;
index 06e42b7728327d4398ed0f0b2dbe29d9b91a51cc..3dae7b4d7eb33d1bc2d248e71a78168c15a720b8 100644 (file)
@@ -560,8 +560,6 @@ public:
       const VarDecl *vd = i->first;
       UsesVec *vec = i->second;
 
-      bool fixitIssued = false;
-            
       // Sort the uses by their SourceLocations.  While not strictly
       // guaranteed to produce them in line/column order, this will provide
       // a stable ordering.
@@ -573,11 +571,11 @@ public:
                                       /*isAlwaysUninit=*/vi->second))
           continue;
 
-        // Suggest a fixit hint the first time we diagnose a use of a variable.
-        if (!fixitIssued) {
-          SuggestInitializationFixit(S, vd);
-          fixitIssued = true;
-        }
+        SuggestInitializationFixit(S, vd);
+
+        // Skip further diagnostics for this variable. We try to warn only on
+        // the first point at which a variable is used uninitialized.
+        break;
       }
 
       delete vec;
index 914156da8bfa05066d4b00215a5209b8182548d7..2c91ecc27136e7267cc7b0bbae2aab4a5564f7f3 100644 (file)
@@ -77,7 +77,7 @@ int test11(unsigned n) {
 }
 
 void test12(unsigned n) {
-  for (unsigned i ; n ; ++i) ; // expected-warning{{variable 'i' may be uninitialized when used here}} expected-note{{variable 'i' is declared here}} expected-note{{add initialization to silence this warning}}
+  for (unsigned i ; n ; ++i) ; // expected-warning{{variable 'i' is uninitialized when used here}} expected-note{{variable 'i' is declared here}} expected-note{{add initialization to silence this warning}}
 }
 
 int test13() {
@@ -237,7 +237,7 @@ void test36()
   void **pc; // expected-note{{variable 'pc' is declared here}} expected-note{{add initialization to silence this warning}}
   void *dummy[] = { &&L1, &&L2 };
  L1:
-    goto *pc; // expected-warning{{variable 'pc' may be uninitialized when used here}}
+    goto *pc; // expected-warning{{variable 'pc' is uninitialized when used here}}
  L2:
     goto *pc;
 }
@@ -289,7 +289,7 @@ void test43_aux(int x);
 void test43(int i) {
   int x; // expected-note {{variable 'x' is declared here}} expected-note{{add initialization to silence this warning}}
   for (i = 0 ; i < 10; i++)
-    test43_aux(x++); // expected-warning {{variable 'x' may be uninitialized when used here}}
+    test43_aux(x++); // expected-warning {{variable 'x' is uninitialized when used here}}
 }
 
 void test44(int i) {
@@ -297,7 +297,7 @@ void test44(int i) {
   int y; // expected-note {{variable 'y' is declared here}} expected-note{{add initialization to silence this warning}}
   for (i = 0; i < 10; i++ ) {
     test43_aux(x++); // no-warning
-    x += y; // expected-warning {{variable 'y' may be uninitialized when used here}}
+    x += y; // expected-warning {{variable 'y' is uninitialized when used here}}
   }
 }