[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