lint: improve initialization of arrays with designators

Initialization is still buggy but better than before.  The remaining bug
is that only the first designator determines the array size, and after
that, the array is no longer considered of unknown size.  This
contradicts C99.  More improvements to come.
This commit is contained in:
rillig 2021-03-25 22:15:38 +00:00
parent 35601c2713
commit 23e30dfb46
3 changed files with 23 additions and 6 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: msg_168.c,v 1.3 2021/03/07 16:40:20 rillig Exp $ */
/* $NetBSD: msg_168.c,v 1.4 2021/03/25 22:15:38 rillig Exp $ */
# 3 "msg_168.c"
// Test for message: array subscript cannot be > %d: %ld [168]
@ -9,7 +9,7 @@ void print_char(char);
void
example(void)
{
char buf[20] = {};
char buf[20] = {}; /* empty initializer is a GCC extension */
print_string(buf + 19); /* inside the array */

View File

@ -1,3 +1,3 @@
msg_168.c(28): warning: array subscript cannot be > 19: 20 [168]
msg_168.c(40): warning: array subscript cannot be > 2: 57 [168]
msg_168.c(41): warning: array subscript cannot be > 2: 58 [168]
msg_168.c(40): warning: array subscript cannot be > 51: 57 [168]
msg_168.c(41): warning: array subscript cannot be > 51: 58 [168]

View File

@ -1,4 +1,4 @@
/* $NetBSD: init.c,v 1.131 2021/03/25 21:51:55 rillig Exp $ */
/* $NetBSD: init.c,v 1.132 2021/03/25 22:15:38 rillig Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@ -37,7 +37,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID) && !defined(lint)
__RCSID("$NetBSD: init.c,v 1.131 2021/03/25 21:51:55 rillig Exp $");
__RCSID("$NetBSD: init.c,v 1.132 2021/03/25 22:15:38 rillig Exp $");
#endif
#include <stdlib.h>
@ -517,9 +517,21 @@ designation_add_name(sbuf_t *sb)
void
designation_add_subscript(range_t range)
{
initstack_element *istk;
debug_enter();
debug_step("subscript range is %zu ... %zu", range.lo, range.hi);
debug_initstack();
istk = initstk_lvalue;
if (istk->i_array_of_unknown_size) {
int auto_dim = (int)(range.hi + 1);
if (auto_dim > istk->i_type->t_dim) {
debug_step("setting the array size to %d", auto_dim);
istk->i_type->t_dim = auto_dim;
}
}
debug_leave();
}
@ -1280,6 +1292,11 @@ init_array_using_string(tnode_t *tn)
len = strg->st_len;
if (istk->i_array_of_unknown_size) {
/*
* FIXME: C99 6.7.8p22 explicitly says that only "at the end
* of its initializer list, the array no longer has incomplete
* type".
*/
istk->i_array_of_unknown_size = false;
istk->i_type->t_dim = len + 1;
setcomplete(istk->i_type, true);