Module Name: src Committed By: rillig Date: Mon Aug 3 15:43:32 UTC 2020
Modified Files: src/distrib/sets/lists/tests: mi src/usr.bin/make: var.c src/usr.bin/make/unit-tests: Makefile modmisc.mk Added Files: src/usr.bin/make/unit-tests: lint.exp lint.mk Log Message: make(1): in lint mode, disallow dynamic variable names in :@ modifier This is an extremely obscure feature that hopefully nobody ever considered using. To generate a diff of this commit: cvs rdiff -u -r1.883 -r1.884 src/distrib/sets/lists/tests/mi cvs rdiff -u -r1.409 -r1.410 src/usr.bin/make/var.c cvs rdiff -u -r1.82 -r1.83 src/usr.bin/make/unit-tests/Makefile cvs rdiff -u -r0 -r1.1 src/usr.bin/make/unit-tests/lint.exp \ src/usr.bin/make/unit-tests/lint.mk cvs rdiff -u -r1.32 -r1.33 src/usr.bin/make/unit-tests/modmisc.mk 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.883 src/distrib/sets/lists/tests/mi:1.884 --- src/distrib/sets/lists/tests/mi:1.883 Sun Aug 2 14:53:01 2020 +++ src/distrib/sets/lists/tests/mi Mon Aug 3 15:43:31 2020 @@ -1,4 +1,4 @@ -# $NetBSD: mi,v 1.883 2020/08/02 14:53:01 rillig Exp $ +# $NetBSD: mi,v 1.884 2020/08/03 15:43:31 rillig Exp $ # # Note: don't delete entries from here - mark them as "obsolete" instead. # @@ -4572,6 +4572,8 @@ ./usr/tests/usr.bin/make/unit-tests/include-main.mk tests-usr.bin-tests compattestfile,atf ./usr/tests/usr.bin/make/unit-tests/include-sub.mk tests-usr.bin-tests compattestfile,atf ./usr/tests/usr.bin/make/unit-tests/include-subsub.mk tests-usr.bin-tests compattestfile,atf +./usr/tests/usr.bin/make/unit-tests/lint.exp tests-usr.bin-tests compattestfile,atf +./usr/tests/usr.bin/make/unit-tests/lint.mk tests-usr.bin-tests compattestfile,atf ./usr/tests/usr.bin/make/unit-tests/misc.exp tests-usr.bin-tests compattestfile,atf ./usr/tests/usr.bin/make/unit-tests/misc.mk tests-usr.bin-tests compattestfile,atf ./usr/tests/usr.bin/make/unit-tests/moderrs.exp tests-usr.bin-tests compattestfile,atf Index: src/usr.bin/make/var.c diff -u src/usr.bin/make/var.c:1.409 src/usr.bin/make/var.c:1.410 --- src/usr.bin/make/var.c:1.409 Mon Aug 3 15:08:00 2020 +++ src/usr.bin/make/var.c Mon Aug 3 15:43:32 2020 @@ -1,4 +1,4 @@ -/* $NetBSD: var.c,v 1.409 2020/08/03 15:08:00 rillig Exp $ */ +/* $NetBSD: var.c,v 1.410 2020/08/03 15:43:32 rillig Exp $ */ /* * Copyright (c) 1988, 1989, 1990, 1993 @@ -69,14 +69,14 @@ */ #ifndef MAKE_NATIVE -static char rcsid[] = "$NetBSD: var.c,v 1.409 2020/08/03 15:08:00 rillig Exp $"; +static char rcsid[] = "$NetBSD: var.c,v 1.410 2020/08/03 15:43:32 rillig Exp $"; #else #include <sys/cdefs.h> #ifndef lint #if 0 static char sccsid[] = "@(#)var.c 8.3 (Berkeley) 3/19/94"; #else -__RCSID("$NetBSD: var.c,v 1.409 2020/08/03 15:08:00 rillig Exp $"); +__RCSID("$NetBSD: var.c,v 1.410 2020/08/03 15:43:32 rillig Exp $"); #endif #endif /* not lint */ #endif @@ -1934,6 +1934,13 @@ ApplyModifier_Loop(const char **pp, Appl st->missing_delim = delim; return AMR_CLEANUP; } + if (DEBUG(LINT) && strchr(args.tvar, '$') != NULL) { + Parse_Error(PARSE_FATAL, + "In the :@ modifier of \"%s\", the variable name \"%s\" " + "must not contain a dollar.", + st->v->name, args.tvar); + return AMR_CLEANUP; + } args.str = ParseModifierPart(pp, delim, st->eflags & ~VARE_WANTRES, st->ctxt, NULL, NULL, NULL); Index: src/usr.bin/make/unit-tests/Makefile diff -u src/usr.bin/make/unit-tests/Makefile:1.82 src/usr.bin/make/unit-tests/Makefile:1.83 --- src/usr.bin/make/unit-tests/Makefile:1.82 Sun Aug 2 22:43:14 2020 +++ src/usr.bin/make/unit-tests/Makefile Mon Aug 3 15:43:32 2020 @@ -1,4 +1,4 @@ -# $NetBSD: Makefile,v 1.82 2020/08/02 22:43:14 rillig Exp $ +# $NetBSD: Makefile,v 1.83 2020/08/03 15:43:32 rillig Exp $ # # Unit tests for make(1) # @@ -57,6 +57,7 @@ TESTS+= forsubst TESTS+= hash TESTS+= # impsrc # broken by reverting POSIX changes TESTS+= include-main +TESTS+= lint TESTS+= misc TESTS+= moderrs TESTS+= modmatch @@ -88,6 +89,7 @@ TESTS+= varshell ENV.counter= -i ENV.envfirst= FROM_ENV=value-from-env ENV.export= -i PATH=${PATH:Q} +ENV.lint= -i ENV.varmisc= FROM_ENV=env ENV.varmisc+= FROM_ENV_BEFORE=env ENV.varmisc+= FROM_ENV_AFTER=env @@ -97,6 +99,7 @@ FLAGS.counter= -r -dv FLAGS.doterror= # none FLAGS.envfirst= -e FLAGS.export= -r +FLAGS.lint= -dL -k FLAGS.order= -j1 FLAGS.vardebug= -k -dv FROM_CMDLINE= Index: src/usr.bin/make/unit-tests/modmisc.mk diff -u src/usr.bin/make/unit-tests/modmisc.mk:1.32 src/usr.bin/make/unit-tests/modmisc.mk:1.33 --- src/usr.bin/make/unit-tests/modmisc.mk:1.32 Sat Aug 1 17:26:41 2020 +++ src/usr.bin/make/unit-tests/modmisc.mk Mon Aug 3 15:43:32 2020 @@ -1,4 +1,4 @@ -# $Id: modmisc.mk,v 1.32 2020/08/01 17:26:41 rillig Exp $ +# $Id: modmisc.mk,v 1.33 2020/08/03 15:43:32 rillig Exp $ # # miscellaneous modifier tests @@ -161,6 +161,7 @@ mod-regex: # In the :@ modifier, the name of the loop variable can even be generated # dynamically. There's no practical use-case for this, and hopefully nobody # will ever depend on this, but technically it's possible. +# Therefore, in -dL mode, this is forbidden, see lint.mk. mod-loop-varname: @echo :${:Uone two three:@${:Ubar:S,b,v,}@+${var}+@:Q}: Added files: Index: src/usr.bin/make/unit-tests/lint.exp diff -u /dev/null src/usr.bin/make/unit-tests/lint.exp:1.1 --- /dev/null Mon Aug 3 15:43:32 2020 +++ src/usr.bin/make/unit-tests/lint.exp Mon Aug 3 15:43:32 2020 @@ -0,0 +1,4 @@ +make: In the :@ modifier of "VAR", the variable name "${:Ubar:S,b,v,}" must not contain a dollar. +y@:Q} +xvaluey +exit status 0 Index: src/usr.bin/make/unit-tests/lint.mk diff -u /dev/null src/usr.bin/make/unit-tests/lint.mk:1.1 --- /dev/null Mon Aug 3 15:43:32 2020 +++ src/usr.bin/make/unit-tests/lint.mk Mon Aug 3 15:43:32 2020 @@ -0,0 +1,17 @@ +# $NetBSD: lint.mk,v 1.1 2020/08/03 15:43:32 rillig Exp $ +# +# Demonstrates stricter checks that are only enabled in the lint mode, +# using the -dL option. + +# Ouch: as of 2020-08-03, make exits successfully even though the error +# message has been issued as PARSE_FATAL. + +# Ouch: as of 2020-08-03, the variable is malformed and parsing stops +# for a moment, but is continued after the wrongly-guessed end of the +# variable, which echoes "y@:Q}". + +all: mod-loop-varname + +mod-loop-varname: + @echo ${VAR:Uvalue:@${:Ubar:S,b,v,}@x${var}y@:Q} + @echo ${VAR:Uvalue:@!@x$!y@:Q} # surprisingly allowed