Author: Kirstóf Umann Date: 2020-05-20T00:05:49+02:00 New Revision: b47d1baa535abe061e6a89341e91c8b885b5b80e
URL: https://github.com/llvm/llvm-project/commit/b47d1baa535abe061e6a89341e91c8b885b5b80e DIFF: https://github.com/llvm/llvm-project/commit/b47d1baa535abe061e6a89341e91c8b885b5b80e.diff LOG: [analyzer][NSOrCFError] Don't emit diagnostics under the name osx.NSOrCFErrorDerefChecker Differential Revision: https://reviews.llvm.org/D78123 Added: Modified: clang/lib/StaticAnalyzer/Checkers/NSErrorChecker.cpp clang/test/Analysis/incorrect-checker-names.mm Removed: ################################################################################ diff --git a/clang/lib/StaticAnalyzer/Checkers/NSErrorChecker.cpp b/clang/lib/StaticAnalyzer/Checkers/NSErrorChecker.cpp index 5f68788fafcd..90c5583d8969 100644 --- a/clang/lib/StaticAnalyzer/Checkers/NSErrorChecker.cpp +++ b/clang/lib/StaticAnalyzer/Checkers/NSErrorChecker.cpp @@ -144,14 +144,14 @@ namespace { class NSErrorDerefBug : public BugType { public: - NSErrorDerefBug(const CheckerBase *Checker) + NSErrorDerefBug(const CheckerNameRef Checker) : BugType(Checker, "NSError** null dereference", "Coding conventions (Apple)") {} }; class CFErrorDerefBug : public BugType { public: - CFErrorDerefBug(const CheckerBase *Checker) + CFErrorDerefBug(const CheckerNameRef Checker) : BugType(Checker, "CFErrorRef* null dereference", "Coding conventions (Apple)") {} }; @@ -166,9 +166,9 @@ class NSOrCFErrorDerefChecker mutable std::unique_ptr<NSErrorDerefBug> NSBT; mutable std::unique_ptr<CFErrorDerefBug> CFBT; public: - bool ShouldCheckNSError, ShouldCheckCFError; - NSOrCFErrorDerefChecker() : NSErrorII(nullptr), CFErrorII(nullptr), - ShouldCheckNSError(0), ShouldCheckCFError(0) { } + DefaultBool ShouldCheckNSError, ShouldCheckCFError; + CheckerNameRef NSErrorName, CFErrorName; + NSOrCFErrorDerefChecker() : NSErrorII(nullptr), CFErrorII(nullptr) {} void checkLocation(SVal loc, bool isLoad, const Stmt *S, CheckerContext &C) const; @@ -276,12 +276,12 @@ void NSOrCFErrorDerefChecker::checkEvent(ImplicitNullDerefEvent event) const { BugType *bug = nullptr; if (isNSError) { if (!NSBT) - NSBT.reset(new NSErrorDerefBug(this)); + NSBT.reset(new NSErrorDerefBug(NSErrorName)); bug = NSBT.get(); } else { if (!CFBT) - CFBT.reset(new CFErrorDerefBug(this)); + CFBT.reset(new CFErrorDerefBug(CFErrorName)); bug = CFBT.get(); } BR.emitReport( @@ -331,6 +331,7 @@ void ento::registerNSErrorChecker(CheckerManager &mgr) { mgr.registerChecker<NSErrorMethodChecker>(); NSOrCFErrorDerefChecker *checker = mgr.getChecker<NSOrCFErrorDerefChecker>(); checker->ShouldCheckNSError = true; + checker->NSErrorName = mgr.getCurrentCheckerName(); } bool ento::shouldRegisterNSErrorChecker(const CheckerManager &mgr) { @@ -341,6 +342,7 @@ void ento::registerCFErrorChecker(CheckerManager &mgr) { mgr.registerChecker<CFErrorFunctionChecker>(); NSOrCFErrorDerefChecker *checker = mgr.getChecker<NSOrCFErrorDerefChecker>(); checker->ShouldCheckCFError = true; + checker->CFErrorName = mgr.getCurrentCheckerName(); } bool ento::shouldRegisterCFErrorChecker(const CheckerManager &mgr) { diff --git a/clang/test/Analysis/incorrect-checker-names.mm b/clang/test/Analysis/incorrect-checker-names.mm index f14eea9d9c63..11b6a21a14a9 100644 --- a/clang/test/Analysis/incorrect-checker-names.mm +++ b/clang/test/Analysis/incorrect-checker-names.mm @@ -106,9 +106,19 @@ + (id)errorWithDomain:(NSString *)domain code:(NSInteger)code userInfo:(NSDictio void foo(CFErrorRef* error) { // expected-warning{{Function accepting CFErrorRef* should have a non-void return value to indicate whether or not an error occurred [osx.coreFoundation.CFError]}} // FIXME: This shouldn't be tied to a modeling checker. - *error = 0; // expected-warning {{Potential null dereference. According to coding standards documented in CoreFoundation/CFError.h the parameter may be null [osx.NSOrCFErrorDerefChecker]}} + *error = 0; // expected-warning {{Potential null dereference. According to coding standards documented in CoreFoundation/CFError.h the parameter may be null [osx.coreFoundation.CFError]}} } +@interface A +- (void)myMethodWhichMayFail:(NSError **)error; +@end + +@implementation A +- (void)myMethodWhichMayFail:(NSError **)error { // expected-warning {{Method accepting NSError** should have a non-void return value to indicate whether or not an error occurred [osx.cocoa.NSError]}} + *error = [NSError errorWithDomain:@"domain" code:1 userInfo:0]; // expected-warning {{Potential null dereference. According to coding standards in 'Creating and Returning NSError Objects' the parameter may be null [osx.cocoa.NSError]}} +} +@end + bool write_into_out_param_on_success(OS_RETURNS_RETAINED OSObject **obj); void use_out_param_leak() { _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits