zsh-workers
 help / color / mirror / code / Atom feed
* This looks obviously wrong to me, but maybe it's unreachable?
@ 2015-11-22 22:50 Bart Schaefer
  2015-11-23 15:34 ` Peter Stephenson
  0 siblings, 1 reply; 2+ messages in thread
From: Bart Schaefer @ 2015-11-22 22:50 UTC (permalink / raw)
  To: zsh-workers

This is in sethparam():

    if (!(v = fetchvalue(&vbuf, &s, 1, SCANPM_ASSIGNING))) {
	createparam(t, PM_HASHED);
	if (isset(WARNCREATEGLOBAL) && locallevel > 0)
	    check_warn_create(v->pm, "associative array");

That's plainly dereferencing v->pm in a block where v is NULL.

However I think it's impossible to reach that code because you can never
assign to an associative array without declaring it first, so it's not
possible to accidentally create one at global scope.


^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: This looks obviously wrong to me, but maybe it's unreachable?
  2015-11-22 22:50 This looks obviously wrong to me, but maybe it's unreachable? Bart Schaefer
@ 2015-11-23 15:34 ` Peter Stephenson
  0 siblings, 0 replies; 2+ messages in thread
From: Peter Stephenson @ 2015-11-23 15:34 UTC (permalink / raw)
  To: zsh-workers

On Sun, 22 Nov 2015 14:50:46 -0800
Bart Schaefer <schaefer@brasslantern.com> wrote:

> This is in sethparam():
> 
>     if (!(v = fetchvalue(&vbuf, &s, 1, SCANPM_ASSIGNING))) {
> 	createparam(t, PM_HASHED);
> 	if (isset(WARNCREATEGLOBAL) && locallevel > 0)
> 	    check_warn_create(v->pm, "associative array");
> 
> That's plainly dereferencing v->pm in a block where v is NULL.

It should probably be this.

pws

diff --git a/Src/params.c b/Src/params.c
index b121bd6..602f69f 100644
--- a/Src/params.c
+++ b/Src/params.c
@@ -2970,6 +2970,7 @@ sethparam(char *s, char **val)
     struct value vbuf;
     Value v;
     char *t = s;
+    int checkcreate = 0;
 
     if (!isident(s)) {
 	zerr("not an identifier: %s", s);
@@ -2988,8 +2989,7 @@ sethparam(char *s, char **val)
     queue_signals();
     if (!(v = fetchvalue(&vbuf, &s, 1, SCANPM_ASSIGNING))) {
 	createparam(t, PM_HASHED);
-	if (isset(WARNCREATEGLOBAL) && locallevel > 0)
-	    check_warn_create(v->pm, "associative array");
+	checkcreate = isset(WARNCREATEGLOBAL) && locallevel > 0;
     } else if (!(PM_TYPE(v->pm->node.flags) & PM_HASHED) &&
 	     !(v->pm->node.flags & PM_SPECIAL)) {
 	unsetparam(t);
@@ -3002,6 +3002,8 @@ sethparam(char *s, char **val)
 	    unqueue_signals();
 	    return NULL;
 	}
+    if (checkcreate)
+	check_warn_create(v->pm, "associative array");
     setarrvalue(v, val);
     unqueue_signals();
     return v->pm;


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2015-11-23 15:34 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-11-22 22:50 This looks obviously wrong to me, but maybe it's unreachable? Bart Schaefer
2015-11-23 15:34 ` Peter Stephenson

Code repositories for project(s) associated with this public inbox

	https://git.vuxu.org/mirror/zsh/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).