Module Name: src Committed By: rillig Date: Tue Feb 21 19:47:21 UTC 2023
Modified Files: src/tests/usr.bin/xlint/lint1: msg_193.c src/usr.bin/xlint/lint1: func.c Log Message: lint: fix null pointer dereference in invalid case expression To generate a diff of this commit: cvs rdiff -u -r1.19 -r1.20 src/tests/usr.bin/xlint/lint1/msg_193.c cvs rdiff -u -r1.148 -r1.149 src/usr.bin/xlint/lint1/func.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/msg_193.c diff -u src/tests/usr.bin/xlint/lint1/msg_193.c:1.19 src/tests/usr.bin/xlint/lint1/msg_193.c:1.20 --- src/tests/usr.bin/xlint/lint1/msg_193.c:1.19 Fri Jun 17 18:54:53 2022 +++ src/tests/usr.bin/xlint/lint1/msg_193.c Tue Feb 21 19:47:21 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: msg_193.c,v 1.19 2022/06/17 18:54:53 rillig Exp $ */ +/* $NetBSD: msg_193.c,v 1.20 2023/02/21 19:47:21 rillig Exp $ */ # 3 "msg_193.c" // Test for message: statement not reached [193] @@ -704,3 +704,17 @@ test_null_statement(void) /* expect+1: warning: statement not reached [193] */ return 0;; } + +/* + * Before func.c 1.149 from 2023-02-21, lint crashed due to a null pointer + * dereference. + */ +void +invalid_case_expression(void) +{ + switch (4) { + /* expect+1: error: operand of '~' has invalid type 'double' [108] */ + case ~0.0: + ; + } +} Index: src/usr.bin/xlint/lint1/func.c diff -u src/usr.bin/xlint/lint1/func.c:1.148 src/usr.bin/xlint/lint1/func.c:1.149 --- src/usr.bin/xlint/lint1/func.c:1.148 Sat Feb 18 15:18:49 2023 +++ src/usr.bin/xlint/lint1/func.c Tue Feb 21 19:47:21 2023 @@ -1,4 +1,4 @@ -/* $NetBSD: func.c,v 1.148 2023/02/18 15:18:49 rillig Exp $ */ +/* $NetBSD: func.c,v 1.149 2023/02/21 19:47:21 rillig Exp $ */ /* * Copyright (c) 1994, 1995 Jochen Pohl @@ -37,7 +37,7 @@ #include <sys/cdefs.h> #if defined(__RCSID) -__RCSID("$NetBSD: func.c,v 1.148 2023/02/18 15:18:49 rillig Exp $"); +__RCSID("$NetBSD: func.c,v 1.149 2023/02/21 19:47:21 rillig Exp $"); #endif #include <stdlib.h> @@ -441,6 +441,7 @@ named_label(sym_t *sym) mark_as_set(sym); } + /* XXX: Assuming that each label is reachable is wrong. */ set_reached(true); } @@ -495,13 +496,16 @@ check_case_label(tnode_t *tn, control_st return; } - if (tn != NULL && tn->tn_op != CON) { + if (tn == NULL) + return; + + if (tn->tn_op != CON) { /* non-constant case expression */ error(197); return; } - if (tn != NULL && !is_integer(tn->tn_type->t_tspec)) { + if (!is_integer(tn->tn_type->t_tspec)) { /* non-integral case expression */ error(198); return;