[PATCH] D55680: [analyzer] ObjCDealloc: Fix a crash when a class attempts to deallocate another class.
Artem Dergachev via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Thu Dec 13 15:18:48 PST 2018
NoQ created this revision.
NoQ added reviewers: dcoughlin, george.karpenkov.
Herald added subscribers: cfe-commits, dkrupp, donat.nagy, Szelethus, mikhail.ramalho, a.sidorin, szepet, baloghadamsoftware, xazax.hun.
The checker wasn't prepared to see the `dealloc` message sent to the class itself rather than to an instance, as if it was `+dealloc`.
Additionally, it wasn't prepared for pure unknown `self` values; the new guard covers that as well, but it is annoying to test because both kinds of values shouldn't really appear and we generally want to get rid of all of them (by modeling unknown values with symbols and by warning on use of undefined values before they are used).
The `CHECK:` directive for `FileCheck` at the end of the test looks useless, so i removed it.
Repository:
rC Clang
https://reviews.llvm.org/D55680
Files:
lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp
test/Analysis/MissingDealloc.m
Index: test/Analysis/MissingDealloc.m
===================================================================
--- test/Analysis/MissingDealloc.m
+++ test/Analysis/MissingDealloc.m
@@ -183,4 +183,17 @@
@implementation NonNSObjectMissingDealloc
@end
-// CHECK: 4 warnings generated.
+
+//===------------------------------------------------------------------------===
+// Don't crash on calls to dealloc as a class method.
+
+ at interface DeallocingClass : NSObject {}
+ at end
+ at implementation DeallocingClass
+- (void)dealloc {
+ [DeallocingClass dealloc]; // FIXME: Should we warn on this specifically?
+}
+#if NON_ARC
+// expected-warning at -2{{method possibly missing a [super dealloc] call}}
+#endif
+ at end
Index: lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp
===================================================================
--- lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp
+++ lib/StaticAnalyzer/Checkers/CheckObjCDealloc.cpp
@@ -715,6 +715,10 @@
bool ObjCDeallocChecker::diagnoseMistakenDealloc(SymbolRef DeallocedValue,
const ObjCMethodCall &M,
CheckerContext &C) const {
+ // TODO: Apart from unknown/undefined receivers, this may happen when
+ // dealloc is called as a class method. Should we warn?
+ if (!DeallocedValue)
+ return false;
// Find the property backing the instance variable that M
// is dealloc'ing.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D55680.178146.patch
Type: text/x-patch
Size: 1442 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20181213/75e1082e/attachment.bin>
More information about the cfe-commits
mailing list