[clang] cef66aa - [Clang] Diagnose additional ObjC statements as function effect violations (#112148)
via cfe-commits
cfe-commits at lists.llvm.org
Mon Oct 14 08:49:33 PDT 2024
Author: Doug Wyatt
Date: 2024-10-14T17:49:30+02:00
New Revision: cef66aa04d3713afc4d0dfa66491b7af77322090
URL: https://github.com/llvm/llvm-project/commit/cef66aa04d3713afc4d0dfa66491b7af77322090
DIFF: https://github.com/llvm/llvm-project/commit/cef66aa04d3713afc4d0dfa66491b7af77322090.diff
LOG: [Clang] Diagnose additional ObjC statements as function effect violations (#112148)
Bug fix: `@autoreleasepool`, `@synchronized`, and `@finally` were not
being noticed and treated as function effect violations.
---------
Co-authored-by: Doug Wyatt <dwyatt at apple.com>
Added:
Modified:
clang/lib/Sema/SemaFunctionEffects.cpp
clang/test/SemaObjCXX/attr-nonblocking-constraints.mm
Removed:
################################################################################
diff --git a/clang/lib/Sema/SemaFunctionEffects.cpp b/clang/lib/Sema/SemaFunctionEffects.cpp
index 0ac5de29f66aa7..70e5d78661a835 100644
--- a/clang/lib/Sema/SemaFunctionEffects.cpp
+++ b/clang/lib/Sema/SemaFunctionEffects.cpp
@@ -1133,6 +1133,13 @@ class Analyzer {
return true;
}
+ bool VisitObjCAtFinallyStmt(ObjCAtFinallyStmt *Finally) {
+ diagnoseLanguageConstruct(FunctionEffect::FE_ExcludeCatch,
+ ViolationID::ThrowsOrCatchesExceptions,
+ Finally->getAtFinallyLoc());
+ return true;
+ }
+
bool VisitObjCMessageExpr(ObjCMessageExpr *Msg) {
diagnoseLanguageConstruct(FunctionEffect::FE_ExcludeObjCMessageSend,
ViolationID::AccessesObjCMethodOrProperty,
@@ -1140,6 +1147,26 @@ class Analyzer {
return true;
}
+ bool VisitObjCAutoreleasePoolStmt(ObjCAutoreleasePoolStmt *ARP) {
+ // Under the hood, @autorelease (potentially?) allocates memory and
+ // invokes ObjC methods. We don't currently have memory allocation as
+ // a "language construct" but we do have ObjC messaging, so diagnose that.
+ diagnoseLanguageConstruct(FunctionEffect::FE_ExcludeObjCMessageSend,
+ ViolationID::AccessesObjCMethodOrProperty,
+ ARP->getBeginLoc());
+ return true;
+ }
+
+ bool VisitObjCAtSynchronizedStmt(ObjCAtSynchronizedStmt *Sync) {
+ // Under the hood, this calls objc_sync_enter and objc_sync_exit, wrapped
+ // in a @try/@finally block. Diagnose this generically as "ObjC
+ // messaging".
+ diagnoseLanguageConstruct(FunctionEffect::FE_ExcludeObjCMessageSend,
+ ViolationID::AccessesObjCMethodOrProperty,
+ Sync->getBeginLoc());
+ return true;
+ }
+
bool VisitSEHExceptStmt(SEHExceptStmt *Exc) {
diagnoseLanguageConstruct(FunctionEffect::FE_ExcludeCatch,
ViolationID::ThrowsOrCatchesExceptions,
diff --git a/clang/test/SemaObjCXX/attr-nonblocking-constraints.mm b/clang/test/SemaObjCXX/attr-nonblocking-constraints.mm
index abd0938ac321af..d1c9b3cc98a1c0 100644
--- a/clang/test/SemaObjCXX/attr-nonblocking-constraints.mm
+++ b/clang/test/SemaObjCXX/attr-nonblocking-constraints.mm
@@ -23,4 +23,17 @@ void nb4() [[clang::nonblocking]] {
}
@catch (...) { // expected-warning {{function with 'nonblocking' attribute must not throw or catch exceptions}}
}
+ @finally { // expected-warning {{function with 'nonblocking' attribute must not throw or catch exceptions}}
+ }
+}
+
+ at class Lock;
+extern Lock *someLock;
+
+void nb5() [[clang::nonblocking]] {
+ @autoreleasepool { // expected-warning {{function with 'nonblocking' attribute must not access ObjC methods or properties}}
+ }
+
+ @synchronized(someLock) { // expected-warning {{function with 'nonblocking' attribute must not access ObjC methods or properties}}
+ }
}
More information about the cfe-commits
mailing list