Awk stdin/printf Bugs
Chad Kline
i18rabbit at yahoo.com
Wed Mar 5 01:48:53 UTC 2014
FreeBSD 9.2 ... For comparisons, mawk = 1.3.4, gawk = 4.1.0
Problem 1:
$ gawk 'BEGIN { s=sprintf("%c", 0); printf("%s", s) }'|more
^@ (as expected, ASCII 0)
$ mawk 'BEGIN { s=sprintf("%c", 0); printf("%s", s) }'|more
^@ (as expected, ASCII 0)
$ awk 'BEGIN { s=sprintf("%c", 0); printf("%s", s) }'|more
(nothing, no output - this should be fixed for compatibility/sensibility).
Problem 2:
$ gawk 'BEGIN { getline < "/dev/stdin"; close("/dev/stdin");
getline < "/dev/stdin"; print }'
xxx
xxx
$ mawk 'BEGIN { getline < "/dev/stdin"; close("/dev/stdin");
getline < "/dev/stdin"; print }'
xxx
yyy
yyy
$ awk 'BEGIN { getline < "/dev/stdin"; close("/dev/stdin");
getline < "/dev/stdin"; print }'
xxx
xxx
awk: i/o error occurred on /dev/stdin
source line number 1
Mawk is the only awk that processes the above code sensibly.
This "bug" has been filed with gawk-bugs at gnu.org for the following
reasons:
1. There is a definite compatibility problem here, and the only solutions are
to either make Mawk work "incorrectly/nonsensical/undefined" as Gawk and
FreeBSD awk, or to make Gawk and FreeBSD awk work in a defined and sensible
way such as Mawk.
2. It could be demanded of programmers to always avoid closing the "evil and
dangerous" stdin, but this requires every "open/read/close" file-type function
to always make special checks for a file named "stdin", when there is no
sensible/logical reason to do so. There is no reason to force stdin to be
closed for the entirety of a program just because it was closed once. Stdin
should behave like any other file, sensibly speaking, and it should be
possible to open again if it was closed previously, just like in C or any
other file in awk.
3. It is much more efficient for awk to "do nothing" with a
close("/dev/stdin") call than to implement special tests in awk for the "evil
and dangerous" stdin file within every "open/read/close" file-type function.
It hurts nothing to do so.
More information about the freebsd-bugbusters
mailing list