aboutsummaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorXavier Del Campo Romero <xavier.delcampo@orain.io>2020-09-03 14:57:05 +0200
committerXavier Del Campo Romero <xavier.delcampo@orain.io>2020-09-03 15:42:56 +0200
commit4c7bfbf87f05e9df16a34198098806e1ac029be9 (patch)
treed753173b000c66226322780c25f8ac178905a960 /include
parent9b85c4beaad6560e810f662d99215f1450c6a74f (diff)
downloaddynstr-4c7bfbf87f05e9df16a34198098806e1ac029be9.tar.gz
Avoid potential undesirable effects caused by macros
The macros provided by this library would expand to an unguarded conditional that could have potential unwanted consequences. Consider the following example: dynstr_append_or_ret_null(&d, "example"); else { /* This is unexpectedly working. */ } The example above would expand to: if (dynstr_append(__VA_ARGS__) != DYNSTR_OK) return false; else { /* This is unexpectedly working. */ } Which is valid C yet allows possibly unexpected behaviour. The solution is then to enclose these conditions into a `do while (0)` statement.
Diffstat (limited to 'include')
-rw-r--r--include/dynstr.h12
1 files changed, 8 insertions, 4 deletions
diff --git a/include/dynstr.h b/include/dynstr.h
index a07cf3b..4fc0afa 100644
--- a/include/dynstr.h
+++ b/include/dynstr.h
@@ -30,12 +30,14 @@
/**
* Convenience macro that calls dynstr_append and returns NULL if failed.
*/
-#define dynstr_append_or_ret_null(...) if (dynstr_append(__VA_ARGS__) != DYNSTR_OK) return NULL
+#define dynstr_append_or_ret_null(...) \
+ do {if (dynstr_append(__VA_ARGS__) != DYNSTR_OK) return NULL;} while (0)
/**
* Convenience macro that calls dynstr_append and returns false if failed.
*/
-#define dynstr_append_or_ret_false(...) if (dynstr_append(__VA_ARGS__) != DYNSTR_OK) return false
+#define dynstr_append_or_ret_false(...) \
+ do {if (dynstr_append(__VA_ARGS__) != DYNSTR_OK) return false;} while (0)
/**
* Convenience macro that calls dynstr_append and returns its error code if failed.
@@ -45,12 +47,14 @@
/**
* Convenience macro that calls dynstr_append and returns zero if failed.
*/
-#define dynstr_append_or_ret_zero(...) if (dynstr_append(__VA_ARGS__) != DYNSTR_OK) return 0
+#define dynstr_append_or_ret_zero(...) \
+ do {if (dynstr_append(__VA_ARGS__) != DYNSTR_OK) return 0;} while (0)
/**
* Convenience macro that calls dynstr_append and returns one if failed.
*/
-#define dynstr_append_or_ret_nonzero(...) if (dynstr_append(__VA_ARGS__) != DYNSTR_OK) return 1
+#define dynstr_append_or_ret_nonzero(...) \
+ do {if (dynstr_append(__VA_ARGS__) != DYNSTR_OK) return 1;} while (0)
/**
* Dynamic string type used for this library.