From 2654cb43f63349cff06b3dd26932dd76f53aed4c Mon Sep 17 00:00:00 2001 From: Daniel Shahaf Date: Sat, 26 Sep 2015 01:59:48 +0000 Subject: 36651: WARN_CREATE_GLOBAL += math expressions MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Without this, '() { (( x=42 )) }' and '() { for (( i=0; … )) }' wouldn't warn about $x and $i, respectively, being created global. --- Src/math.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) (limited to 'Src/math.c') diff --git a/Src/math.c b/Src/math.c index 977e92345..56565a629 100644 --- a/Src/math.c +++ b/Src/math.c @@ -894,6 +894,24 @@ getcvar(char *s) } +/* If script execution is inside a function call that hasn't returned, + * return the name of that function. Else return NULL. + */ + +/**/ +static const char * +in_function_call(void) +{ + Funcstack i; + for (i = funcstack; i; i = i->prev) + if (i->tp == FS_FUNC) { + DPUTS(!i->name, "funcstack entry with no name"); + return i->name; + } + + return NULL; +} + /**/ static mnumber setmathvar(struct mathvalue *mvp, mnumber v) @@ -929,6 +947,13 @@ setmathvar(struct mathvalue *mvp, mnumber v) if (noeval) return v; untokenize(mvp->lval); + if (isset(WARNCREATEGLOBAL)) { + const char *function_name; + if (!paramtab->getnode(paramtab, mvp->lval) && + (function_name = in_function_call())) + zwarn("math parameter %s created globally in function %s", + mvp->lval, function_name); + } pm = setnparam(mvp->lval, v); if (pm) { /* -- cgit 1.4.1