Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [thread-next>] [day] [month] [year] [list]
Message-ID: <20120905135311.43281a54@gmail.com>
Date: Wed, 5 Sep 2012 13:53:11 +0200
From: philomath <philomath868@...il.com>
To: musl@...ts.openwall.com
Subject: [PATCH] Add _Noreturn specifier to functions specified as such by
 ISO C11

Since the _Noreturn identifier is not in the user's namespace, we can use it
directly.  in case it's not a keyword (i.e. pre-C11), it is defined as
__attribute__((__noreturn__)) on GCC (where it is implemented since version
2.95), and empty elsewhere.

There are some more interfaces and functions that could make use of this
specifier, here are only those specified in the C11 standard.

---
 include/setjmp.h      | 10 ++++--
 include/stdlib.h      | 15 ++++++---
 src/exit/_Exit.c      | 10 +++++-
 src/exit/abort.c      | 10 +++++-
 src/exit/exit.c       | 10 +++++-
 src/exit/quick_exit.c | 10 +++++-
 6 files changed, 30 insertions(+), 9 deletions(-)

diff --git a/include/setjmp.h b/include/setjmp.h
index 7dc7276..6db4786 100644
--- a/include/setjmp.h
+++ b/include/setjmp.h
@@ -27,9 +27,15 @@ int _setjmp (jmp_buf);
 void _longjmp (jmp_buf, int);
 #endif
 
-
+#if __STDC_VERSION__ < 201112L
+# if __GNUC__
+#  define _Noreturn __attribute__((__noreturn__))
+# else
+#  define _Noreturn
+# endif
+#endif
 int setjmp (jmp_buf);
-void longjmp (jmp_buf, int);
+_Noreturn void longjmp (jmp_buf, int);
 
 #define setjmp setjmp
 #define longjmp longjmp
diff --git a/include/stdlib.h b/include/stdlib.h
index 1749cb3..5e28cd2 100644
--- a/include/stdlib.h
+++ b/include/stdlib.h
@@ -40,12 +40,19 @@ void *realloc (void *, size_t);
 void free (void *);
 void *aligned_alloc(size_t alignment, size_t size);
 
-void abort (void);
+#if __STDC_VERSION__ < 201112L
+# if __GNUC__
+#  define _Noreturn __attribute__((__noreturn__))
+# else
+#  define _Noreturn
+# endif
+#endif
+_Noreturn void abort (void);
 int atexit (void (*) (void));
-void exit (int);
-void _Exit (int);
+_Noreturn void exit (int);
+_Noreturn void _Exit (int);
 int at_quick_exit (void (*) (void));
-void quick_exit (int);
+_Noreturn void quick_exit (int);
 
 char *getenv (const char *);
 
diff --git a/src/exit/_Exit.c b/src/exit/_Exit.c
index 6ceb143..ea85e4a 100644
--- a/src/exit/_Exit.c
+++ b/src/exit/_Exit.c
@@ -1,7 +1,15 @@
 #include <stdlib.h>
 #include "syscall.h"
 
-void _Exit(int ec)
+#if __STDC_VERSION__ < 201112L
+# if __GNUC__
+#  define _Noreturn __attribute__((__noreturn__))
+# else
+#  define _Noreturn
+# endif
+#endif
+
+_Noreturn void _Exit(int ec)
 {
 	__syscall(SYS_exit_group, ec);
 	__syscall(SYS_exit, ec);
diff --git a/src/exit/abort.c b/src/exit/abort.c
index c5b9e52..a3fa436 100644
--- a/src/exit/abort.c
+++ b/src/exit/abort.c
@@ -2,7 +2,15 @@
 #include <signal.h>
 #include "syscall.h"
 
-void abort(void)
+#if __STDC_VERSION__ < 201112L
+# if __GNUC__
+#  define _Noreturn __attribute__((__noreturn__))
+# else
+#  define _Noreturn
+# endif
+#endif
+
+_Noreturn void abort(void)
 {
 	raise(SIGABRT);
 	raise(SIGKILL);
diff --git a/src/exit/exit.c b/src/exit/exit.c
index e4aeaf1..0a1c9aa 100644
--- a/src/exit/exit.c
+++ b/src/exit/exit.c
@@ -14,7 +14,15 @@ weak_alias(dummy, __funcs_on_exit);
 weak_alias(dummy, __flush_on_exit);
 weak_alias(dummy, __seek_on_exit);
 
-void exit(int code)
+#if __STDC_VERSION__ < 201112L
+# if __GNUC__
+#  define _Noreturn __attribute__((__noreturn__))
+# else
+#  define _Noreturn
+# endif
+#endif
+
+_Noreturn void exit(int code)
 {
 	static int lock;
 
diff --git a/src/exit/quick_exit.c b/src/exit/quick_exit.c
index 18d5288..936cd7f 100644
--- a/src/exit/quick_exit.c
+++ b/src/exit/quick_exit.c
@@ -3,10 +3,18 @@
 #include "atomic.h"
 #include "libc.h"
 
+#if __STDC_VERSION__ < 201112L
+# if __GNUC__
+#  define _Noreturn __attribute__((__noreturn__))
+# else
+#  define _Noreturn
+# endif
+#endif
+
 static void dummy() { }
 weak_alias(dummy, __funcs_on_quick_exit);
 
-void quick_exit(int code)
+_Noreturn void quick_exit(int code)
 {
 	static int lock;
 	while (a_swap(&lock, 1)) __syscall(SYS_pause);
-- 
1.7.12

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.