Module Name: src Committed By: rillig Date: Sun Apr 3 00:39:32 UTC 2022
Modified Files: src/tests/usr.bin/xlint/lint1: d_gcc_compound_statements1.c d_gcc_compound_statements1.exp src/usr.bin/xlint/lint1: tree.c Log Message: lint: fix crash after syntax error in GCC statement expression Since cgram.y 1.226 from 2021-05-03. To generate a diff of this commit: cvs rdiff -u -r1.7 -r1.8 \ src/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.c cvs rdiff -u -r1.3 -r1.4 \ src/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.exp cvs rdiff -u -r1.417 -r1.418 src/usr.bin/xlint/lint1/tree.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.7 src/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.c:1.8 --- src/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.c:1.7 Sat Jan 15 14:22:03 2022 +++ src/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.c Sun Apr 3 00:39:32 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: d_gcc_compound_statements1.c,v 1.7 2022/01/15 14:22:03 rillig Exp $ */ +/* $NetBSD: d_gcc_compound_statements1.c,v 1.8 2022/04/03 00:39:32 rillig Exp $ */ # 3 "d_gcc_compound_statements1.c" /* GCC compound statement with expression */ @@ -37,3 +37,16 @@ function(void) 0->e; }); } + +void +crash(void) +{ + /* + * Before tree.c 1.418 from 2022-04-03, lint dereferenced a null + * pointer in do_statement_expr. + */ + ({ + /* expect+1: error: syntax error ';' [249] */ + ; + }); +} 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.3 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.3 Sat Jan 15 14:22:03 2022 +++ src/tests/usr.bin/xlint/lint1/d_gcc_compound_statements1.exp Sun Apr 3 00:39:32 2022 @@ -1,3 +1,4 @@ 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] Index: src/usr.bin/xlint/lint1/tree.c diff -u src/usr.bin/xlint/lint1/tree.c:1.417 src/usr.bin/xlint/lint1/tree.c:1.418 --- src/usr.bin/xlint/lint1/tree.c:1.417 Sat Apr 2 22:38:45 2022 +++ src/usr.bin/xlint/lint1/tree.c Sun Apr 3 00:39:32 2022 @@ -1,4 +1,4 @@ -/* $NetBSD: tree.c,v 1.417 2022/04/02 22:38:45 rillig Exp $ */ +/* $NetBSD: tree.c,v 1.418 2022/04/03 00:39:32 rillig Exp $ */ /* * Copyright (c) 1994, 1995 Jochen Pohl @@ -37,7 +37,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) && !defined(lint) -__RCSID("$NetBSD: tree.c,v 1.417 2022/04/02 22:38:45 rillig Exp $"); +__RCSID("$NetBSD: tree.c,v 1.418 2022/04/03 00:39:32 rillig Exp $"); #endif #include <float.h> @@ -4546,18 +4546,21 @@ do_statement_expr(tnode_t *tn) { block_level--; mem_block_level--; - stmt_exprs->se_sym = mktempsym(block_dup_type(tn->tn_type)); + stmt_exprs->se_sym = tn != NULL + ? mktempsym(block_dup_type(tn->tn_type)) + : NULL; /* after a syntax error */ mem_block_level++; block_level++; /* ({ }) is a GCC extension */ gnuism(320); - } tnode_t * end_statement_expr(void) { stmt_expr *se = stmt_exprs; + if (se->se_sym == NULL) + return NULL; /* after a syntax error */ tnode_t *tn = build_name(se->se_sym, false); (void)expr_save_memory(); /* leak */ expr_restore_memory(se->se_mem);