https://github.com/ddcc updated https://github.com/llvm/llvm-project/pull/232410

>From 7bd169c18f3409b8f303490664eb5c84ad6e2db7 Mon Sep 17 00:00:00 2001
From: Dominic Chen <[email protected]>
Date: Thu, 15 Oct 2026 09:40:04 -0700
Subject: [PATCH] clang: Apply blocking annotation to fortified printf builtins
 as well

---
 clang/lib/Sema/SemaFunctionEffects.cpp           | 10 ++++++++++
 clang/test/Sema/attr-nonblocking-constraints.cpp | 16 +++++++++++++++-
 2 files changed, 25 insertions(+), 1 deletion(-)

diff --git a/clang/lib/Sema/SemaFunctionEffects.cpp 
b/clang/lib/Sema/SemaFunctionEffects.cpp
index 975281175aebb4..bb446179e0b9a4 100644
--- a/clang/lib/Sema/SemaFunctionEffects.cpp
+++ b/clang/lib/Sema/SemaFunctionEffects.cpp
@@ -200,6 +200,16 @@ static FunctionEffectKindSet 
getBuiltinFunctionEffects(unsigned BuiltinID) {
   case Builtin::ID::BIvsnprintf:
   case Builtin::ID::BIvsprintf:
 
+  // Fortified printf family, used by _FORTIFY_SOURCE wrappers
+  case Builtin::ID::BI__builtin___fprintf_chk:
+  case Builtin::ID::BI__builtin___printf_chk:
+  case Builtin::ID::BI__builtin___snprintf_chk:
+  case Builtin::ID::BI__builtin___sprintf_chk:
+  case Builtin::ID::BI__builtin___vfprintf_chk:
+  case Builtin::ID::BI__builtin___vprintf_chk:
+  case Builtin::ID::BI__builtin___vsnprintf_chk:
+  case Builtin::ID::BI__builtin___vsprintf_chk:
+
   // stdio.h: scanf family.
   case Builtin::ID::BIscanf:
   case Builtin::ID::BIfscanf:
diff --git a/clang/test/Sema/attr-nonblocking-constraints.cpp 
b/clang/test/Sema/attr-nonblocking-constraints.cpp
index 400057768523c5..0f384aad5c434b 100644
--- a/clang/test/Sema/attr-nonblocking-constraints.cpp
+++ b/clang/test/Sema/attr-nonblocking-constraints.cpp
@@ -320,11 +320,25 @@ void nb19() [[clang::nonblocking]] {
        __builtin_assume(1);
        void *ptr = __builtin_malloc(1); // expected-warning {{function with 
'nonblocking' attribute must not call non-'nonblocking' function 
'__builtin_malloc'}}
        __builtin_free(ptr); // expected-warning {{function with 'nonblocking' 
attribute must not call non-'nonblocking' function '__builtin_free'}}
-       
+
        void *p2 = __builtin_operator_new(1); // expected-warning {{function 
with 'nonblocking' attribute must not call non-'nonblocking' function 
'__builtin_operator_new'}}
        __builtin_operator_delete(p2); // expected-warning {{function with 
'nonblocking' attribute must not call non-'nonblocking' function 
'__builtin_operator_delete'}}
 }
 
+// Fortified builtins, as used by _FORTIFY_SOURCE wrappers
+void nb19a(char *dst, const char *src, __SIZE_TYPE__ n, __builtin_va_list ap) 
[[clang::nonblocking]] {
+       __builtin___memcpy_chk(dst, src, n, __builtin_object_size(dst, 0));
+       __builtin___memset_chk(dst, 0, n, __builtin_object_size(dst, 0));
+       __builtin___strlcpy_chk(dst, src, n, __builtin_object_size(dst, 0));
+
+       __builtin___printf_chk(0, "%s", src); // expected-warning {{function 
with 'nonblocking' attribute must not call non-'nonblocking' function 
'__builtin___printf_chk'}}
+       __builtin___vprintf_chk(0, "%s", ap); // expected-warning {{function 
with 'nonblocking' attribute must not call non-'nonblocking' function 
'__builtin___vprintf_chk'}}
+       __builtin___snprintf_chk(dst, n, 0, __builtin_object_size(dst, 0), 
"%s", src); // expected-warning {{function with 'nonblocking' attribute must 
not call non-'nonblocking' function '__builtin___snprintf_chk'}}
+       __builtin___sprintf_chk(dst, 0, __builtin_object_size(dst, 0), "%s", 
src); // expected-warning {{function with 'nonblocking' attribute must not call 
non-'nonblocking' function '__builtin___sprintf_chk'}}
+       __builtin___vsnprintf_chk(dst, n, 0, __builtin_object_size(dst, 0), 
"%s", ap); // expected-warning {{function with 'nonblocking' attribute must not 
call non-'nonblocking' function '__builtin___vsnprintf_chk'}}
+       __builtin___vsprintf_chk(dst, 0, __builtin_object_size(dst, 0), "%s", 
ap); // expected-warning {{function with 'nonblocking' attribute must not call 
non-'nonblocking' function '__builtin___vsprintf_chk'}}
+}
+
 // Function try-block
 void catches() try {} catch (...) {} // expected-note {{function cannot be 
inferred 'nonblocking' because it throws or catches exceptions}}
 

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to