1#From vp@dmat.uevora.pt Thu Jun 18 09:10 EDT 1998 2#Received: from mescaline.gnu.org (we-refuse-to-spy-on-our-users@mescaline.gnu.org [158.121.106.21]) by cssun.mathcs.emory.edu (8.7.5/8.6.9-940818.01cssun) with ESMTP id JAA23649 for <arnold@mathcs.emory.edu>; Thu, 18 Jun 1998 09:10:54 -0400 (EDT) 3#Received: from khromeleque.dmat.uevora.pt by mescaline.gnu.org (8.8.5/8.6.12GNU) with ESMTP id JAA21732 for <arnold@gnu.ai.mit.edu>; Thu, 18 Jun 1998 09:11:19 -0400 4#Received: from khromeleque.dmat.uevora.pt (vp@localhost [127.0.0.1]) 5# by khromeleque.dmat.uevora.pt (8.8.8/8.8.8/Debian/GNU) with ESMTP id OAA11817 6# for <arnold@gnu.ai.mit.edu>; Thu, 18 Jun 1998 14:13:57 +0100 7#Message-Id: <199806181313.OAA11817@khromeleque.dmat.uevora.pt> 8#To: arnold@gnu.org 9#Subject: concatenation bug in gawk 3.0.3 10#Date: Thu, 18 Jun 1998 14:13:57 +0200 11#From: Vasco Pedro <vp@dmat.uevora.pt> 12#Content-Type: text 13#Content-Length: 2285 14#Status: RO 15# 16#Hi, 17# 18#The gawk program '{print NR " " 10/NR}' will print: 19# 20#1 10 21#5 5 22#3 3.33333 23#2 2.5 24#2 2 25#1 1.66667 26# 27#instead of the correct: 28# 29#1 10 30#2 5 31#3 3.33333 32#4 2.5 33#5 2 34#6 1.66667 35# 36#You'll notice, on the incorrect output, that the first column is 37#the first digit of the second. 38# 39#I think the problem comes from the way builtin variables are handled. 40#Since the items to be concatenated are processed in reverse order and 41#the return value of tree_eval(``NR'') is a pointer to the value part 42#of `NR_node', the `unref()' of `NR_node' due to its second occurrence 43#will leave a dangling pointer in `strlist'. The reason that it doesn't 44#reuse the freed space with objects of the same type. (Using Electric 45#Fence with EF_PROTECT_FREE set confirms that freed space is being 46#accessed.) 47# 48#The enclosed patch (hack would be a better word to describe it) is 49#all I could come up with. With it installed, things seem to work ok, 50#but I doubt this is the correct way to do it. (If I treated the 51#case for `Node_field_spec' as the I did others, `make check' would 52#fail in several places.) 53# 54#Regards, 55#vasco 56# 57#*** eval.c~ Tue May 6 21:39:55 1997 58#--- eval.c Thu Jun 18 13:39:25 1998 59#*************** 60#*** 685,697 **** 61# return func_call(tree->rnode, tree->lnode); 62# 63# /* unary operations */ 64# case Node_NR: 65# case Node_FNR: 66# case Node_NF: 67# case Node_FIELDWIDTHS: 68# case Node_FS: 69# case Node_RS: 70#- case Node_field_spec: 71# case Node_subscript: 72# case Node_IGNORECASE: 73# case Node_OFS: 74#--- 685,700 ---- 75# return func_call(tree->rnode, tree->lnode); 76# 77# /* unary operations */ 78#+ case Node_field_spec: 79#+ lhs = get_lhs(tree, (Func_ptr *) NULL); 80#+ return *lhs; 81#+ 82# case Node_NR: 83# case Node_FNR: 84# case Node_NF: 85# case Node_FIELDWIDTHS: 86# case Node_FS: 87# case Node_RS: 88# case Node_subscript: 89# case Node_IGNORECASE: 90# case Node_OFS: 91#*************** 92#*** 699,705 **** 93# case Node_OFMT: 94# case Node_CONVFMT: 95# lhs = get_lhs(tree, (Func_ptr *) NULL); 96#! return *lhs; 97# 98# case Node_var_array: 99# fatal("attempt to use array `%s' in a scalar context", 100#--- 702,710 ---- 101# case Node_OFMT: 102# case Node_CONVFMT: 103# lhs = get_lhs(tree, (Func_ptr *) NULL); 104#! r = dupnode(*lhs); 105#! r->flags |= TEMP; 106#! return r; 107# 108# case Node_var_array: 109# fatal("attempt to use array `%s' in a scalar context", 110# 111{ print NR " " 10/NR } 112