Module Name:    src
Committed By:   rillig
Date:           Sat Jul 15 09:53:46 UTC 2023

Modified Files:
        src/tests/usr.bin/xlint/lint1: d_lint_assert.c

Log Message:
tests/lint: document how to reliably crash lint1 after a parse error


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/tests/usr.bin/xlint/lint1/d_lint_assert.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_lint_assert.c
diff -u src/tests/usr.bin/xlint/lint1/d_lint_assert.c:1.8 src/tests/usr.bin/xlint/lint1/d_lint_assert.c:1.9
--- src/tests/usr.bin/xlint/lint1/d_lint_assert.c:1.8	Sat Jul 15 09:40:37 2023
+++ src/tests/usr.bin/xlint/lint1/d_lint_assert.c	Sat Jul 15 09:53:46 2023
@@ -1,4 +1,4 @@
-/*	$NetBSD: d_lint_assert.c,v 1.8 2023/07/15 09:40:37 rillig Exp $	*/
+/*	$NetBSD: d_lint_assert.c,v 1.9 2023/07/15 09:53:46 rillig Exp $	*/
 # 3 "d_lint_assert.c"
 
 /*
@@ -25,21 +25,21 @@ enum {
 c(void());
 
 
-// As of 2023-07-15, the following code leads to a crash, due to the word
-// 'unknown_type_modifier'.  The parser then goes into error recovery mode and
-// discards the declaration in the 'for' loop.  In the end, the symbol table
-// still contains symbols that were already freed when parsing the '}' from the
-// 'switch' statement.  To reproduce the crash, run 'make -DDEBUG DBG="-O0 -g"'
-// and run with -Sy.
-//
-// static inline void
-// f(void)
-// {
-//	int i = 3;
-//
-//	for (unknown_type_modifier char *p = "";; ) {
-//		switch (i) {
-//		case 3:;
-//		}
-//	}
-// }
+// As of 2023-07-15, replacing 'const' with 'unknown_type_modifier' leads to a
+// crash.  When the '}' from the 'switch' statement is processed, symbols that
+// are already freed are still in the symbol table.  To reproduce the crash,
+// run:
+//	make -s -DDEBUG DBG="-O0 -g"
+//	MALLOC_OPTIONS='JA' MALLOC_CONF='junk:true' ./lint1 -Sy \
+//	    ../../../tests/usr.bin/xlint/lint1/d_lint_assert.c
+ static inline void
+ f(void)
+ {
+	int i = 3;
+
+	for (const char *p = "";; ) {
+		switch (i) {
+		case 3:;
+		}
+	}
+ }

Reply via email to