summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Hughes <tomhughes@chromium.org>2022-07-15 12:57:10 -0700
committerChromeos LUCI <chromeos-scoped@luci-project-accounts.iam.gserviceaccount.com>2022-07-16 00:13:20 +0000
commitc23d2848ac11829a22bb60533ffc5572de573262 (patch)
treec25fa5d6daf2ed3df3cc368e8632dc1d6d46181c
parentb680d4103a842eb1d92b0ba1a7f6a7362b3c9a6c (diff)
downloadchrome-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.c6
-rw-r--r--test/utils.c59
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();
}