Prevent false warnings in memcpy (GCC 12)

GCC 12 tree-loop-distribute-patterns generates false warnings of
-Warray-bounds, -Wstringop-overflow, or -Wstringop-overread in memcpy()
and memcpy_cpu() in static/inline cases for code that obviously prevents
its execution by invariant checking. On -O3, even more warnings are
produced.
This commit is contained in:
Christian Helmuth 2024-12-03 14:45:50 +01:00
parent 010847b69c
commit 1d73cf2003
2 changed files with 8 additions and 2 deletions

View File

@ -25,7 +25,10 @@ namespace Genode {
* \param size number of bytes to copy * \param size number of bytes to copy
* *
* \return number of bytes not copied * \return number of bytes not copied
*
* The compiler attribute prevents array-bounds warnings with gcc 12.3.
*/ */
__attribute((optimize("no-tree-loop-distribute-patterns")))
inline size_t memcpy_cpu(void * dst, const void * src, size_t size) inline size_t memcpy_cpu(void * dst, const void * src, size_t size)
{ {
using word_t = unsigned long; using word_t = unsigned long;

View File

@ -130,7 +130,7 @@ namespace Genode {
/** /**
* Return length of null-terminated string in bytes * Return length of null-terminated string in bytes
*/ */
__attribute((optimize("no-tree-loop-distribute-patterns"))) __attribute((optimize("no-tree-loop-distribute-patterns")))
inline size_t strlen(const char *s) inline size_t strlen(const char *s)
{ {
size_t res = 0; size_t res = 0;
@ -190,6 +190,9 @@ namespace Genode {
*/ */
inline void *memcpy(void *dst, const void *src, size_t size) inline void *memcpy(void *dst, const void *src, size_t size)
{ {
if (!size)
return dst;
char *d = (char *)dst, *s = (char *)src; char *d = (char *)dst, *s = (char *)src;
size_t i; size_t i;
@ -281,7 +284,7 @@ namespace Genode {
* generation of a 'memset()' call in the 'while' loop * generation of a 'memset()' call in the 'while' loop
* with gcc 10. * with gcc 10.
*/ */
__attribute((optimize("no-tree-loop-distribute-patterns"))) __attribute((optimize("no-tree-loop-distribute-patterns")))
inline void *memset(void *dst, uint8_t i, size_t size) inline void *memset(void *dst, uint8_t i, size_t size)
{ {
using word_t = unsigned long; using word_t = unsigned long;