From: Christian Brauner Date: Sat, 4 May 2019 11:35:51 +0000 (+0200) Subject: compiler: add __returns_twice attribute X-Git-Tag: lxc-3.2.0~73^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=refs%2Fpull%2F2975%2Fhead;p=thirdparty%2Flxc.git compiler: add __returns_twice attribute The returns_twice attribute tells the compiler that a function may return more than one time. The compiler will ensure that all registers are dead before calling such a function and will emit a warning about the variables that may be clobbered after the second return from the function. Examples of such functions are setjmp and vfork. The longjmp-like counterpart of such function, if any, might need to be marked with the noreturn attribute. Signed-off-by: Christian Brauner --- diff --git a/src/lxc/compiler.h b/src/lxc/compiler.h index 65457cb31..9b0de394a 100644 --- a/src/lxc/compiler.h +++ b/src/lxc/compiler.h @@ -59,6 +59,10 @@ # define __hot __attribute__((hot)) #endif +#ifndef __returns_twice +#define __returns_twice __attribute__((returns_twice)) +#endif + #define __cgfsng_ops #endif /* __LXC_COMPILER_H */ diff --git a/src/lxc/raw_syscalls.c b/src/lxc/raw_syscalls.c index a4db30691..2e1557587 100644 --- a/src/lxc/raw_syscalls.c +++ b/src/lxc/raw_syscalls.c @@ -9,6 +9,7 @@ #include #include +#include "compiler.h" #include "config.h" #include "macro.h" #include "raw_syscalls.h" @@ -32,7 +33,7 @@ int lxc_raw_execveat(int dirfd, const char *pathname, char *const argv[], * The nice thing about this is that we get fork() behavior. That is * lxc_raw_clone() returns 0 in the child and the child pid in the parent. */ -pid_t lxc_raw_clone(unsigned long flags) +__returns_twice pid_t lxc_raw_clone(unsigned long flags) { /* * These flags don't interest at all so we don't jump through any hoops