summaryrefslogtreecommitdiffstats
path: root/clang
diff options
context:
space:
mode:
Diffstat (limited to 'clang')
-rw-r--r--clang/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp23
-rw-r--r--clang/test/Analysis/deadstores-driverkit.cpp24
-rw-r--r--clang/test/Analysis/os_object_base.h8
3 files changed, 55 insertions, 0 deletions
diff --git a/clang/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp
index e316c9120b2..b6fa47e4699 100644
--- a/clang/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp
+++ b/clang/lib/StaticAnalyzer/Checkers/DeadStoresChecker.cpp
@@ -160,6 +160,26 @@ public:
return InEH->count(D);
}
+ bool isSuppressed(SourceRange R) {
+ SourceManager &SMgr = Ctx.getSourceManager();
+ SourceLocation Loc = R.getBegin();
+ if (!Loc.isValid())
+ return false;
+
+ FileID FID = SMgr.getFileID(Loc);
+ bool Invalid = false;
+ StringRef Data = SMgr.getBufferData(FID, &Invalid);
+ if (Invalid)
+ return false;
+
+ // Files autogenerated by DriverKit IIG contain some dead stores that
+ // we don't want to report.
+ if (Data.startswith("/* iig generated from"))
+ return true;
+
+ return false;
+ }
+
void Report(const VarDecl *V, DeadStoreKind dsk,
PathDiagnosticLocation L, SourceRange R) {
if (Escaped.count(V))
@@ -175,6 +195,9 @@ public:
if (!reachableCode->isReachable(currentBlock))
return;
+ if (isSuppressed(R))
+ return;
+
SmallString<64> buf;
llvm::raw_svector_ostream os(buf);
const char *BugType = nullptr;
diff --git a/clang/test/Analysis/deadstores-driverkit.cpp b/clang/test/Analysis/deadstores-driverkit.cpp
new file mode 100644
index 00000000000..446821b32ca
--- /dev/null
+++ b/clang/test/Analysis/deadstores-driverkit.cpp
@@ -0,0 +1,24 @@
+/* iig generated from SomethingSomething.iig */
+
+// The comment above is the whole point of the test.
+// That's how the suppression works.
+// It needs to be on the top.
+// Run-lines can wait.
+
+// RUN: %clang_analyze_cc1 -w -triple x86_64-apple-driverkit19.0 \
+// RUN: -analyzer-checker=deadcode -verify %s
+
+// expected-no-diagnostics
+
+#include "os_object_base.h"
+
+class OSSomething {
+ kern_return_t Invoke(const IORPC);
+ void foo(OSDispatchMethod supermethod) {
+ kern_return_t ret;
+ IORPC rpc;
+ // Test the DriverKit specific suppression in the dead stores checker.
+ if (supermethod) ret = supermethod((OSObject *)this, rpc); // no-warning
+ else ret = ((OSObject *)this)->Invoke(rpc); // no-warning
+ }
+};
diff --git a/clang/test/Analysis/os_object_base.h b/clang/test/Analysis/os_object_base.h
index 37a3fc07df7..4698185f2b3 100644
--- a/clang/test/Analysis/os_object_base.h
+++ b/clang/test/Analysis/os_object_base.h
@@ -19,6 +19,9 @@
using size_t = decltype(sizeof(int));
+typedef int kern_return_t;
+struct IORPC {};
+
struct OSMetaClass;
struct OSMetaClassBase {
@@ -37,8 +40,13 @@ struct OSMetaClassBase {
virtual void free();
virtual ~OSMetaClassBase(){};
+
+ kern_return_t Invoke(IORPC invoke);
};
+typedef kern_return_t (*OSDispatchMethod)(OSMetaClassBase *self,
+ const IORPC rpc);
+
struct OSObject : public OSMetaClassBase {
virtual ~OSObject(){}
OpenPOWER on IntegriCloud