1
0
mirror of https://github.com/systemd/systemd synced 2026-03-24 15:55:00 +01:00

Compare commits

..

4 Commits

Author SHA1 Message Date
Yu Watanabe
c7cfde640d
Merge pull request #20346 from poettering/strlen-unsigned-fix
CONST_MAX() integer size fix
2021-08-03 11:03:29 +09:00
Lennart Poettering
d844529dc7 macro: change DECIMAL_STR_WIDTH() return type to size_t, like strlen() and so on 2021-07-30 15:59:29 +02:00
Lennart Poettering
777003365a macro: sizeof() returns size_t, and that's good
Now that CONST_MAX() is a bit more foregiving, let's stick to the native
return type of sizeof() everywhere, which is size_t, instead of casting
to "unsigned", so that on the common archs we don't unnecessarily lose
the upper 32bits.

This semi-reverts d3e40294572512810c9329933a488619e7ce22fd.
2021-07-30 15:58:09 +02:00
Lennart Poettering
addae96a1a macro: relax CONST_MAX() type check a tiny bit
This checked for strict type compatibility so far, which mean CONST_MAX()
couldn't be used on two differently signed integers, even though
conceptually there's nothing wrong with allowing that here, as C
correctly picks the larger type in the ternary op.

hence, let's explicitly whitelist integer comparisons here, as long as
the signedness matches.
2021-07-30 15:56:56 +02:00
2 changed files with 22 additions and 5 deletions

View File

@ -214,7 +214,7 @@ static inline size_t GREEDY_ALLOC_ROUND_UP(size_t l) {
* Contrary to strlen(), this is a constant expression. * Contrary to strlen(), this is a constant expression.
* @x: a string literal. * @x: a string literal.
*/ */
#define STRLEN(x) ((unsigned) sizeof(""x"") - 1) #define STRLEN(x) (sizeof(""x"") - 1U)
/* /*
* container_of - cast a member of a structure out to the containing structure * container_of - cast a member of a structure out to the containing structure
@ -345,12 +345,12 @@ static inline int __coverity_check_and_return__(int condition) {
(2U+(sizeof(type) <= 1 ? 3U : \ (2U+(sizeof(type) <= 1 ? 3U : \
sizeof(type) <= 2 ? 5U : \ sizeof(type) <= 2 ? 5U : \
sizeof(type) <= 4 ? 10U : \ sizeof(type) <= 4 ? 10U : \
sizeof(type) <= 8 ? 20U : (unsigned) sizeof(int[-2*(sizeof(type) > 8)]))) sizeof(type) <= 8 ? 20U : sizeof(int[-2*(sizeof(type) > 8)])))
#define DECIMAL_STR_WIDTH(x) \ #define DECIMAL_STR_WIDTH(x) \
({ \ ({ \
typeof(x) _x_ = (x); \ typeof(x) _x_ = (x); \
unsigned ans = 1; \ size_t ans = 1; \
while ((_x_ /= 10) != 0) \ while ((_x_ /= 10) != 0) \
ans++; \ ans++; \
ans; \ ans; \

View File

@ -70,12 +70,29 @@
UNIQ_T(A, aq) > UNIQ_T(B, bq) ? UNIQ_T(A, aq) : UNIQ_T(B, bq); \ UNIQ_T(A, aq) > UNIQ_T(B, bq) ? UNIQ_T(A, aq) : UNIQ_T(B, bq); \
}) })
/* evaluates to (void) if _A or _B are not constant or of different types */ #define IS_UNSIGNED_INTEGER_TYPE(type) \
(__builtin_types_compatible_p(typeof(type), unsigned char) || \
__builtin_types_compatible_p(typeof(type), unsigned short) || \
__builtin_types_compatible_p(typeof(type), unsigned) || \
__builtin_types_compatible_p(typeof(type), unsigned long) || \
__builtin_types_compatible_p(typeof(type), unsigned long long))
#define IS_SIGNED_INTEGER_TYPE(type) \
(__builtin_types_compatible_p(typeof(type), signed char) || \
__builtin_types_compatible_p(typeof(type), signed short) || \
__builtin_types_compatible_p(typeof(type), signed) || \
__builtin_types_compatible_p(typeof(type), signed long) || \
__builtin_types_compatible_p(typeof(type), signed long long))
/* Evaluates to (void) if _A or _B are not constant or of different types (being integers of different sizes
* is also OK as long as the signedness matches) */
#define CONST_MAX(_A, _B) \ #define CONST_MAX(_A, _B) \
(__builtin_choose_expr( \ (__builtin_choose_expr( \
__builtin_constant_p(_A) && \ __builtin_constant_p(_A) && \
__builtin_constant_p(_B) && \ __builtin_constant_p(_B) && \
__builtin_types_compatible_p(typeof(_A), typeof(_B)), \ (__builtin_types_compatible_p(typeof(_A), typeof(_B)) || \
(IS_UNSIGNED_INTEGER_TYPE(_A) && IS_UNSIGNED_INTEGER_TYPE(_B)) || \
(IS_SIGNED_INTEGER_TYPE(_A) && IS_SIGNED_INTEGER_TYPE(_B))), \
((_A) > (_B)) ? (_A) : (_B), \ ((_A) > (_B)) ? (_A) : (_B), \
VOID_0)) VOID_0))