Module Name: src
Committed By: rillig
Date: Tue Mar 30 16:07:07 UTC 2021
Modified Files:
src/tests/usr.bin/xlint/lint1: d_c99_init.c d_c99_init.exp
src/usr.bin/xlint/lint1: init.c
Log Message:
lint: add error about out-of-bounds array subscripts
This check is not strictly necessary since any C99 compiler must
diagnose them as well, it is rather meant for demonstrating how to do
the check in lint, and for symmetry with the 'unknown member' error
message. These provide insight into how the data structures in init.c
are meant to be accessed.
To generate a diff of this commit:
cvs rdiff -u -r1.26 -r1.27 src/tests/usr.bin/xlint/lint1/d_c99_init.c
cvs rdiff -u -r1.20 -r1.21 src/tests/usr.bin/xlint/lint1/d_c99_init.exp
cvs rdiff -u -r1.182 -r1.183 src/usr.bin/xlint/lint1/init.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/d_c99_init.c
diff -u src/tests/usr.bin/xlint/lint1/d_c99_init.c:1.26 src/tests/usr.bin/xlint/lint1/d_c99_init.c:1.27
--- src/tests/usr.bin/xlint/lint1/d_c99_init.c:1.26 Tue Mar 30 15:18:19 2021
+++ src/tests/usr.bin/xlint/lint1/d_c99_init.c Tue Mar 30 16:07:07 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: d_c99_init.c,v 1.26 2021/03/30 15:18:19 rillig Exp $ */
+/* $NetBSD: d_c99_init.c,v 1.27 2021/03/30 16:07:07 rillig Exp $ */
# 3 "d_c99_init.c"
/*
@@ -135,7 +135,7 @@ struct point point_with_designators = {
struct point point_with_mixed_designators = {
.x = 3,
4,
- /* TODO: remove me */
+
5, /* expect: too many struct/union initializers */
.x = 3,
};
@@ -211,15 +211,15 @@ struct geometry {
* structs.
*/
struct geometry geometry = {
- /* TODO: remove me */
+
.pentagons[0].points[4].x = 1,
.points[0][0][0] = { 0, 0 },
.points[2][4][1] = {301, 302 },
- /* TODO: expect+1: array index 3 must be between 0 and 2 */
+ /* expect+1: array subscript cannot be > 2: 3 */
.points[3][0][0] = {3001, 3002 },
- /* TODO: expect+1: array index 5 must be between 0 and 4 */
+ /* expect+1: array subscript cannot be > 4: 5 */
.points[0][5][0] = {501, 502 },
- /* TODO: expect+1: array index 2 must be between 0 and 1 */
+ /* expect+1: array subscript cannot be > 1: 2 */
.points[0][0][2] = {21, 22 },
};
Index: src/tests/usr.bin/xlint/lint1/d_c99_init.exp
diff -u src/tests/usr.bin/xlint/lint1/d_c99_init.exp:1.20 src/tests/usr.bin/xlint/lint1/d_c99_init.exp:1.21
--- src/tests/usr.bin/xlint/lint1/d_c99_init.exp:1.20 Tue Mar 30 15:18:19 2021
+++ src/tests/usr.bin/xlint/lint1/d_c99_init.exp Tue Mar 30 16:07:07 2021
@@ -3,6 +3,9 @@ d_c99_init.c(63): error: cannot initiali
d_c99_init.c(80): error: too many array initializers, expected 3 [173]
d_c99_init.c(139): error: too many struct/union initializers [172]
d_c99_init.c(145): error: syntax error 'designator '.member' is only for struct/union' [249]
+d_c99_init.c(219): error: array subscript cannot be > 2: 3 [168]
+d_c99_init.c(221): error: array subscript cannot be > 4: 5 [168]
+d_c99_init.c(223): error: array subscript cannot be > 1: 2 [168]
d_c99_init.c(232): error: too many struct/union initializers [172]
d_c99_init.c(238): warning: illegal combination of integer (char) and pointer (pointer to char) [183]
d_c99_init.c(242): warning: illegal combination of integer (char) and pointer (pointer to char) [183]
Index: src/usr.bin/xlint/lint1/init.c
diff -u src/usr.bin/xlint/lint1/init.c:1.182 src/usr.bin/xlint/lint1/init.c:1.183
--- src/usr.bin/xlint/lint1/init.c:1.182 Tue Mar 30 15:18:19 2021
+++ src/usr.bin/xlint/lint1/init.c Tue Mar 30 16:07:07 2021
@@ -1,4 +1,4 @@
-/* $NetBSD: init.c,v 1.182 2021/03/30 15:18:19 rillig Exp $ */
+/* $NetBSD: init.c,v 1.183 2021/03/30 16:07:07 rillig Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@@ -38,7 +38,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: init.c,v 1.182 2021/03/30 15:18:19 rillig Exp $");
+__RCSID("$NetBSD: init.c,v 1.183 2021/03/30 16:07:07 rillig Exp $");
#endif
#include <stdlib.h>
@@ -455,6 +455,11 @@ designator_look_up(const struct designat
error(249,
"designator '.member' is only for struct/union");
}
+ if (!tp->t_incomplete_array &&
+ dr->dr_subscript >= (size_t)tp->t_dim) {
+ /* array subscript cannot be > %d: %ld */
+ error(168, tp->t_dim - 1, (long)dr->dr_subscript);
+ }
return tp->t_subt;
default:
/* syntax error '%s' */