Date: Mon, 02 Jul 2018 17:17:43 +0200 From: Leonardo Taccari <l...@netbsd.org> Message-ID: <20180702151748.7d45a84...@mail.netbsd.org>
| What should we do if we receive just a `printf '\''? Pretty much whatever we please ... (including printing the environment, if that was sane..., even dumping core) | IIUC according POSIX this is unspecified behaviour It is when the stray terminating \ is in the arg to a %b conversion, when it is in the format it is just "forgotten". There are some in posix who believe that being "forgotten" is the same as "unspecified" (as they haven't specified anything...) - I consider it to simply be a bug (in posix.) | and for consistency I have treated it similarly to the `default' case | for "unknown escape sequence" I think that's best. For comparison, bash's builtin printf simply prints the \ and doesn't treat it as an error - I think that's sub-optimal (not in the spirit of posix) which is fairly clear that error messages should be printed, and the exit code not be 0, whenever something incorrect is detected. I have committed a slightly different version of your patch (just to make it more consistent with what was there before) ... and then I also fixed the "print error messages twice when there's a bad \ conversion in a %b string" which I noticed while testing this. While here, and discussing printf, it is also worth noting that we treat printf %b '\64' as a valid way to print '4', whereas posix actually requires: printf %b '\064' (which also works, of course, including where there are 3 octal digits after the \0.) The earlier case is another one which is unspecified. Does anyone have any problem with that extension? (nb: in the format string, the 0 after the \ is not required, and if given counts as being one of the (max 3) digits that are converted from octal to a char - that is, \0123 in a format string, and in a %b arg are treated differently. That's just the way it is....) kre