mirror of
https://github.com/checkpoint-restore/criu
synced 2025-09-01 14:55:39 +00:00
string.h: fix memset over-optimization with clang
We found a weird case of parasite code dying of SIGSEGV when clang is used as a compiler (see [1] for more details). Apparently, it was caused by clang optimizing our builtin_memset() by inserting a call to memset(). It is a valid compiler optimization, aside from the fact that in our code memset() is defined as a weak alias to builtin_memset(), which of course lead to infinite recursion and stack growth. This might be a bug in compiler, but there are ways to avoid it: 1. Rewrite builtin_memset() in asm (note it needs to be done for every architecture supported). 2. Disable compiler optimizations for this code (say, by using -O0). 3. Declare the pointer inside builtin_memcpy() as volatile. The last approach looks more appealing -- mostly for being simple. [1] https://github.com/xemul/criu/issues/279 travis-ci: success for string.h: fix memset over-optimization with clang Cc: Andrei Vagin <avagin@virtuozzo.com> Cc: Dmitry Safonov <dsafonov@virtuozzo.com> Cc: Cyrill Gorcunov <gorcunov@openvz.org> Signed-off-by: Kir Kolyshkin <kir@openvz.org> Acked-by: Cyrill Gorcunov <gorcunov@openvz.org> Signed-off-by: Pavel Emelyanov <xemul@virtuozzo.com>
This commit is contained in:
committed by
Pavel Emelyanov
parent
e4335cf061
commit
8ea0ba7dd0
@@ -65,7 +65,7 @@ static always_inline int builtin_strncmp(const char *cs, const char *ct, size_t
|
|||||||
#ifndef HAS_BUILTIN_MEMSET
|
#ifndef HAS_BUILTIN_MEMSET
|
||||||
static __maybe_unused void *builtin_memset(void *s, const int c, size_t count)
|
static __maybe_unused void *builtin_memset(void *s, const int c, size_t count)
|
||||||
{
|
{
|
||||||
char *dest = s;
|
volatile char *dest = s;
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
|
|
||||||
while (i < count)
|
while (i < count)
|
||||||
|
Reference in New Issue
Block a user