]> granicus.if.org Git - clang/commitdiff
Implement: <rdar://problem/6351970> rule request: warn if @synchronized mutex can...
authorTed Kremenek <kremenek@apple.com>
Fri, 10 Sep 2010 03:05:40 +0000 (03:05 +0000)
committerTed Kremenek <kremenek@apple.com>
Fri, 10 Sep 2010 03:05:40 +0000 (03:05 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@113573 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Checker/CMakeLists.txt
lib/Checker/GRExprEngine.cpp
lib/Checker/GRExprEngineInternalChecks.h
test/Analysis/misc-ps.m

index f93fcc91fd812d7564d905dd31d4aa724f47a61f..e69808e48e60a4603f35242a15b26d688c9505cb 100644 (file)
@@ -18,6 +18,7 @@ add_clang_library(clangChecker
   BugReporterVisitors.cpp
   BuiltinFunctionChecker.cpp
   CFRefCount.cpp
+  CStringChecker.cpp
   CallAndMessageChecker.cpp
   CastSizeChecker.cpp
   CastToStructChecker.cpp
@@ -29,7 +30,6 @@ add_clang_library(clangChecker
   Checker.cpp
   CheckerHelpers.cpp
   CocoaConventions.cpp
-  CStringChecker.cpp
   DereferenceChecker.cpp
   DivZeroChecker.cpp
   Environment.cpp
@@ -54,6 +54,7 @@ add_clang_library(clangChecker
   NSErrorChecker.cpp
   NoReturnFunctionChecker.cpp
   OSAtomicChecker.cpp
+  ObjCAtSyncChecker.cpp
   ObjCUnusedIVarsChecker.cpp
   PathDiagnostic.cpp
   PlistDiagnostics.cpp
index 851f34e43b8a2ec9ab15ef1de5d90ab8b0539bc4..160ee46d30ead9984a42e1a875f55aed893e598c 100644 (file)
@@ -373,6 +373,7 @@ static void RegisterInternalChecks(GRExprEngine &Eng) {
   RegisterUndefCapturedBlockVarChecker(Eng);
   RegisterUndefResultChecker(Eng);
   RegisterStackAddrLeakChecker(Eng);
+  RegisterObjCAtSyncChecker(Eng);
 
   // This is not a checker yet.
   RegisterNoReturnFunctionChecker(Eng);
index f91a759b3299ecc01fea3616440599aee091e598..740a914cfcd1039f15a0d74809cfac60a39a49b9 100644 (file)
@@ -31,6 +31,7 @@ void RegisterDereferenceChecker(GRExprEngine &Eng);
 void RegisterDivZeroChecker(GRExprEngine &Eng);
 void RegisterFixedAddressChecker(GRExprEngine &Eng);
 void RegisterNoReturnFunctionChecker(GRExprEngine &Eng);
+void RegisterObjCAtSyncChecker(GRExprEngine &Eng);
 void RegisterPointerArithChecker(GRExprEngine &Eng);
 void RegisterPointerSubChecker(GRExprEngine &Eng);
 void RegisterReturnPointerRangeChecker(GRExprEngine &Eng);
index 1d6e6f6153e28bd7011ba5e1dd6d333f52e2178b..09f397041fb22be1d612902a8b9e17cfc757828b 100644 (file)
@@ -1094,4 +1094,19 @@ void test_enum_cases_positive(enum Cases C) {
   *p = 0xDEADBEEF; // expected-warning{{Dereference of null pointer}}
 }
 
+// <rdar://problem/6351970> rule request: warn if synchronization mutex can be nil
+void rdar6351970() {
+  id x = 0;
+  @synchronized(x) {} // expected-warning{{Nil value used as mutex for @synchronized() (no synchronization will occur)}}
+}
+
+void rdar6351970_b(id x) {
+  if (!x)
+    @synchronized(x) {} // expected-warning{{Nil value used as mutex for @synchronized() (no synchronization will occur)}}
+}
+
+void rdar6351970_c() {
+  id x;
+  @synchronized(x) {} // expected-warning{{Uninitialized value used as mutex for @synchronized}}
+}