diff options
author | Tom Hughes <tomhughes@chromium.org> | 2022-07-15 12:57:10 -0700 |
---|---|---|
committer | Chromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com> | 2022-07-16 00:13:20 +0000 |
commit | c23d2848ac11829a22bb60533ffc5572de573262 (patch) | |
tree | c25fa5d6daf2ed3df3cc368e8632dc1d6d46181c | |
parent | b680d4103a842eb1d92b0ba1a7f6a7362b3c9a6c (diff) | |
download | chrome-ec-c23d2848ac11829a22bb60533ffc5572de573262.tar.gz |
common/util: Add casts
When compiling against the standard library, clang complains:
common/util.c:66:6: error: array subscript is of type 'char'
[-Werror,-Wchar-subscripts]
tolower(*s) == 'f' || tolower(*s) == 'n') {
^~~~~~~~~~~
According to POSIX:
The tolower() and tolower_l() functions have as a domain a type int, the
value of which is representable as an unsigned char or the value of EOF.
If the argument has any other value, the behavior is undefined.
https://pubs.opengroup.org/onlinepubs/9699919799/functions/tolower.html
BRANCH=none
BUG=b:234181908
TEST=make utils-str
Signed-off-by: Tom Hughes <tomhughes@chromium.org>
Change-Id: I84f4bfb647f29b24b1c3bd7f5d222275354c4698
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/3765458
Reviewed-by: Paul Fagerburg <pfagerburg@chromium.org>
-rw-r--r-- | common/util.c | 6 | ||||
-rw-r--r-- | test/utils.c | 59 |
2 files changed, 63 insertions, 2 deletions
diff --git a/common/util.c b/common/util.c index c911a83ce9..c89770f161 100644 --- a/common/util.c +++ b/common/util.c @@ -63,14 +63,16 @@ int parse_bool(const char *s, int *dest) { /* off, disable, false, no */ if (!strcasecmp(s, "off") || !strncasecmp(s, "dis", 3) || - tolower(*s) == 'f' || tolower(*s) == 'n') { + tolower((unsigned char)*s) == 'f' || + tolower((unsigned char)*s) == 'n') { *dest = 0; return 1; } /* on, enable, true, yes */ if (!strcasecmp(s, "on") || !strncasecmp(s, "ena", 3) || - tolower(*s) == 't' || tolower(*s) == 'y') { + tolower((unsigned char)*s) == 't' || + tolower((unsigned char)*s) == 'y') { *dest = 1; return 1; } diff --git a/test/utils.c b/test/utils.c index bc78ce8beb..042e3a1ac0 100644 --- a/test/utils.c +++ b/test/utils.c @@ -321,6 +321,64 @@ test_static int test_binary_first_base3_from_bits(void) return EC_SUCCESS; } +test_static int test_parse_bool(void) +{ + int bool_val; + int rv; + + /* False cases. */ + + bool_val = 1; + rv = parse_bool("off", &bool_val); + TEST_EQ(rv, 1, "%d"); + TEST_EQ(bool_val, 0, "%d"); + + bool_val = 1; + rv = parse_bool("dis", &bool_val); + TEST_EQ(rv, 1, "%d"); + TEST_EQ(bool_val, 0, "%d"); + + bool_val = 1; + rv = parse_bool("f", &bool_val); + TEST_EQ(rv, 1, "%d"); + TEST_EQ(bool_val, 0, "%d"); + + bool_val = 1; + rv = parse_bool("n", &bool_val); + TEST_EQ(rv, 1, "%d"); + TEST_EQ(bool_val, 0, "%d"); + + /* True cases. */ + + bool_val = 0; + rv = parse_bool("on", &bool_val); + TEST_EQ(rv, 1, "%d"); + TEST_EQ(bool_val, 1, "%d"); + + bool_val = 0; + rv = parse_bool("ena", &bool_val); + TEST_EQ(rv, 1, "%d"); + TEST_EQ(bool_val, 1, "%d"); + + bool_val = 0; + rv = parse_bool("t", &bool_val); + TEST_EQ(rv, 1, "%d"); + TEST_EQ(bool_val, 1, "%d"); + + bool_val = 0; + rv = parse_bool("y", &bool_val); + TEST_EQ(rv, 1, "%d"); + TEST_EQ(bool_val, 1, "%d"); + + /* Error case. */ + bool_val = -1; + rv = parse_bool("a", &bool_val); + TEST_EQ(rv, 0, "%d"); + TEST_EQ(bool_val, -1, "%d"); + + return EC_SUCCESS; +} + void run_test(int argc, char **argv) { test_reset(); @@ -339,6 +397,7 @@ void run_test(int argc, char **argv) RUN_TEST(test_safe_memcmp); RUN_TEST(test_alignment_log2); RUN_TEST(test_binary_first_base3_from_bits); + RUN_TEST(test_parse_bool); test_print_result(); } |