Module Name: src
Committed By: rillig
Date: Mon May 30 08:51:08 UTC 2022
Modified Files:
src/tests/usr.bin/xlint/lint1: msg_168.c
Log Message:
tests/lint: explain how lint represents pointer addition
To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/tests/usr.bin/xlint/lint1/msg_168.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/tests/usr.bin/xlint/lint1/msg_168.c
diff -u src/tests/usr.bin/xlint/lint1/msg_168.c:1.7 src/tests/usr.bin/xlint/lint1/msg_168.c:1.8
--- src/tests/usr.bin/xlint/lint1/msg_168.c:1.7 Mon May 30 08:14:53 2022
+++ src/tests/usr.bin/xlint/lint1/msg_168.c Mon May 30 08:51:08 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_168.c,v 1.7 2022/05/30 08:14:53 rillig Exp $ */
+/* $NetBSD: msg_168.c,v 1.8 2022/05/30 08:51:08 rillig Exp $ */
# 3 "msg_168.c"
// Test for message: array subscript cannot be > %d: %ld [168]
@@ -42,6 +42,29 @@ array_with_c99_initializer(void)
}
+/*
+ * In its expression tree, lint represents pointer addition as 'ptr + off',
+ * where 'off' is the offset in bytes, regardless of the pointer type.
+ *
+ * In the below code, the member 'offset_8' has type 'short', and the
+ * expression 's->offset_8' is represented as '&s + 8', or more verbose:
+ *
+ * '+' type 'pointer to short'
+ * '&' type 'pointer to struct s'
+ * 'name' 's' with auto 'array[1] of struct s', lvalue
+ * 'constant' type 'long', value 8
+ *
+ * The constant 8 differs from the usual model of pointer arithmetics. Since
+ * the type of the '&' expression is 'pointer to struct s', adding a constant
+ * would rather be interpreted as adding 'constant * sizeof(struct s)', and
+ * to access a member, the pointer to 'struct s' would need to be converted
+ * to 'pointer of byte' first, then adding the offset 8, then converting the
+ * pointer to the target type 'pointer to short'.
+ *
+ * Lint uses the simpler representation, saving a few conversions on the way.
+ * Without this pre-multiplied representation, the below code would generate
+ * warnings about out-of-bounds array access, starting with offset_1.
+ */
struct s {
char offset_0;
char offset_1;