github.com/benhoyt/goawk@v1.8.1/testdata/gawk/getnr2tb.awk (about) 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 }