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 v1.2.3 From b970ef6ef50dc4e21a053ae673fe89fff5a3c52f Mon Sep 17 00:00:00 2001 From: "Barton E. Schaefer" Date: Wed, 21 Oct 2015 15:13:45 -0700 Subject: unposted: strdup should be ztrdup --- ChangeLog | 2 ++ Src/math.c | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) (limited to 'Src/math.c') diff --git a/ChangeLog b/ChangeLog index e40242eb8..e383ab9b6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,7 @@ 2015-10-21 Barton E. Schaefer + * unposted: Src/math.c: strdup should be ztrdup + * 36909: Src/hist.c: in getargs(), sanity-check the offsets for start and end of the requested words, in case of overflow diff --git a/Src/math.c b/Src/math.c index 56565a629..eee21e146 100644 --- a/Src/math.c +++ b/Src/math.c @@ -535,7 +535,7 @@ lexconstant(void) for (ptr2 = ptr; ptr2 < nptr; ptr2++) { if (*ptr2 == '_') { int len = nptr - ptr; - ptr = strdup(ptr); + ptr = ztrdup(ptr); for (ptr2 = ptr; len; len--) { if (*ptr2 == '_') chuck(ptr2); -- cgit v1.2.3 From de9effbce601db7ad7f7f0d0969b70b920b4e371 Mon Sep 17 00:00:00 2001 From: Peter Stephenson Date: Thu, 29 Oct 2015 17:06:27 +0000 Subject: 37018: Make WARNCREATEGLOBAL more consistent. Wd don't need separate math handling any more, and can make it output the function name in all cases. --- ChangeLog | 3 +++ Src/math.c | 26 -------------------------- Src/params.c | 52 +++++++++++++++++++++++++++++++++++++++------------- Test/E01options.ztst | 6 +++--- 4 files changed, 45 insertions(+), 42 deletions(-) (limited to 'Src/math.c') diff --git a/ChangeLog b/ChangeLog index b45d5b59e..ba9113487 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,8 @@ 2015-10-29 Peter Stephenson + * 37018: Src/math.c, Src/params.c, Test/E01options.ztst: make + WARNCREATEGLOBAL consistent in all cases, outputting file name. + * unposted: .giignore: ignore .orig files. * 37014: Functions/MIME/zsh-mime-setup, diff --git a/Src/math.c b/Src/math.c index eee21e146..37981cf22 100644 --- a/Src/math.c +++ b/Src/math.c @@ -893,25 +893,6 @@ getcvar(char *s) return mn; } - -/* 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) @@ -947,13 +928,6 @@ 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) { /* diff --git a/Src/params.c b/Src/params.c index 4d33660fb..5058695bb 100644 --- a/Src/params.c +++ b/Src/params.c @@ -2694,6 +2694,37 @@ gethkparam(char *s) return NULL; } +/**/ +static void +check_warn_create(Param pm, const char *pmtype) +{ + Funcstack i; + const char *name; + + if (pm->level != 0) + return; + + name = NULL; + for (i = funcstack; i; i = i->prev) { + if (i->tp == FS_FUNC) { + DPUTS(!i->name, "funcstack entry with no name"); + name = i->name; + break; + } + } + + if (name) + { + zwarn("%s parameter %s created globally in function %s", + pmtype, pm->node.nam, name); + } + else + { + zwarn("%s parameter %s created globally in function", + pmtype, pm->node.nam); + } +} + /**/ mod_export Param assignsparam(char *s, char *val, int flags) @@ -2747,9 +2778,8 @@ assignsparam(char *s, char *val, int flags) zsfree(val); return NULL; } - if ((flags & ASSPM_WARN_CREATE) && v->pm->level == 0) - zwarn("scalar parameter %s created globally in function", - v->pm->node.nam); + if (flags & ASSPM_WARN_CREATE) + check_warn_create(v->pm, "scalar"); if (flags & ASSPM_AUGMENT) { if (v->start == 0 && v->end == -1) { switch (PM_TYPE(v->pm->node.flags)) { @@ -2898,9 +2928,8 @@ assignaparam(char *s, char **val, int flags) return NULL; } - if ((flags & ASSPM_WARN_CREATE) && v->pm->level == 0) - zwarn("array parameter %s created globally in function", - v->pm->node.nam); + if (flags & ASSPM_WARN_CREATE) + check_warn_create(v->pm, "array"); if (flags & ASSPM_AUGMENT) { if (v->start == 0 && v->end == -1) { if (PM_TYPE(v->pm->node.flags) & PM_ARRAY) { @@ -2958,9 +2987,8 @@ sethparam(char *s, char **val) queue_signals(); if (!(v = fetchvalue(&vbuf, &s, 1, SCANPM_ASSIGNING))) { createparam(t, PM_HASHED); - if (isset(WARNCREATEGLOBAL) && locallevel > 0 && v->pm->level == 0) - zwarn("associative array parameter %s created globally in function", - v->pm->node.nam); + if (isset(WARNCREATEGLOBAL) && locallevel > 0) + check_warn_create(v->pm, "associative array"); } else if (!(PM_TYPE(v->pm->node.flags) & PM_HASHED) && !(v->pm->node.flags & PM_SPECIAL)) { unsetparam(t); @@ -3032,10 +3060,8 @@ setnparam(char *s, mnumber val) } v = getvalue(&vbuf, &t, 1); DPUTS(!v, "BUG: value not found for new parameter"); - if (!was_unset && isset(WARNCREATEGLOBAL) && locallevel > 0 && - v->pm->level == 0) - zwarn("numeric parameter %s created globally in function", - v->pm->node.nam); + if (!was_unset && isset(WARNCREATEGLOBAL) && locallevel > 0) + check_warn_create(v->pm, "numeric parameter"); } setnumvalue(v, val); unqueue_signals(); diff --git a/Test/E01options.ztst b/Test/E01options.ztst index 1caee8d24..15468e888 100644 --- a/Test/E01options.ztst +++ b/Test/E01options.ztst @@ -1116,9 +1116,9 @@ } fn 0:WARN_CREATE_GLOBAL option -?fn:3: scalar parameter foo1 created globally in function -?fn:5: scalar parameter foo1 created globally in function -?fn:15: math parameter foo5 created globally in function fn +?fn:3: scalar parameter foo1 created globally in function fn +?fn:5: scalar parameter foo1 created globally in function fn +?fn:15: numeric parameter parameter foo5 created globally in function fn # This really just tests if XTRACE is egregiously broken. # To test it properly would need a full set of its own. -- cgit v1.2.3