• Kir Kolyshkin's avatar
    string.h: fix memset over-optimization with clang · 8ea0ba7d
    Kir Kolyshkin authored
    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: 's avatarKir Kolyshkin <kir@openvz.org>
    Acked-by: 's avatarCyrill Gorcunov <gorcunov@openvz.org>
    Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
    8ea0ba7d
Name
Last commit
Last update
Documentation Loading commit data...
contrib Loading commit data...
coredump Loading commit data...
crit Loading commit data...
criu Loading commit data...
images Loading commit data...
include/common Loading commit data...
lib Loading commit data...
scripts Loading commit data...
soccr Loading commit data...
test Loading commit data...
.gitignore Loading commit data...
.mailmap Loading commit data...
.travis.yml Loading commit data...
COPYING Loading commit data...
CREDITS Loading commit data...
INSTALL.md Loading commit data...
Makefile Loading commit data...
Makefile.config Loading commit data...
Makefile.install Loading commit data...
Makefile.versions Loading commit data...
README.md Loading commit data...