From 3d56acef7f73fd7a2e9f23b89340e0849283078d Mon Sep 17 00:00:00 2001 From: Yu Watanabe Date: Sat, 8 May 2021 14:56:31 +0900 Subject: [PATCH] string-util: explicitly cast character to unsigned This also adds comment why we cast to unsigned. Follow-up for 7971f9030ae4bebe0d4a6845ed31584f8ab18103. Addresses the comment https://github.com/systemd/systemd/pull/19544#discussion_r628472794. --- src/basic/string-util.h | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/basic/string-util.h b/src/basic/string-util.h index 3884777792c..4ef3254dc5d 100644 --- a/src/basic/string-util.h +++ b/src/basic/string-util.h @@ -130,7 +130,12 @@ static inline bool _pure_ in_charset(const char *s, const char* charset) { } static inline bool char_is_cc(char p) { - return (uint8_t) p < ' ' || p == 127; + /* char is unsigned on some architectures, e.g. aarch64. So, compiler may warn the condition + * p >= 0 is always true. See #19543. Hence, let's cast to unsigned before the comparison. Note + * that the cast in the right hand side is redundant, as according to the C standard, compilers + * automatically cast a signed value to unsigned when comparing with an unsigned variable. Just + * for safety and readability. */ + return (uint8_t) p < (uint8_t) ' ' || p == 127; } bool string_has_cc(const char *p, const char *ok) _pure_; -- 2.47.3