Linux console tools development discussion
 help / color / mirror / Atom feed
* [kbd] [PATCH] libkeymap: Avoid pointer arithmetic on `void *`
@ 2019-06-27  3:07 Michael Forney
  2019-06-27  9:17 ` Alexey Gladkov
  0 siblings, 1 reply; 2+ messages in thread
From: Michael Forney @ 2019-06-27  3:07 UTC (permalink / raw)
  To: kbd

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@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



^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2019-06-27  9:17 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2019-06-27  3:07 [kbd] [PATCH] libkeymap: Avoid pointer arithmetic on `void *` Michael Forney
2019-06-27  9:17 ` Alexey Gladkov

Linux console tools development discussion

This inbox may be cloned and mirrored by anyone:

	git clone --mirror http://lore.altlinux.org/kbd/0 kbd/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 kbd kbd/ http://lore.altlinux.org/kbd \
		kbd@lists.altlinux.org kbd@lists.altlinux.ru kbd@lists.altlinux.com
	public-inbox-index kbd

Example config snippet for mirrors.
Newsgroup available over NNTP:
	nntp://lore.altlinux.org/org.altlinux.lists.kbd


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git