Defect Report #014

Submission Date: 10 Dec 92
Submittor: WG14
Source: X3J11/90-049 (Max K. Goff)
Question 1
X/Open Reference Number KRT3.159.1
There are conflicting descriptions of the setjmp() interface in ISO 9899:1990. In subclause 7.6 on page 118, line 8, it is stated that ``It is unspecified whether setjmp is a macro or an identifier declared with external linkage.'' Throughout the rest of the standard, however, it is referred to as ``the setjmp macro''; in addition, the rationale document states that setjmp must be implemented as a macro. Please clarify whether setjmp must be implemented as a macro, or may be a function as well as a macro, or may just be a function.
Response
The standard states that setjmp can be either a macro or a function. It is referred to as ``the setjmp macro'' just to avoid longwindedness. The rationale document is incorrect in saying that it must be a macro.
Question 2
X/Open Reference Number KRT3.159.2
Subclause 7.9.6.2 The fscanf function states:
If end-of-file is encountered during input, conversion is terminated. If end-of-file occurs before any characters matching the current input directive have been read (other than leading white space, where permitted), execution of the current directive terminates with input failure; otherwise, unless execution of the current directive is terminated with a matching failure, execution of the following directive (if any) is terminated with an input failure.
How should an implementation behave when end-of-file terminates an input stream that satisfies all conversion specifications that consume input but there is a remaining specification request that consumes no input (e.g. %n)? Should the non-input-consuming directive be evaluated or terminated with an input failure as described above?
Correction
Add to subclause 7.9.6.2, page 137, line 4 (the n conversion specifier):
No argument is converted, but one is consumed. If the conversion specification with this conversion specifier is not one of %n, %ln, or %hn, the behavior is undefined.
Add to subclause 7.9.6.2, page 138, another Example:
In:
#include <stdio.h>
/*
... */
int d1, d2, n1, n2, i;
i = sscanf("123", "%d%n%n%d",&d1, &n1, &n2, &d2);

the value 123 is assigned to d1 and the value 3 to n1 . Because %n can never get an input failure the value of 3 is also assigned to n2. The value of d2 is not affe cted. The value 3 is assigned to i.
Previous Defect Report < - > Next Defect Report