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 <dwy...@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}}
+       }
+}
+
+@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}}
+       }
 }


        
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to