zsh-workers
 help / color / mirror / code / Atom feed
* BUG: parameter not created
@ 2000-07-02  7:38 Felix Rosencrantz
  2000-07-03  9:55 ` PATCH " Peter Stephenson
  0 siblings, 1 reply; 2+ messages in thread
From: Felix Rosencrantz @ 2000-07-02  7:38 UTC (permalink / raw)
  To: zsh-workers

I'm able to generate a BUG message and stack trace with the following command:
zsh -f
% (( aarray[abc]++ ))
% (( aarray[abc]++ ))
BUG: parameter not created
zsh: segmentation fault (core dumped)

Here's the stack trace.
#0  0x85c54 in setnparam (s=0x187e8e "[abc]", val={u = {
        l = 0x0000000000000001, d = 4.9406564584124654e-324}, type = 1})
    at params.c:1946
#1  0x70330 in setvar (s=0x187e88 "aarray[abc]", v={u = {
        l = 0x0000000000000001, d = 4.9406564584124654e-324}, type = 1})
    at math.c:505
#2  0x718c0 in op (what=4) at math.c:802
#3  0x72ba8 in mathparse (pc=17) at math.c:1088
#4  0x72054 in mathevall (s=0x187e74 " aarray[abc]++ ", prek=17, ep=0xefffe94c)
    at math.c:920
#5  0x7220c in matheval (s=0x187e74 " aarray[abc]++ ") at math.c:956
#6  0x7229c in mathevali (s=0x187e74 " aarray[abc]++ ") at math.c:967
#7  0x42ab4 in execarith (state=0xefffebd8, do_exec=0) at exec.c:3010
#8  0x38dfc in execsimple (state=0xefffebd8) at exec.c:757
#9  0x38f98 in execlist (state=0xefffebd8, dont_change_job=0, exiting=0)
    at exec.c:801
#10 0x38c44 in execode (p=0x187e40, dont_change_job=0, exiting=0) at exec.c:727
#11 0x5a94c in loop (toplevel=1, justonce=0) at init.c:150
#12 0x2406c in main (argc=2, argv=0xefffed64) at ./main.c:98


-FR


__________________________________________________
Do You Yahoo!?
Kick off your party with Yahoo! Invites.
http://invites.yahoo.com/


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

* PATCH Re: BUG: parameter not created
  2000-07-02  7:38 BUG: parameter not created Felix Rosencrantz
@ 2000-07-03  9:55 ` Peter Stephenson
  0 siblings, 0 replies; 2+ messages in thread
From: Peter Stephenson @ 2000-07-03  9:55 UTC (permalink / raw)
  To: Zsh hackers list

> I'm able to generate a BUG message and stack trace with the following command
> :
> zsh -f
> % (( aarray[abc]++ ))
> % (( aarray[abc]++ ))
> BUG: parameter not created
> zsh: segmentation fault (core dumped)

Looks like this has been there forever --- math eval checks for array
element syntax, but the code that sets numeric parameters doesn't, and as
far as I know never did.  The problem was really on the first call; the
parameter was created with the square brackets, and the second time the
attempt to retrieve the value (which interpreted the syntax correctly)
failed, while so did the parameter creation because the bogus parameter
already existed.  This confused it totally.

setnparam() is actually new, but it's more or less a direct copy of
setiparam().  I've patched both of them, though it's quite possible that
setiparam() doesn't currently get called in a context where the square
brackets would be present.  The patch is quite simple, because the rest of
the code called from here already handles the square brackets.

Bart, this is in 3.0.8 too, but the patch for that should be obvious from
the setiparam() chunk.

Note that currently array elements are all scalar.  There's no particular
reason why we shouldn't have numeric arrays, except that adding to the
current parameter code is complicated and bug-prone.

Index: Src/params.c
===================================================================
RCS file: /cvsroot/zsh/zsh/Src/params.c,v
retrieving revision 1.20
diff -u -r1.20 params.c
--- Src/params.c	2000/06/28 17:10:05	1.20
+++ Src/params.c	2000/07/03 09:53:04
@@ -1898,7 +1898,7 @@
 {
     struct value vbuf;
     Value v;
-    char *t = s;
+    char *t = s, *ss;
     Param pm;
     mnumber mnval;
 
@@ -1908,10 +1908,18 @@
 	return NULL;
     }
     if (!(v = getvalue(&vbuf, &s, 1))) {
-	pm = createparam(t, PM_INTEGER);
+	if ((ss = strchr(s, '[')))
+	    *ss = '\0';
+	pm = createparam(t, ss ? PM_ARRAY : PM_INTEGER);
 	DPUTS(!pm, "BUG: parameter not created");
-	pm->u.val = val;
-	return pm;
+	if (ss) {
+	    *ss = '[';
+	    v = getvalue(&vbuf, &t, 1);
+	    DPUTS(!v, "BUG: value not found for new parameter");
+	} else {
+	    pm->u.val = val;
+	    return pm;
+	}
     }
     mnval.type = MN_INTEGER;
     mnval.u.l = val;
@@ -1930,7 +1938,7 @@
 {
     struct value vbuf;
     Value v;
-    char *t = s;
+    char *t = s, *ss = NULL;
     Param pm;
 
     if (!isident(s)) {
@@ -1939,15 +1947,23 @@
 	return NULL;
     }
     if (!(v = getvalue(&vbuf, &s, 1))) {
-	pm = createparam(t, (val.type & MN_INTEGER) ? PM_INTEGER
-			 : PM_FFLOAT);
+	if ((ss = strchr(s, '[')))
+	    *ss = '\0';
+	pm = createparam(t, ss ? PM_ARRAY :
+			 (val.type & MN_INTEGER) ? PM_INTEGER : PM_FFLOAT);
 	DPUTS(!pm, "BUG: parameter not created");
-	if (val.type & MN_INTEGER) {
-	    pm->ct = outputradix;
-	    pm->u.val = val.u.l;
-	} else
-	    pm->u.dval = val.u.d;
-	return pm;
+	if (ss) {
+	    *ss = '[';
+	    v = getvalue(&vbuf, &t, 1);
+	    DPUTS(!v, "BUG: value not found for new parameter");
+	} else {
+	    if (val.type & MN_INTEGER) {
+		pm->ct = outputradix;
+		pm->u.val = val.u.l;
+	    } else
+		pm->u.dval = val.u.d;
+	    return pm;
+	}
     }
     setnumvalue(v, val);
     return v->pm;
Index: Test/06arith.ztst
===================================================================
RCS file: /cvsroot/zsh/zsh/Test/06arith.ztst,v
retrieving revision 1.1.1.1
diff -u -r1.1.1.1 06arith.ztst
--- Test/06arith.ztst	1999/12/21 23:12:01	1.1.1.1
+++ Test/06arith.ztst	2000/07/03 09:53:04
@@ -82,3 +82,9 @@
 0:use of scalars to store integers and floats
 >3.5
 >4
+
+  (( newarray[unsetvar]++ ))
+  (( newarray[unsetvar]++ ))
+  print ${(t)newarray} ${#newarray} ${newarray[1]}
+0:setting array elements in math context
+>array 1 2

-- 
Peter Stephenson <pws@cambridgesiliconradio.com>
Cambridge Silicon Radio, Unit 300, Science Park, Milton Road,
Cambridge, CB4 0XL, UK                          Tel: +44 (0)1223 392070


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

end of thread, other threads:[~2000-07-03  9:56 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2000-07-02  7:38 BUG: parameter not created Felix Rosencrantz
2000-07-03  9:55 ` PATCH " 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).