From 79b90cbece5d69c4d370347c347f3d17bd1156c6 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Sun, 18 Jun 2023 20:13:22 +0200 Subject: shell/math: add note on ERANGE function old new delta evaluate_string 1488 1478 -10 Signed-off-by: Denys Vlasenko --- shell/math.c | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/shell/math.c b/shell/math.c index 0b30e089d..e5447e767 100644 --- a/shell/math.c +++ b/shell/math.c @@ -667,6 +667,7 @@ evaluate_string(arith_state_t *math_state, const char *expr) /* At this point, we're done with the expression */ if (numstackptr != numstack + 1) { /* if there is not exactly one result, it's bad */ + /* Example: $((1 2)) */ goto syntax_err; } return numstack->val; @@ -691,9 +692,10 @@ evaluate_string(arith_state_t *math_state, const char *expr) } } else { dbg("[%d] var:IGNORED", (int)(numstackptr - numstack)); - numstackptr->var_name = NULL; - numstackptr->val = 0; //paranoia, probably not needed expr = p; + numstackptr->var_name = NULL; + push_num0: + numstackptr->val = 0; } push_num: numstackptr++; @@ -717,8 +719,13 @@ evaluate_string(arith_state_t *math_state, const char *expr) */ if (isalnum(*expr) || *expr == '_') goto syntax_err; - if (errno) - numstackptr->val = 0; /* bash compat */ + if (errno) { +// TODO: bash 5.2.15 does not catch ERANGE (some older version did?). +// $((99999999999999999999)) is 7766279631452241919 (the 64-bit truncated value). +// Our BASE# code does this as well: try $((10#99999999999999999999)), +// but the "ordinary" code path with strtoull() does not do this. + goto push_num0; /* bash compat */ + } goto push_num; } -- cgit v1.2.3