• R/O
  • SSH
  • HTTPS

yash: Commit


Commit MetaInfo

Revision4000 (tree)
Time2019-09-21 12:41:24
Authormagicant

Log Message

Make nounset option effective in arithmetic expansion

The nounset option should reject unset variables in arithmetic expansion
as well so that the user can get an error when they mistakenly used a
misspelled variable.

This will be a next POSIX requirement:
http://austingroupbugs.net/view.php?id=559

Change Summary

Incremental Difference

--- yash/trunk/NEWS (revision 3999)
+++ yash/trunk/NEWS (revision 4000)
@@ -11,6 +11,8 @@
1111 Yash 2.49
1212
1313 + '--for-local' option.
14+ = The '--no-unset' option now rejects unset variables not only in
15+ parameter expansion but also in arithmetic expansion.
1416 * Expansion of ""$*, ""$@, $*"", and $@"" now correctly yields an
1517 empty string rather than nothing when there are no positional
1618 parameters.
--- yash/trunk/arith.c (revision 3999)
+++ yash/trunk/arith.c (revision 4000)
@@ -1,6 +1,6 @@
11 /* Yash: yet another shell */
22 /* arith.c: arithmetic expansion */
3-/* (C) 2007-2017 magicant */
3+/* (C) 2007-2019 magicant */
44
55 /* This program is free software: you can redistribute it and/or modify
66 * it under the terms of the GNU General Public License as published by
@@ -94,7 +94,7 @@
9494 static bool do_assignment(const word_T *word, const value_T *value)
9595 __attribute__((nonnull));
9696 static wchar_t *value_to_string(const value_T *value)
97- __attribute__((nonnull));
97+ __attribute__((nonnull,malloc,warn_unused_result));
9898 static bool do_binary_calculation(
9999 evalinfo_T *info, atokentype_T ttype,
100100 value_T *lhs, value_T *rhs, value_T *result)
@@ -287,7 +287,7 @@
287287 }
288288
289289 /* Converts `value' to a newly-malloced wide string.
290- * Returns NULL for VT_INVALID. */
290+ * Returns NULL on error. */
291291 wchar_t *value_to_string(const value_T *value)
292292 {
293293 switch (value->type) {
@@ -305,7 +305,10 @@
305305 const wchar_t *var = getvar(name);
306306 if (var != NULL)
307307 return xwcsdup(var);
308- return malloc_wprintf(L"%ld", 0L);
308+ if (shopt_unset)
309+ return malloc_wprintf(L"%ld", 0L);
310+ xerror(0, Ngt("arithmetic: parameter `%ls' is not set"), name);
311+ return NULL;
309312 }
310313 }
311314 assert(false);
@@ -1013,6 +1016,13 @@
10131016 wmemcpy(namestr, name->contents, name->length);
10141017 namestr[name->length] = L'\0';
10151018 varvalue = getvar(namestr);
1019+
1020+ if (varvalue == NULL && !shopt_unset) {
1021+ xerror(0, Ngt("arithmetic: parameter `%ls' is not set"), namestr);
1022+ info->error = true;
1023+ value->type = VT_INVALID;
1024+ return;
1025+ }
10161026 }
10171027 if (varvalue == NULL || varvalue[0] == L'\0') {
10181028 value->type = VT_LONG;
--- yash/trunk/doc/_set.txt (revision 3999)
+++ yash/trunk/doc/_set.txt (revision 4000)
@@ -206,9 +206,10 @@
206206
207207 [[so-unset]]unset (`+u`)::
208208 (Enabled by default)
209-When enabled, undefined parameters are expanded to empty strings in
210-link:expand.html#params[parameter expansion].
211-When disabled, expansion of undefined parameter results in an error.
209+When enabled, an undefined parameter is expanded to an empty string in
210+link:expand.html#params[parameter expansion] and treated as zero in
211+link:expand.html#arith[arithmetic expansion].
212+When disabled, expansion of an undefined parameter results in an error.
212213
213214 [[so-verbose]]verbose (+-v+)::
214215 When enabled, the shell prints each command line to the standard error before
--- yash/trunk/doc/expand.txt (revision 3999)
+++ yash/trunk/doc/expand.txt (revision 4000)
@@ -453,7 +453,7 @@
453453 A floating-point number literal may have an exponent (i.e. `1.23e+6`).
454454 A variable with a non-numeric value will result in an error when parsed as a
455455 number.
456-An unset variable is treated as a value of zero.
456+An unset variable is treated as a value of zero if the link:_set.html#so-unset[unset option] is enabled.
457457
458458 In the POSIXly-correct mode, variables are always parsed as numbers.
459459 Otherwise, variables are parsed only when they are used as numbers in
--- yash/trunk/doc/ja/_set.txt (revision 3999)
+++ yash/trunk/doc/ja/_set.txt (revision 4000)
@@ -139,7 +139,7 @@
139139 このオプションはシェルの起動時に最初から有効になっています。
140140
141141 [[so-unset]]unset (`+u`)::
142-このオプションが有効な時、{zwsp}link:expand.html#params[パラメータ展開]で存在しない変数を展開するとエラーにはならず空文字列に展開されます。このオプションはシェルの起動時に最初から有効になっています。
142+このオプションが有効な時、{zwsp}link:expand.html#params[パラメータ展開]で存在しない変数を展開すると空文字列に展開され、link:expand.html#arith[数式展開]で存在しない変数を使用すると 0 とみなされます。オプションが無効な時、存在しない変数を使用するとエラーになります。このオプションはシェルの起動時に最初から有効になっています。
143143
144144 [[so-verbose]]verbose (+-v+)::
145145 このオプションが有効な時、シェルは読み込んだコマンドをそのまま標準エラーに出力します。
--- yash/trunk/doc/ja/expand.txt (revision 3999)
+++ yash/trunk/doc/ja/expand.txt (revision 4000)
@@ -264,7 +264,7 @@
264264
265265 `++` および `--` 演算子は POSIX 準拠モードでは使えません。
266266
267-原子式としては整数リテラル・浮動小数点数リテラル・変数が使用できます。数リテラルの書式は C 言語に準じます。+0+ で始まる整数リテラルは八進数、+0x+ で始まる整数リテラルは十六進数とみなされます。浮動小数点数リテラルでは指数表記も使えます (例えば 1.23×10^6^ は +1.23e+6+)。変数の値が計算で使われるとき、その値が数値でない場合はエラーになります。未定義の変数は 0 と見做します。
267+原子式としては整数リテラル・浮動小数点数リテラル・変数が使用できます。数リテラルの書式は C 言語に準じます。+0+ で始まる整数リテラルは八進数、+0x+ で始まる整数リテラルは十六進数とみなされます。浮動小数点数リテラルでは指数表記も使えます (例えば 1.23×10^6^ は +1.23e+6+)。変数の値が計算で使われるとき、その値が数値でない場合はエラーになります。link:_set.html#so-unset[Unset オプション]が有効ならば未定義の変数は 0 とみなします。
268268
269269 POSIX 準拠モードでは、変数は必ず数値として解釈されます。
270270 POSIX 準拠モードでないときは、計算で使われる変数のみが数値として解釈され、他の変数はそのまま残ります。
Show on old repository browser