Date: Tue, 7 Sep 1999 21:03:43 +0800 (CST) From: Scott Hazen Mueller <scott@zorch.sf-bay.org> To: FreeBSD-gnats-submit@freebsd.org Cc: scott@zorch.sf-bay.org Subject: bin/13615: awk bug Message-ID: <199909071303.VAA12164@zorba.sf-bay.org>
next in thread | raw e-mail | index | archive | help
>Number: 13615 >Category: bin >Synopsis: awk corrupts the memory arena when OFMT is not %.6g >Confidential: no >Severity: critical >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Tue Sep 7 06:10:01 PDT 1999 >Closed-Date: >Last-Modified: >Originator: Scott Hazen Mueller >Release: FreeBSD 3.2-RELEASE i386 >Organization: none >Environment: The code originates in C News, however all C News dependencies have been removed from the supplied test case. >Description: When the supplied script is run against the supplied test data with OFMT unset or set to the default %.6g, the script completes normally. If OFMT is set to a value other than %.6g (values tested from %.7g to %.12g), the script generates numerous awk in free(): warning: chunk is already free. warnings. Additionally, variable values change unexpectedly in apparent response to assignment of other variables. This is the output of a "normal" run: 123123123123 1e+11 now0 123123123123 123123123123 1e+11 <--- 1st checkpoint now1 123123123123 0 1e+11 now2 123123123123 0 1e+11 123123123123 456456456456 1e+11 now0 456456456456 456456456456 1e+11 <--- 2nd checkpoint now1 456456456456 0 1e+11 now2 456456456456 0 1e+11 456456456456 789789789789 1e+11 now0 789789789789 789789789789 1e+11 <--- 3rd checkpoint now1 789789789789 0 1e+11 now2 789789789789 0 1e+11 This is the output when OFMT is %.7g: 1.231231e+11 1e+11 awk in free(): warning: chunk is already free. now0 123123123123 1e+11 1e+11 <--- 1st checkpoint awk in free(): warning: chunk is already free. now1 123123123123 1e+11 1e+11 now2 123123123123 1e+11 1e+11 awk in free(): warning: chunk is already free. 123123123123 4.564564e+11 4.564564e+11 now0 456456456456 456456456456 456456456456 <--- 2nd checkpoint awk in free(): warning: chunk is already free. awk in free(): warning: chunk is already free. now1 0 0 0 <--- error awk in free(): warning: chunk is already free. awk in free(): warning: chunk is already free. now2 0 0 0 awk in free(): warning: chunk is already free. awk in free(): warning: chunk is already free. 7.897898e+11 7.897898e+11 7.897898e+11 <--- 3rd checkpoint awk in free(): warning: chunk is already free. awk in free(): warning: chunk is already free. now1 6.653991e-316 6.653991e-316 6.653991e-316 <--- error awk in free(): warning: chunk is already free. awk in free(): warning: chunk is already free. now2 9.999994e+10 9.999994e+10 9.999994e+10 Note that in the second output set, the variable values went to '0 0 0' between the 2nd and 3rd checkpoint, and went to 6.65e-316 after the 3rd checkpoint. These output lines are indicated with 'error'. >How-To-Repeat: awk script: BEGIN { OFMT = "%.7g" #OFMT = "%.6g" big = 99999999999 lowest = big small = 0 highest = small dir = "" } { if ($1 < lowest) lowest = $1 if ($1 > highest) highest = $1 print dir, highest, lowest dir = $0 print "now0 ", dir, highest, lowest highest = small print "now1 ", dir, highest, lowest lowest = big print "now2 ", dir, highest, lowest } input file: 123123123123 456456456456 789789789789 Execute awk -f script <input To see the normal case, uncomment 'OFMT="%.6g"'. Note on the script - the seemingly meaningless tests and assignments are necessary to reproduce the error condition. This is the simplest script I could generate that reproduced the failure. >Fix: Setting OFMT to %.6g seems to cause normal behavior, at the loss of flexibility in formatting the output. >Release-Note: >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199909071303.VAA12164>