Hi,

It seems like dash has a subtly incorrect arithmetic expansion for variables 
that are unset. For example, consider the following program:

unset x ; echo $((x+=2))

Running bash on this program echoes the number 2 to standard out and sets x to 
2. Running dash (git HEAD/release 0.5.9.1) yields an error:

src/dash: 1: Illegal number: 

Now, bash and dash disagreeing isn’t such a big deal. But it seems like the 
standard indicates bash’s defaulting is correct for unset variables. According 
to 
<http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_06_04>,
 “the arithmetic expression shall be processed according to the rules given in 
Arithmetic Precision and Operations”, which says “all variables shall be 
initialized to zero if they are not otherwise assigned by the input to the 
application” 
<http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap01.html#tag_17_01_02_01>.

The standard is a little bit unclear about what to do for variables that are 
set to null (or non-numeric values). I’d interpret the standard as defaulting 
for unset variables, having null and other non-numeric strings cause some kind 
of error. bash, as usual, goes well beyond what the standard indicates: any 
non-numerical value is defaulted to 0. So:

x="" ; echo $((x+=2))

x=“yo” ; echo $((x+=2))

both yield 2! If you ask me, that’s a bridge too far—and asking for bugs.

I should add that my student (Austin Blatt, CC-ed) noticed this issue; I wrote 
the attached, single-line fix.

Cheers,
Michael

Signed-off-by: Michael Greenberg <michael.greenb...@pomona.edu>
—
diff --git a/src/var.c b/src/var.c
index cc6f7f2..e34f9cf 100644
--- a/src/var.c
+++ b/src/var.c
@@ -353,7 +353,7 @@ lookupvar(const char *name)
 
 intmax_t lookupvarint(const char *name)
 {
-       return atomax(lookupvar(name) ?: nullstr, 0);
+       return atomax(lookupvar(name) ?: "0", 0);
 }
 
 

 


Reply via email to