llvmorg-github-actions[bot] wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Dominic Chen (ddcc)

<details>
<summary>Changes</summary>

This file is currently missing the fortified version of the builtins

---
Full diff: https://github.com/llvm/llvm-project/pull/232410.diff


2 Files Affected:

- (modified) clang/lib/Sema/SemaFunctionEffects.cpp (+10) 
- (modified) clang/test/Sema/attr-nonblocking-constraints.cpp (+15-1) 


``````````diff
diff --git a/clang/lib/Sema/SemaFunctionEffects.cpp 
b/clang/lib/Sema/SemaFunctionEffects.cpp
index 975281175aebb..bb446179e0b9a 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 400057768523c..0f384aad5c434 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}}
 

``````````

</details>


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

Reply via email to