https://github.com/ddcc created https://github.com/llvm/llvm-project/pull/232410
This file is currently missing the fortified version of the builtins >From 432bdba1cf8ec6b1923aa2458df3cc0af4ef334b 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
