[kbd] [PATCH] libkeymap: Avoid pointer arithmetic on `void *`
Michael Forney
mforney at mforney.org
Thu Jun 27 06:07:19 MSK 2019
ISO C requires that the pointer operand to the binary + operator be to
a complete object type[0]. Since we are working with byte sizes, use
`char *` instead.
[0] http://port70.net/~nsz/c/c11/n1570.html#6.5.6p2
Signed-off-by: Michael Forney <mforney at mforney.org>
---
Another option with less casting is to change the type of the `array`
member of `struct lk_array` from `void *` to `char *`. Let me know
if you would prefer this approach:
https://github.com/michaelforney/kbd/commit/5554deb1df4263d5d6b782a484dbb78b1b3ad569
configure.ac | 1 +
src/libkeymap/array.c | 12 ++++++------
2 files changed, 7 insertions(+), 6 deletions(-)
diff --git a/configure.ac b/configure.ac
index f2389b2..991d95e 100644
--- a/configure.ac
+++ b/configure.ac
@@ -88,6 +88,7 @@ CC_CHECK_CFLAGS_APPEND([\
-Wmissing-format-attribute \
-Wmissing-noreturn \
-Wmissing-prototypes \
+ -Wpointer-arith \
-Wredundant-decls \
-Wshadow \
-Wstrict-prototypes \
diff --git a/src/libkeymap/array.c b/src/libkeymap/array.c
index 0583c13..b2fb6b6 100644
--- a/src/libkeymap/array.c
+++ b/src/libkeymap/array.c
@@ -67,7 +67,7 @@ lk_array_exists(struct lk_array *a, ssize_t i)
return 0;
}
- s = (char *)(a->array + (a->memb * i));
+ s = (char *) a->array + (a->memb * i);
for (k = 0; k < a->memb; k++) {
if (s[k] != 0)
@@ -84,7 +84,7 @@ lk_array_get(struct lk_array *a, ssize_t i)
errno = EINVAL;
return NULL;
}
- return a->array + (a->memb * i);
+ return (char *) a->array + (a->memb * i);
}
void *
@@ -114,7 +114,7 @@ array_resize(struct lk_array *a, ssize_t i)
return -ENOMEM;
}
- memset(tmp + (a->memb * a->total), 0, (size_t) (a->memb * (i + 1 - a->total)));
+ memset((char *) tmp + (a->memb * a->total), 0, (size_t) (a->memb * (i + 1 - a->total)));
a->array = tmp;
a->total = i + 1;
@@ -130,7 +130,7 @@ lk_array_set(struct lk_array *a, ssize_t i, const void *e)
if (ret < 0)
return ret;
- memcpy(a->array + (a->memb * i), e, (size_t) a->memb);
+ memcpy((char *) a->array + (a->memb * i), e, (size_t) a->memb);
a->count++;
return 0;
@@ -145,7 +145,7 @@ lk_array_unset(struct lk_array *a, ssize_t i)
}
if (lk_array_exists(a, i)) {
- memset(a->array + (a->memb * i), 0, (size_t) a->memb);
+ memset((char *) a->array + (a->memb * i), 0, (size_t) a->memb);
a->count--;
}
@@ -160,7 +160,7 @@ lk_array_append(struct lk_array *a, const void *e)
if (ret < 0)
return ret;
- memcpy(a->array + (a->memb * a->count), e, (size_t) a->memb);
+ memcpy((char *) a->array + (a->memb * a->count), e, (size_t) a->memb);
a->count++;
return 0;
--
2.20.1
More information about the kbd
mailing list