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