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;

Reply via email to