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' */

Reply via email to