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;
+}

Reply via email to