|
commit d26a40412197ba61a72368c71e8a8582d686d28c
|
|
Author: Willy Tarreau <w@1wt.eu>
|
|
Date: Mon Oct 15 11:53:34 2018 +0200
|
|
|
|
BUILD: compiler: add a new statement "__unreachable()"
|
|
|
|
This statement is used as a hint for the compiler so that it knows that
|
|
the location where it's placed cannot be reached. It will mostly be used
|
|
after longjmp() or equivalent statements that deal with error processing
|
|
and that the compiler doesn't know will not return on certain conditions,
|
|
so that it doesn't complain about null dereferences on error paths.
|
|
|
|
(cherry picked from commit 8d26f02e693121764bfa0cb48c9a7ab31e17225d)
|
|
Signed-off-by: Willy Tarreau <w@1wt.eu>
|
|
|
|
diff --git a/include/common/compiler.h b/include/common/compiler.h
|
|
index a13aad5c..6f4f5a67 100644
|
|
--- a/include/common/compiler.h
|
|
+++ b/include/common/compiler.h
|
|
@@ -82,6 +82,18 @@
|
|
*/
|
|
#define __maybe_unused __attribute__((unused))
|
|
|
|
+/* This allows gcc to know that some locations are never reached, for example
|
|
+ * after a longjmp() in the Lua code, hence that some errors caught by such
|
|
+ * methods cannot propagate further. This is important with gcc versions 6 and
|
|
+ * above which can more aggressively detect null dereferences. The builtin
|
|
+ * below was introduced in gcc 4.5, and before it we didn't care.
|
|
+ */
|
|
+#if __GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 5)
|
|
+#define __unreachable() __builtin_unreachable()
|
|
+#else
|
|
+#define __unreachable()
|
|
+#endif
|
|
+
|
|
/*
|
|
* Gcc >= 3 provides the ability for the programme to give hints to the
|
|
* compiler about what branch of an if is most likely to be taken. This
|