[PATCH] test: parenthesize common macro arguments
Marat Khalili
marat.khalili at huawei.com
Thu Mar 26 18:47:49 CET 2026
Parenthesize argument substitutions in macros commonly used by tests.
Without parentheses around arguments macros like TEST_ASSERT_SUCCESS
could produce incorrect results if passed e.g. a ternary expression.
Signed-off-by: Marat Khalili <marat.khalili at huawei.com>
---
Very curious how none of the code-checking tools we have like Coverity
flagged this trivial issue.
To highlight non-whitespace changes: git show --word-diff --anchored='/*'
app/test/test.h | 86 +++++++++++++++++++-------------------
lib/eal/include/rte_test.h | 12 +++---
2 files changed, 49 insertions(+), 49 deletions(-)
diff --git a/app/test/test.h b/app/test/test.h
index 1f12fc5397a8..ad2347d3fe26 100644
--- a/app/test/test.h
+++ b/app/test/test.h
@@ -44,52 +44,24 @@
/* Compare two buffers with offset (length and offset in bytes) */
#define TEST_ASSERT_BUFFERS_ARE_EQUAL_OFFSET(a, b, len, off, msg, ...) do { \
- const uint8_t *_a_with_off = (const uint8_t *)a + off; \
- const uint8_t *_b_with_off = (const uint8_t *)b + off; \
+ const uint8_t *_a_with_off = (const uint8_t *)(a) + (off); \
+ const uint8_t *_b_with_off = (const uint8_t *)(b) + (off); \
TEST_ASSERT_BUFFERS_ARE_EQUAL(_a_with_off, _b_with_off, len, msg); \
} while (0)
/* Compare two buffers (length in bits) */
-#define TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(a, b, len, msg, ...) do { \
- uint8_t _last_byte_a, _last_byte_b; \
- uint8_t _last_byte_mask, _last_byte_bits; \
- TEST_ASSERT_BUFFERS_ARE_EQUAL(a, b, (len >> 3), msg); \
- if (len % 8) { \
- _last_byte_bits = len % 8; \
- _last_byte_mask = ~((1 << (8 - _last_byte_bits)) - 1); \
- _last_byte_a = ((const uint8_t *)a)[len >> 3]; \
- _last_byte_b = ((const uint8_t *)b)[len >> 3]; \
- _last_byte_a &= _last_byte_mask; \
- _last_byte_b &= _last_byte_mask; \
- if (_last_byte_a != _last_byte_b) { \
- printf("TestCase %s() line %d failed: " \
- msg "\n", __func__, __LINE__, ##__VA_ARGS__);\
- TEST_TRACE_FAILURE(__FILE__, __LINE__, __func__); \
- return TEST_FAILED; \
- } \
- } \
-} while (0)
-
-/* Compare two buffers with offset (length and offset in bits) */
-#define TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(a, b, len, off, msg, ...) do { \
- uint8_t _first_byte_a, _first_byte_b; \
- uint8_t _first_byte_mask, _first_byte_bits; \
- uint32_t _len_without_first_byte = (off % 8) ? \
- len - (8 - (off % 8)) : \
- len; \
- uint32_t _off_in_bytes = (off % 8) ? (off >> 3) + 1 : (off >> 3); \
- const uint8_t *_a_with_off = (const uint8_t *)a + _off_in_bytes; \
- const uint8_t *_b_with_off = (const uint8_t *)b + _off_in_bytes; \
- TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(_a_with_off, _b_with_off, \
- _len_without_first_byte, msg); \
- if (off % 8) { \
- _first_byte_bits = 8 - (off % 8); \
- _first_byte_mask = (1 << _first_byte_bits) - 1; \
- _first_byte_a = *(_a_with_off - 1); \
- _first_byte_b = *(_b_with_off - 1); \
- _first_byte_a &= _first_byte_mask; \
- _first_byte_b &= _first_byte_mask; \
- if (_first_byte_a != _first_byte_b) { \
+#define TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(a, b, len, msg, ...) do { \
+ uint8_t _last_byte_a, _last_byte_b; \
+ uint8_t _last_byte_mask, _last_byte_bits; \
+ TEST_ASSERT_BUFFERS_ARE_EQUAL(a, b, ((len) >> 3), msg); \
+ if ((len) % 8) { \
+ _last_byte_bits = (len) % 8; \
+ _last_byte_mask = ~((1 << (8 - _last_byte_bits)) - 1); \
+ _last_byte_a = ((const uint8_t *)(a))[(len) >> 3]; \
+ _last_byte_b = ((const uint8_t *)(b))[(len) >> 3]; \
+ _last_byte_a &= _last_byte_mask; \
+ _last_byte_b &= _last_byte_mask; \
+ if (_last_byte_a != _last_byte_b) { \
printf("TestCase %s() line %d failed: " \
msg "\n", __func__, __LINE__, ##__VA_ARGS__); \
TEST_TRACE_FAILURE(__FILE__, __LINE__, __func__); \
@@ -98,6 +70,34 @@
} \
} while (0)
+/* Compare two buffers with offset (length and offset in bits) */
+#define TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT_OFFSET(a, b, len, off, msg, ...) do { \
+ uint8_t _first_byte_a, _first_byte_b; \
+ uint8_t _first_byte_mask, _first_byte_bits; \
+ uint32_t _len_without_first_byte = ((off) % 8) ? \
+ (len) - (8 - ((off) % 8)) : \
+ (len); \
+ uint32_t _off_in_bytes = ((off) % 8) ? ((off) >> 3) + 1 : ((off) >> 3); \
+ const uint8_t *_a_with_off = (const uint8_t *)(a) + _off_in_bytes; \
+ const uint8_t *_b_with_off = (const uint8_t *)(b) + _off_in_bytes; \
+ TEST_ASSERT_BUFFERS_ARE_EQUAL_BIT(_a_with_off, _b_with_off, \
+ _len_without_first_byte, msg); \
+ if ((off) % 8) { \
+ _first_byte_bits = 8 - ((off) % 8); \
+ _first_byte_mask = (1 << _first_byte_bits) - 1; \
+ _first_byte_a = *(_a_with_off - 1); \
+ _first_byte_b = *(_b_with_off - 1); \
+ _first_byte_a &= _first_byte_mask; \
+ _first_byte_b &= _first_byte_mask; \
+ if (_first_byte_a != _first_byte_b) { \
+ printf("TestCase %s() line %d failed: " \
+ msg "\n", __func__, __LINE__, ##__VA_ARGS__); \
+ TEST_TRACE_FAILURE(__FILE__, __LINE__, __func__); \
+ return TEST_FAILED; \
+ } \
+ } \
+} while (0)
+
#define TEST_ASSERT_NOT_EQUAL RTE_TEST_ASSERT_NOT_EQUAL
#define TEST_ASSERT_SUCCESS RTE_TEST_ASSERT_SUCCESS
@@ -198,7 +198,7 @@ void add_test_command(struct test_command *t);
#define REGISTER_TEST_COMMAND(cmd, func) \
static struct test_command test_struct_##cmd = { \
.command = RTE_STR(cmd), \
- .callback = func, \
+ .callback = (func), \
}; \
RTE_INIT(test_register_##cmd) \
{ \
diff --git a/lib/eal/include/rte_test.h b/lib/eal/include/rte_test.h
index 62c8f165af59..d132d3156b5a 100644
--- a/lib/eal/include/rte_test.h
+++ b/lib/eal/include/rte_test.h
@@ -26,21 +26,21 @@
} while (0)
#define RTE_TEST_ASSERT_EQUAL(a, b, msg, ...) \
- RTE_TEST_ASSERT(a == b, msg, ##__VA_ARGS__)
+ RTE_TEST_ASSERT((a) == (b), msg, ##__VA_ARGS__)
#define RTE_TEST_ASSERT_NOT_EQUAL(a, b, msg, ...) \
- RTE_TEST_ASSERT(a != b, msg, ##__VA_ARGS__)
+ RTE_TEST_ASSERT((a) != (b), msg, ##__VA_ARGS__)
#define RTE_TEST_ASSERT_SUCCESS(val, msg, ...) \
- RTE_TEST_ASSERT(val == 0, msg, ##__VA_ARGS__)
+ RTE_TEST_ASSERT((val) == 0, msg, ##__VA_ARGS__)
#define RTE_TEST_ASSERT_FAIL(val, msg, ...) \
- RTE_TEST_ASSERT(val != 0, msg, ##__VA_ARGS__)
+ RTE_TEST_ASSERT((val) != 0, msg, ##__VA_ARGS__)
#define RTE_TEST_ASSERT_NULL(val, msg, ...) \
- RTE_TEST_ASSERT(val == NULL, msg, ##__VA_ARGS__)
+ RTE_TEST_ASSERT((val) == NULL, msg, ##__VA_ARGS__)
#define RTE_TEST_ASSERT_NOT_NULL(val, msg, ...) \
- RTE_TEST_ASSERT(val != NULL, msg, ##__VA_ARGS__)
+ RTE_TEST_ASSERT((val) != NULL, msg, ##__VA_ARGS__)
#endif /* _RTE_TEST_H_ */
--
2.43.0
More information about the dev
mailing list