Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/usr.bin/xlint/lint1 lint: fix wrong 'falls off bottom' after...
details: https://anonhg.NetBSD.org/src/rev/392c1052870b
branches: trunk
changeset: 960564:392c1052870b
user: rillig <rillig%NetBSD.org@localhost>
date: Sun Mar 21 11:55:59 2021 +0000
description:
lint: fix wrong 'falls off bottom' after return in do-while
diffstat:
tests/usr.bin/xlint/lint1/msg_217.c | 7 +++++--
tests/usr.bin/xlint/lint1/msg_217.exp | 1 -
usr.bin/xlint/lint1/func.c | 13 ++++++-------
usr.bin/xlint/lint1/lint1.h | 11 ++++++++---
4 files changed, 19 insertions(+), 13 deletions(-)
diffs (95 lines):
diff -r 05419b0039f5 -r 392c1052870b tests/usr.bin/xlint/lint1/msg_217.c
--- a/tests/usr.bin/xlint/lint1/msg_217.c Sun Mar 21 11:48:04 2021 +0000
+++ b/tests/usr.bin/xlint/lint1/msg_217.c Sun Mar 21 11:55:59 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: msg_217.c,v 1.5 2021/03/21 11:48:04 rillig Exp $ */
+/* $NetBSD: msg_217.c,v 1.6 2021/03/21 11:55:59 rillig Exp $ */
# 3 "msg_217.c"
// Test for message: function %s falls off bottom without returning value [217]
@@ -23,6 +23,9 @@
* 'while 0' was unreachable. This has been fixed by allowing the 'while 0'
* in a do-while-false loop to be unreachable. The same could be useful for a
* do-while-true.
+ *
+ * Before func.c 1.83 from 2021-03-21, lint wrongly reported that the function
+ * would fall off the bottom.
*/
int
do_while_return(int i)
@@ -30,7 +33,7 @@
do {
return i;
} while (0);
-} /*FIXME*//* expect: 217 */
+}
/*
* C99 5.1.2.2.3 "Program termination" p1 defines that as a special exception,
diff -r 05419b0039f5 -r 392c1052870b tests/usr.bin/xlint/lint1/msg_217.exp
--- a/tests/usr.bin/xlint/lint1/msg_217.exp Sun Mar 21 11:48:04 2021 +0000
+++ b/tests/usr.bin/xlint/lint1/msg_217.exp Sun Mar 21 11:55:59 2021 +0000
@@ -1,2 +1,1 @@
msg_217.c(11): warning: function random falls off bottom without returning value [217]
-msg_217.c(33): warning: function do_while_return falls off bottom without returning value [217]
diff -r 05419b0039f5 -r 392c1052870b usr.bin/xlint/lint1/func.c
--- a/usr.bin/xlint/lint1/func.c Sun Mar 21 11:48:04 2021 +0000
+++ b/usr.bin/xlint/lint1/func.c Sun Mar 21 11:55:59 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: func.c,v 1.82 2021/03/21 11:38:24 rillig Exp $ */
+/* $NetBSD: func.c,v 1.83 2021/03/21 11:55:59 rillig Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID) && !defined(lint)
-__RCSID("$NetBSD: func.c,v 1.82 2021/03/21 11:38:24 rillig Exp $");
+__RCSID("$NetBSD: func.c,v 1.83 2021/03/21 11:55:59 rillig Exp $");
#endif
#include <stdlib.h>
@@ -830,11 +830,10 @@
expr(tn, false, true, true, true);
- /*
- * The end of the loop is only reached if it is no endless loop
- * or there was a break statement which could be reached.
- */
- reached = !cstmt->c_infinite || cstmt->c_break;
+ if (cstmt->c_infinite)
+ reached = false;
+ if (cstmt->c_break)
+ reached = true;
rchflg = false;
popctrl(T_DO);
diff -r 05419b0039f5 -r 392c1052870b usr.bin/xlint/lint1/lint1.h
--- a/usr.bin/xlint/lint1/lint1.h Sun Mar 21 11:48:04 2021 +0000
+++ b/usr.bin/xlint/lint1/lint1.h Sun Mar 21 11:55:59 2021 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: lint1.h,v 1.80 2021/03/21 10:30:28 rillig Exp $ */
+/* $NetBSD: lint1.h,v 1.81 2021/03/21 11:55:59 rillig Exp $ */
/*
* Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
@@ -386,10 +386,15 @@
bool c_loop : 1; /* continue && break are valid */
bool c_switch : 1; /* case && break are valid */
bool c_break : 1; /* loop/switch has break */
+ /* TODO: is the break guaranteed to be
+ * reachable? */
bool c_cont : 1; /* loop has continue */
bool c_default : 1; /* switch has default */
- bool c_infinite : 1; /* break condition always false
- (for (;;), while (1)) */
+ bool c_infinite : 1; /* controlling expression always false
+ * (as in for (;;) or while (1)),
+ * there may be break statements
+ * though.
+ * TODO: rename to c_maybe_infinite */
bool c_rchif : 1; /* end of if-branch reached */
bool c_had_return_noval : 1; /* had "return;" */
bool c_had_return_value : 1; /* had "return (e);" */
Home |
Main Index |
Thread Index |
Old Index