The following pull request was submitted through Github.
It can be accessed and reviewed at: https://github.com/lxc/lxc/pull/2975

This e-mail was sent by the LXC bot, direct replies will not reach the author
unless they happen to be subscribed to this list.

=== Description (from pull-request) ===
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 <[email protected]>
From 633cb8bee31b0ce075adbe8a143f88f533605552 Mon Sep 17 00:00:00 2001
From: Christian Brauner <[email protected]>
Date: Sat, 4 May 2019 13:35:51 +0200
Subject: [PATCH] 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 <[email protected]>
---
 src/lxc/compiler.h     | 4 ++++
 src/lxc/raw_syscalls.c | 3 ++-
 2 files changed, 6 insertions(+), 1 deletion(-)

diff --git a/src/lxc/compiler.h b/src/lxc/compiler.h
index 65457cb31b..9b0de394a5 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 a4db306919..2e15575870 100644
--- a/src/lxc/raw_syscalls.c
+++ b/src/lxc/raw_syscalls.c
@@ -9,6 +9,7 @@
 #include <sys/syscall.h>
 #include <unistd.h>
 
+#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
_______________________________________________
lxc-devel mailing list
[email protected]
http://lists.linuxcontainers.org/listinfo/lxc-devel

Reply via email to