From dca12caf9b6536788f28376d1d5e26ed32ec7287 Mon Sep 17 00:00:00 2001 From: rillig Date: Sun, 1 Nov 2020 13:10:22 +0000 Subject: [PATCH] make(1): add more tests for the variable modifier :range, edge cases --- usr.bin/make/unit-tests/varmod-range.exp | 15 ++++-- usr.bin/make/unit-tests/varmod-range.mk | 63 ++++++++++++++++++++++-- 2 files changed, 68 insertions(+), 10 deletions(-) diff --git a/usr.bin/make/unit-tests/varmod-range.exp b/usr.bin/make/unit-tests/varmod-range.exp index bdbd68edeb45..691604805871 100644 --- a/usr.bin/make/unit-tests/varmod-range.exp +++ b/usr.bin/make/unit-tests/varmod-range.exp @@ -1,8 +1,13 @@ +make: Unknown modifier 'x' +make: "varmod-range.mk" line 46: Malformed conditional ("${:U:range=x}Rest" != "Rest") +make: Unknown modifier 'x' +make: "varmod-range.mk" line 55: Malformed conditional ("${:U:range=0x0}Rest" != "Rest") make: Unknown modifier 'r' - -1 2 3 +make: "varmod-range.mk" line 71: Malformed conditional ("${a b c:L:rang}Rest" != "Rest") make: Unknown modifier 'r' - +make: "varmod-range.mk" line 78: Malformed conditional ("${a b c:L:rango}Rest" != "Rest") make: Unknown modifier 'r' - -exit status 0 +make: "varmod-range.mk" line 85: Malformed conditional ("${a b c:L:ranger}Rest" != "Rest") +make: Fatal errors encountered -- cannot continue +make: stopped in unit-tests +exit status 1 diff --git a/usr.bin/make/unit-tests/varmod-range.mk b/usr.bin/make/unit-tests/varmod-range.mk index e6dcf7afe773..0c3879894f8e 100644 --- a/usr.bin/make/unit-tests/varmod-range.mk +++ b/usr.bin/make/unit-tests/varmod-range.mk @@ -1,4 +1,4 @@ -# $NetBSD: varmod-range.mk,v 1.4 2020/09/27 18:11:31 rillig Exp $ +# $NetBSD: varmod-range.mk,v 1.5 2020/11/01 13:10:22 rillig Exp $ # # Tests for the :range variable modifier, which generates sequences # of integers from the given range. @@ -31,8 +31,61 @@ . error .endif +# Negative ranges don't make sense. +# As of 2020-11-01, they are accepted though, using up all available memory. +#.if "${:range=-1}" +#. error +#.else +#. error +#.endif + +# The :range modifier requires a number as parameter. +# As of 2020-11-01, the parser tries to read the 'x' as a number, fails and +# stops there. It then tries to parse the next modifier at that point, +# which fails with the message "Unknown modifier". +.if "${:U:range=x}Rest" != "Rest" +. error +.else +. error +.endif + +# The upper limit of the range must always be given in decimal. +# This parse error stops at the 'x', trying to parse it as a variable +# modifier. +.if "${:U:range=0x0}Rest" != "Rest" +. error +.else +. error +.endif + +# As of 2020-11-01, numeric overflow is not detected. +# Since strtoul returns ULONG_MAX in such a case, it is interpreted as a +# very large number, consuming all available memory. +#.if "${:U:range=18446744073709551619}Rest" != "Rest" +#. error +#.else +#. error +#.endif + +# modifier name too short +.if "${a b c:L:rang}Rest" != "Rest" +. error +.else +. error +.endif + +# misspelled modifier name +.if "${a b c:L:rango}Rest" != "Rest" +. error +.else +. error +.endif + +# modifier name too long +.if "${a b c:L:ranger}Rest" != "Rest" +. error +.else +. error +.endif + all: - @echo ${a b c:L:rang} # modifier name too short - @echo ${a b c:L:range} # ok - @echo ${a b c:L:rango} # misspelled - @echo ${a b c:L:ranger} # modifier name too long