Module Name: src Committed By: rillig Date: Tue May 31 00:35:18 UTC 2022
Modified Files: src/tests/usr.bin/xlint/lint1: d_gcc_compound_statements1.c d_gcc_compound_statements1.exp msg_249.c msg_249.exp src/usr.bin/xlint/lint1: decl.c Log Message: lint: fix null pointer dereference after syntax error Found by afl, starting with the malformed input '/**/f=({;/**/};}' that no longer crashes. This input led to 'f=({L:;}', which is at least a syntactically valid prefix of a translation unit, containing a GCC statement expression with an unused label. The error message for this unused label assumed that it would always be inside a function definition. While here, document incomplete recovery after syntax errors, in msg_249.c. To generate a diff of this commit: cvs rdiff -u -r1.9 -r1.10 \ src/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.c \ src/tests/usr.bin/xlint/lint1/msg_249.c cvs rdiff -u -r1.4 -r1.5 \ src/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.exp cvs rdiff -u -r1.7 -r1.8 src/tests/usr.bin/xlint/lint1/msg_249.exp cvs rdiff -u -r1.282 -r1.283 src/usr.bin/xlint/lint1/decl.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_gcc_compound_statements1.c diff -u src/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.c:1.9 src/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.c:1.10 --- src/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.c:1.9 Sun Apr 24 20:08:23 2022 +++ src/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.c Tue May 31 00:35:18 2022 @@ -1,8 +1,21 @@ -/* $NetBSD: d_gcc_compound_statements1.c,v 1.9 2022/04/24 20:08:23 rillig Exp $ */ +/* $NetBSD: d_gcc_compound_statements1.c,v 1.10 2022/05/31 00:35:18 rillig Exp $ */ # 3 "d_gcc_compound_statements1.c" /* GCC compound statement with expression */ +/* + * Compound statements are only allowed in functions, not at file scope. + * + * Before decl.c 1.283 from 2022-05-21, lint crashed with a segmentation + * fault due to the unused label. + */ +int invalid_gcc_statement_expression = ({ +unused_label: + 3; +/* expect+2: error: syntax error 'labels are only valid inside a function' [249] */ +/* expect+1: error: cannot initialize 'int' from 'void' [185] */ +}); + void foo(unsigned long z) { z = ({ Index: src/tests/usr.bin/xlint/lint1/msg_249.c diff -u src/tests/usr.bin/xlint/lint1/msg_249.c:1.9 src/tests/usr.bin/xlint/lint1/msg_249.c:1.10 --- src/tests/usr.bin/xlint/lint1/msg_249.c:1.9 Sat Jan 15 23:21:34 2022 +++ src/tests/usr.bin/xlint/lint1/msg_249.c Tue May 31 00:35:18 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: msg_249.c,v 1.9 2022/01/15 23:21:34 rillig Exp $ */ +/* $NetBSD: msg_249.c,v 1.10 2022/05/31 00:35:18 rillig Exp $ */ # 3 "msg_249.c" // Test for message: syntax error '%s' [249] @@ -58,3 +58,30 @@ struct cover_member_declaration { /* expect+1: error: syntax error 'member without type' [249] */ const; }; + +/* + * At this point, lint assumes that the following code is still in the + * function 'access_declaration_after_syntax_error'. + */ + +int gcc_statement_expression_1 = ({ +/* expect+1: warning: label 'unused_label' unused in function 'access_declaration_after_syntax_error' [232] */ +unused_label: + 1; + 1; +}); +/* expect-1: error: non-constant initializer [177] */ + +/* Even another function definition does not help. */ +void +try_to_recover(void) +{ +} + +int gcc_statement_expression_2 = ({ +/* expect+1: warning: label 'unused_label' unused in function 'try_to_recover' [232] */ +unused_label: + 1; + 1; +}); +/* expect-1: error: non-constant initializer [177] */ Index: src/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.exp diff -u src/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.exp:1.4 src/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.exp:1.5 --- src/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.exp:1.4 Sun Apr 3 00:39:32 2022 +++ src/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.exp Tue May 31 00:35:18 2022 @@ -1,4 +1,6 @@ -d_gcc_compound_statements1.c(24): error: syntax error 'return outside function' [249] -d_gcc_compound_statements1.c(25): error: cannot initialize 'int' from 'void' [185] -d_gcc_compound_statements1.c(37): error: type 'int' does not have member 'e' [101] -d_gcc_compound_statements1.c(50): error: syntax error ';' [249] +d_gcc_compound_statements1.c(17): error: syntax error 'labels are only valid inside a function' [249] +d_gcc_compound_statements1.c(17): error: cannot initialize 'int' from 'void' [185] +d_gcc_compound_statements1.c(37): error: syntax error 'return outside function' [249] +d_gcc_compound_statements1.c(38): error: cannot initialize 'int' from 'void' [185] +d_gcc_compound_statements1.c(50): error: type 'int' does not have member 'e' [101] +d_gcc_compound_statements1.c(63): error: syntax error ';' [249] Index: src/tests/usr.bin/xlint/lint1/msg_249.exp diff -u src/tests/usr.bin/xlint/lint1/msg_249.exp:1.7 src/tests/usr.bin/xlint/lint1/msg_249.exp:1.8 --- src/tests/usr.bin/xlint/lint1/msg_249.exp:1.7 Sat Jan 15 23:21:34 2022 +++ src/tests/usr.bin/xlint/lint1/msg_249.exp Tue May 31 00:35:18 2022 @@ -3,3 +3,7 @@ msg_249.c(19): error: syntax error '"' [ msg_249.c(33): warning: statement not reached [193] msg_249.c(34): error: syntax error ')' [249] msg_249.c(59): error: syntax error 'member without type' [249] +msg_249.c(69): warning: label 'unused_label' unused in function 'access_declaration_after_syntax_error' [232] +msg_249.c(72): error: non-constant initializer [177] +msg_249.c(83): warning: label 'unused_label' unused in function 'try_to_recover' [232] +msg_249.c(86): error: non-constant initializer [177] Index: src/usr.bin/xlint/lint1/decl.c diff -u src/usr.bin/xlint/lint1/decl.c:1.282 src/usr.bin/xlint/lint1/decl.c:1.283 --- src/usr.bin/xlint/lint1/decl.c:1.282 Thu May 26 13:40:49 2022 +++ src/usr.bin/xlint/lint1/decl.c Tue May 31 00:35:18 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: decl.c,v 1.282 2022/05/26 13:40:49 rillig Exp $ */ +/* $NetBSD: decl.c,v 1.283 2022/05/31 00:35:18 rillig Exp $ */ /* * Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved. @@ -38,7 +38,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: decl.c,v 1.282 2022/05/26 13:40:49 rillig Exp $"); +__RCSID("$NetBSD: decl.c,v 1.283 2022/05/31 00:35:18 rillig Exp $"); #endif #include <sys/param.h> @@ -3174,7 +3174,10 @@ check_label_usage(sym_t *lab) lint_assert(block_level == 1); lint_assert(lab->s_block_level == 1); - if (lab->s_set && !lab->s_used) { + if (funcsym == NULL) { + /* syntax error '%s' */ + error(249, "labels are only valid inside a function"); + } else if (lab->s_set && !lab->s_used) { /* label '%s' unused in function '%s' */ warning_at(232, &lab->s_set_pos, lab->s_name, funcsym->s_name); } else if (!lab->s_set) {