The following issue has been SUBMITTED. ====================================================================== http://austingroupbugs.net/view.php?id=1137 ====================================================================== Reported By: sebor Assigned To: ajosey ====================================================================== Project: 1003.1(2008)/Issue 7 Issue ID: 1137 Category: System Interfaces Type: Error Severity: Objection Priority: normal Status: Under Review Name: Martin Sebor Organization: User Reference: Section: fprintf Page Number: 982 Line Number: 30186-30193 Interp Status: --- Final Accepted Text: ====================================================================== Date Submitted: 2017-04-24 23:08 UTC Last Modified: 2017-04-24 23:08 UTC ====================================================================== Summary: problems with numbered and unnumbered conversion specifications Description: On line 30200 POSIX specifies that
"Each conversion specification is introduced by the ’%’ character [CX] or by the character sequence "%n$", [CX end] after which the following appear in sequence: ...[optional flags, width, precision, length modifier, and a required conversion specifier]." However, this specification is in apparent contradiction to the text earlier on lines 30186-30187 stating that "The /format/ can contain either numbered argument conversion specifications (that is, "%n$" and "*m$"), or unnumbered argument conversion specifications (that is, % and *), but not both." referring to all of "%n$", "*m$", % and * as conversion specifications. In addition, on line 30224 POSIX further states that "In format strings containing the "%n$" form of a conversion specification, ..." again referring to "%n$" as a form of a conversion specification. I believe the problems are due to the following: First, neither "%" nor "%n$" alone is a complete conversion specification because they are missing the required conversion specifier. Thus the text in the first set of parentheses on lines 30186-30187 isn't entirely correct. Second, neither "*m$" nor "*" is a conversion specification because as shown they are neither introduced by the % character nor followed by a conversion specifier. This makes the text in the second set of parentheses also incorrect. Additionally, on line 30207 POSIX repeats the C requirement that "The field width takes the form of an <asterisk> (’*’), described below, or a decimal integer. and on lines 30213-30215: "The precision takes the form of a <period> (’.’) followed either by an <asterisk> (’*’), described below, or an optional decimal digit string, where a null digit string is treated as zero." effectively excluding the "*m$" form or width and precision, yet seemingly allowing the asterisk and the decimal integer forms in both numbered and unnumbered conversion specifications. But on lines 30223-30225, however, POSIX then goes on to say that "In format strings containing the "%n$" form of a conversion specification, a field width or precision may be indicated by the sequence "*m$" ..." These requirements are both ambiguous and/or contradictory: In format specifications that start with "%n$", is the "*m$" form the only valid for of width and precision, or can they also be specified by a decimal digit string? Also, if precision may be indicated by the sequence "*m$" does it mean that it does not start with the period like the ".*" form does? Desired Action: 1) Replace the sentence on lines 30186-30187 with The /format/ can contain either numbered argument conversion specifications (that is, those introduced by "%n$" and, optionally, containing the "*m$" forms of field width and precision), or unnumbered argument conversion specifications (that is, those introduced by the % character and, optionally containing the * form of field width and precision), but not both. 2) Replace the text on line 30207 with The field width takes the form of an <asterisk> (’*’), [CX] or in conversion specifications introduced by "%n$" the "*m$" string,[CX end] described below, or a decimal integer. 3) Replace the text on lines 30213-30215 with The precision takes the form of a <period> (’.’) followed either by an <asterisk> (’*’), [CX] or in conversion specifications introduced by "%n$" the "*m$" string,[CX end] described below, or an optional decimal digit string, where a null digit string is treated as zero." 4) Replace the text on line 30224 with In format strings containing conversion specifications introduced by "%n$", in addition to being indicated by the decimal digit string, a field width may be indicated by the sequence "*m$" and precision by the sequence ".*m$", where m is a decimal integer ... ====================================================================== Issue History Date Modified Username Field Change ====================================================================== 2017-04-24 23:08 sebor New Issue 2017-04-24 23:08 sebor Status New => Under Review 2017-04-24 23:08 sebor Assigned To => ajosey 2017-04-24 23:08 sebor Name => Martin Sebor 2017-04-24 23:08 sebor Section => fprintf 2017-04-24 23:08 sebor Page Number => 982 2017-04-24 23:08 sebor Line Number => 30186-30193 ======================================================================