summaryrefslogtreecommitdiff
path: root/json_util.h
diff options
context:
space:
mode:
authorJehan <jehan@girinstud.io>2020-03-15 23:29:37 +0100
committerJehan <jehan@girinstud.io>2020-03-16 19:53:28 +0100
commitb15e7ba470d09e521963257b9cc173f65096d8b5 (patch)
tree525369a72c001d294982afe5507d0036dbce8aaa /json_util.h
parente94eb90f9f1c64570379719531d67789f394c05d (diff)
downloadjson-c-b15e7ba470d09e521963257b9cc173f65096d8b5.tar.gz
Fixes various Wreturn-type and Wimplicit-fallthrough errors on Mingw-w64
This is a recent regression since commit 6359b798479d379a3202e02c6a938d9b40c0d856 which added various assert(0) calls (often replacing return-s). With Ming-W64 compiler, json-c build was failing with various errors of the sort: > /home/jehan/dev/src/json-c/json_object.c: In function 'json_object_int_inc': > /home/jehan/dev/src/json-c/json_object.c:841:1: error: control reaches end of non-void function [-Werror=return-type] > 841 | } > | ^ > In file included from /home/jehan/dev/src/json-c/json_object.c:17: > /home/jehan/dev/src/json-c/json_object.c: In function 'json_object_get_double': > /home/jehan/.local/share/crossroad/roads/w64/json-c/include/assert.h:76:4: error: this statement may fall through [-Werror=implicit-fallthrough=] > 76 | (_assert(#_Expression,__FILE__,__LINE__),0)) > | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ > /home/jehan/dev/src/json-c/json_object.c:1070:7: note: in expansion of macro 'assert' > 1070 | assert(0); > | ^~~~~~ > /home/jehan/dev/src/json-c/json_object.c:1072:3: note: here > 1072 | case json_type_boolean: > | ^~~~ The problem is that Mingw-w64 does not consider assert() as a noreturn (even assert(0)), because it has to be compatible by Microsoft libraries. See the discussion here: https://sourceforge.net/p/mingw-w64/bugs/306/ Instead let's create a new json_abort() function which is basically just an abort() function with an optional message, for such cases where abortion was non-conditional (using assert() and using the assertion condition as a message here was clearly a misuse of the function). And mark json_abort() as 'noreturn', as well as 'cold' for optimization purpose (this is code we expect to never run, unless there is a bug, that is). Finally let's use this json_abort() instead of previous misused assert() calls.
Diffstat (limited to 'json_util.h')
-rw-r--r--json_util.h17
1 files changed, 17 insertions, 0 deletions
diff --git a/json_util.h b/json_util.h
index 43adca9..83ff62f 100644
--- a/json_util.h
+++ b/json_util.h
@@ -112,6 +112,23 @@ JSON_EXPORT int json_parse_double(const char *buf, double *retval);
*/
JSON_EXPORT const char *json_type_to_name(enum json_type o_type);
+#ifndef JSON_NORETURN
+#if defined(_MSC_VER)
+#define JSON_NORETURN __declspec(noreturn)
+#else
+/* 'cold' attribute is for optimization, telling the computer this code
+ * path is unlikely.
+ */
+#define JSON_NORETURN __attribute__ ((noreturn, cold))
+#endif
+#endif
+/**
+ * Abort and optionally print a message on standard error.
+ * This should be used rather than assert() for unconditional abortion
+ * (in particular for code paths which are never supposed to be run).
+ * */
+JSON_NORETURN JSON_EXPORT void json_abort(const char *message);
+
#ifdef __cplusplus
}
#endif