Module Name: src
Committed By: rillig
Date: Tue May 31 00:01:35 UTC 2022
Modified Files:
src/usr.bin/xlint/lint1: err.c
Log Message:
lint: prevent assertion failure after parse error from grammar
Instead of running into an assertion failure, the malformed input
'f=({;};}' now generates:
malformed.c(1): error: syntax error ';' [249]
malformed.c(1): warning: ({ }) is a GCC extension [320]
malformed.c(1): warning: ({ }) is a GCC extension [320]
malformed.c(1): error: cannot recover from previous errors [224]
To generate a diff of this commit:
cvs rdiff -u -r1.166 -r1.167 src/usr.bin/xlint/lint1/err.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/usr.bin/xlint/lint1/err.c
diff -u src/usr.bin/xlint/lint1/err.c:1.166 src/usr.bin/xlint/lint1/err.c:1.167
--- src/usr.bin/xlint/lint1/err.c:1.166 Fri May 20 21:18:55 2022
+++ src/usr.bin/xlint/lint1/err.c Tue May 31 00:01:35 2022
@@ -1,4 +1,4 @@
-/* $NetBSD: err.c,v 1.166 2022/05/20 21:18:55 rillig Exp $ */
+/* $NetBSD: err.c,v 1.167 2022/05/31 00:01:35 rillig Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID)
-__RCSID("$NetBSD: err.c,v 1.166 2022/05/20 21:18:55 rillig Exp $");
+__RCSID("$NetBSD: err.c,v 1.167 2022/05/31 00:01:35 rillig Exp $");
#endif
#include <sys/types.h>
@@ -591,6 +591,19 @@ assert_failed(const char *file, int line
{
const char *fn;
+ /*
+ * After encountering a parse error in the grammar, lint often does
+ * not properly clean up its data structures, especially in 'dcs',
+ * the stack of declaration levels. This often leads to assertion
+ * failures. These cases are not interesting though, as the purpose
+ * of lint is to check syntactically valid code. In such a case,
+ * exit gracefully. This allows a fuzzer like afl to focus on more
+ * interesting cases instead of reporting nonsense translation units
+ * like 'f=({e:;}' or 'v(const(char););e(v){'.
+ */
+ if (sytxerr > 0)
+ norecover();
+
fn = lbasename(curr_pos.p_file);
(void)fflush(stdout);
(void)fprintf(stderr,