From 4f6aa77fda986a9ecd453460ef3ec797bedaaa7d Mon Sep 17 00:00:00 2001 From: Ted Kremenek Date: Fri, 10 Sep 2010 03:05:40 +0000 Subject: [PATCH] Implement: rule request: warn if @synchronized mutex can be nil git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@113573 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Checker/CMakeLists.txt | 3 ++- lib/Checker/GRExprEngine.cpp | 1 + lib/Checker/GRExprEngineInternalChecks.h | 1 + test/Analysis/misc-ps.m | 15 +++++++++++++++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/lib/Checker/CMakeLists.txt b/lib/Checker/CMakeLists.txt index f93fcc91fd..e69808e48e 100644 --- a/lib/Checker/CMakeLists.txt +++ b/lib/Checker/CMakeLists.txt @@ -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 diff --git a/lib/Checker/GRExprEngine.cpp b/lib/Checker/GRExprEngine.cpp index 851f34e43b..160ee46d30 100644 --- a/lib/Checker/GRExprEngine.cpp +++ b/lib/Checker/GRExprEngine.cpp @@ -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); diff --git a/lib/Checker/GRExprEngineInternalChecks.h b/lib/Checker/GRExprEngineInternalChecks.h index f91a759b32..740a914cfc 100644 --- a/lib/Checker/GRExprEngineInternalChecks.h +++ b/lib/Checker/GRExprEngineInternalChecks.h @@ -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); diff --git a/test/Analysis/misc-ps.m b/test/Analysis/misc-ps.m index 1d6e6f6153..09f397041f 100644 --- a/test/Analysis/misc-ps.m +++ b/test/Analysis/misc-ps.m @@ -1094,4 +1094,19 @@ void test_enum_cases_positive(enum Cases C) { *p = 0xDEADBEEF; // expected-warning{{Dereference of null pointer}} } +// 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}} +} -- 2.40.0