Module Name: src
Committed By: rillig
Date: Wed Jul 10 20:33:38 UTC 2024
Modified Files:
src/distrib/sets/lists/tests: mi
src/tests/usr.bin/xlint/lint1: t_usage.sh
src/usr.bin/xlint/lint1: err.c tree.c
Added Files:
src/tests/usr.bin/xlint/lint1: msg_382.c
Log Message:
lint: add warning for '!(var = constant)'
This catches expressions like 'ATF_CHECK(errno = ENOENT)', which was
intended to use '==' instead of '='.
To generate a diff of this commit:
cvs rdiff -u -r1.1327 -r1.1328 src/distrib/sets/lists/tests/mi
cvs rdiff -u -r0 -r1.1 src/tests/usr.bin/xlint/lint1/msg_382.c
cvs rdiff -u -r1.22 -r1.23 src/tests/usr.bin/xlint/lint1/t_usage.sh
cvs rdiff -u -r1.246 -r1.247 src/usr.bin/xlint/lint1/err.c
cvs rdiff -u -r1.648 -r1.649 src/usr.bin/xlint/lint1/tree.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/distrib/sets/lists/tests/mi
diff -u src/distrib/sets/lists/tests/mi:1.1327 src/distrib/sets/lists/tests/mi:1.1328
--- src/distrib/sets/lists/tests/mi:1.1327 Wed Jul 10 20:29:32 2024
+++ src/distrib/sets/lists/tests/mi Wed Jul 10 20:33:37 2024
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.1327 2024/07/10 20:29:32 rillig Exp $
+# $NetBSD: mi,v 1.1328 2024/07/10 20:33:37 rillig Exp $
#
# Note: don't delete entries from here - mark them as "obsolete" instead.
#
@@ -7544,6 +7544,7 @@
./usr/tests/usr.bin/xlint/lint1/msg_379.c tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/xlint/lint1/msg_380.c tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/xlint/lint1/msg_381.c tests-usr.bin-tests compattestfile,atf
+./usr/tests/usr.bin/xlint/lint1/msg_382.c tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/xlint/lint1/op_colon.c tests-usr.bin-tests compattestfile,atf
./usr/tests/usr.bin/xlint/lint1/op_colon.exp tests-obsolete obsolete,atf
./usr/tests/usr.bin/xlint/lint1/op_shl_lp64.c tests-usr.bin-tests compattestfile,atf
Index: src/tests/usr.bin/xlint/lint1/t_usage.sh
diff -u src/tests/usr.bin/xlint/lint1/t_usage.sh:1.22 src/tests/usr.bin/xlint/lint1/t_usage.sh:1.23
--- src/tests/usr.bin/xlint/lint1/t_usage.sh:1.22 Sun Jun 9 10:27:39 2024
+++ src/tests/usr.bin/xlint/lint1/t_usage.sh Wed Jul 10 20:33:38 2024
@@ -1,4 +1,4 @@
-# $NetBSD: t_usage.sh,v 1.22 2024/06/09 10:27:39 rillig Exp $
+# $NetBSD: t_usage.sh,v 1.23 2024/07/10 20:33:38 rillig Exp $
#
# Copyright (c) 2023 The NetBSD Foundation, Inc.
# All rights reserved.
@@ -39,13 +39,13 @@ suppress_messages_body()
# The largest known message.
atf_check \
- "$lint1" -X 381 code.c /dev/null
+ "$lint1" -X 382 code.c /dev/null
# Larger than the largest known message.
atf_check \
-s 'exit:1' \
- -e "inline:lint1: invalid message ID '382'\n" \
- "$lint1" -X 382 code.c /dev/null
+ -e "inline:lint1: invalid message ID '383'\n" \
+ "$lint1" -X 383 code.c /dev/null
# Whitespace is not allowed before a message ID.
atf_check \
Index: src/usr.bin/xlint/lint1/err.c
diff -u src/usr.bin/xlint/lint1/err.c:1.246 src/usr.bin/xlint/lint1/err.c:1.247
--- src/usr.bin/xlint/lint1/err.c:1.246 Sun Jun 9 10:27:39 2024
+++ src/usr.bin/xlint/lint1/err.c Wed Jul 10 20:33:37 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: err.c,v 1.246 2024/06/09 10:27:39 rillig Exp $ */
+/* $NetBSD: err.c,v 1.247 2024/07/10 20:33:37 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.246 2024/06/09 10:27:39 rillig Exp $");
+__RCSID("$NetBSD: err.c,v 1.247 2024/07/10 20:33:37 rillig Exp $");
#endif
#include <limits.h>
@@ -437,6 +437,7 @@ static const char *const msgs[] = {
"comparing integer '%s' to floating point constant %Lg", // 379
"lossy conversion of %Lg to '%s', arg #%d", // 380
"lossy conversion of %Lg to '%s'", // 381
+ "constant assignment of type '%s' in operand of '!' always evaluates to '%s'", // 382
};
static bool is_suppressed[sizeof(msgs) / sizeof(msgs[0])];
Index: src/usr.bin/xlint/lint1/tree.c
diff -u src/usr.bin/xlint/lint1/tree.c:1.648 src/usr.bin/xlint/lint1/tree.c:1.649
--- src/usr.bin/xlint/lint1/tree.c:1.648 Mon Jun 17 17:06:47 2024
+++ src/usr.bin/xlint/lint1/tree.c Wed Jul 10 20:33:37 2024
@@ -1,4 +1,4 @@
-/* $NetBSD: tree.c,v 1.648 2024/06/17 17:06:47 rillig Exp $ */
+/* $NetBSD: tree.c,v 1.649 2024/07/10 20:33:37 rillig Exp $ */
/*
* Copyright (c) 1994, 1995 Jochen Pohl
@@ -37,7 +37,7 @@
#include <sys/cdefs.h>
#if defined(__RCSID)
-__RCSID("$NetBSD: tree.c,v 1.648 2024/06/17 17:06:47 rillig Exp $");
+__RCSID("$NetBSD: tree.c,v 1.649 2024/07/10 20:33:37 rillig Exp $");
#endif
#include <float.h>
@@ -1809,6 +1809,15 @@ build_binary(tnode_t *ln, op_t op, bool
case ARROW:
ntn = build_struct_access(op, sys, ln, rn);
break;
+ case NOT:
+ if (ln->tn_op == ASSIGN && ln->u.ops.right->tn_op == CON) {
+ /* constant assignment of type '%s' in operand ... */
+ warning(382, type_name(ln->tn_type),
+ is_nonzero_val(&ln->u.ops.right->u.value)
+ ? "true" : "false");
+ }
+ ntn = build_op(op, sys, gettyp(Tflag ? BOOL : INT), ln, NULL);
+ break;
case INCAFT:
case DECAFT:
case INCBEF:
Added files:
Index: src/tests/usr.bin/xlint/lint1/msg_382.c
diff -u /dev/null src/tests/usr.bin/xlint/lint1/msg_382.c:1.1
--- /dev/null Wed Jul 10 20:33:38 2024
+++ src/tests/usr.bin/xlint/lint1/msg_382.c Wed Jul 10 20:33:38 2024
@@ -0,0 +1,28 @@
+/* $NetBSD: msg_382.c,v 1.1 2024/07/10 20:33:38 rillig Exp $ */
+# 3 "msg_382.c"
+
+// Test for message: constant assignment of type '%s' in operand of '!' always evaluates to '%s' [382]
+
+/*
+ * Outside strict bool mode, an assignment can be used as a condition, but
+ * that is generally wrong. Especially if a constant is assigned to a
+ * variable, the condition always evaluates to that constant value, which
+ * indicates a typo, as '==' makes more sense than '=' in a condition.
+ */
+
+/* lint1-extra-flags: -X 351 */
+
+int
+/* expect+1: warning: parameter 'b' unused in function 'conversions' [231] */
+conversions(int a, int b)
+{
+ /* expect+1: warning: constant assignment of type 'int' in operand of '!' always evaluates to 'true' [382] */
+ if (!(a = 13))
+ return 1;
+ /* expect+1: warning: constant assignment of type 'int' in operand of '!' always evaluates to 'false' [382] */
+ if (!(b = 0))
+ return 2;
+ if (!(a = a + 1))
+ return 3;
+ return a;
+}