From 8ed72e7c1caa0eb4238e649063c26a11720935de Mon Sep 17 00:00:00 2001 From: jvoisin Date: Tue, 19 Mar 2024 18:35:13 +0100 Subject: Relax our checks for memchr on C11 and above Since C11: > This function behaves as if it reads the bytes sequentially and stops as soon as a matching bytes is found: if the array pointed to by ptr is smaller than count, but the match is found within the array, the behavior is well-defined. Reported-by: q66 --- include/string.h | 4 +++- tests/test_memchr_dynamic_read.c | 2 ++ tests/test_memchr_static_read.c | 2 ++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/include/string.h b/include/string.h index 24c1501..db2e6c3 100644 --- a/include/string.h +++ b/include/string.h @@ -123,10 +123,12 @@ _FORTIFY_FN(memchr) void *memchr(const void * _FORTIFY_POS0 __d, int __c, size_t if (!__d) __builtin_trap(); +#if __STDC_VERSION__ < 201112L __fh_size_t __b = __fh_bos(__d, 0); - if (__n > __b) __builtin_trap(); +#endif + return __builtin_memchr(__d, __c, __n); #endif } diff --git a/tests/test_memchr_dynamic_read.c b/tests/test_memchr_dynamic_read.c index 2f8d214..8b25a15 100644 --- a/tests/test_memchr_dynamic_read.c +++ b/tests/test_memchr_dynamic_read.c @@ -3,6 +3,7 @@ #include int main(int argc, char** argv) { +#if __STDC_VERSION__ < 201112L const char* buffer = "12345"; memchr(buffer, (int)'4', strlen(buffer) - 1); puts(buffer); @@ -12,5 +13,6 @@ int main(int argc, char** argv) { CHK_FAIL_END puts(buffer); +#endif return ret; } diff --git a/tests/test_memchr_static_read.c b/tests/test_memchr_static_read.c index ccf46af..edd266d 100644 --- a/tests/test_memchr_static_read.c +++ b/tests/test_memchr_static_read.c @@ -3,6 +3,7 @@ #include int main(int argc, char** argv) { +#if __STDC_VERSION__ < 201112L const char* buffer = "12345"; const char* padding = "ABCDEFGHIJKLMN"; memchr(buffer, (int)'4', strlen(buffer) - 1); @@ -13,5 +14,6 @@ int main(int argc, char** argv) { CHK_FAIL_END puts(buffer); +#endif return ret; } -- cgit v1.3