Skip to contentSkip to conversation

New: scanf manpage incorrectly says that ll (ell-ell) is equivalent to L

Bug 215844 [email protected] 1 participant 2 messages Apr 16, 2022 Man-pages: manual pages for Linux -- Sections 2, 3, 4, 5, and 7

lore
Share & tools
lore
#0 lore raw

https://bugzilla.kernel.org/show_bug.cgi?id=215844

Bug ID: 215844
Summary: scanf manpage incorrectly says that ll (ell-ell) is
equivalent to L
Product: Documentation
Version: unspecified
Hardware: All
OS: Linux
Status: NEW
Severity: normal
Priority: P1
Component: man-pages
Assignee: [email protected]
Reporter: [email protected]
Regression: No

Hello!

manpage of scanf says that "Specifying two l characters is equivalent to L". But that's not true.

Please check the following code snippet:
#include <stdio.h>

int main(void)

{
        long double ld;
        long long n;

        scanf("%Lf", &ld);
        scanf("%llf", &ld);

        scanf("%Ln", &n);
        scanf("%lln", &n);

        return 0;
}

gcc throws these warnings correctly:
warning: use of ‘ll’ length modifier with ‘f’ type character has either no effect or undefined behavior [-Wformat=]

    9 |         scanf("%llf", &ld);
      |                   ^

warning: use of ‘L’ length modifier with ‘n’ type character has either no effect or undefined behavior [-Wformat=]
11 | scanf("%Ln", &n);
| ^

I think, we need to add separate entry for ll (ell-ell) like printf(3).

Also, another related issue is that scanf(3) doesn't mention that conversion specifiers like %Ld, %Li etc. are GNU nonstandard extensions unlike printf(3) which clearly mentions the nonportable part.

Signature · 4 lines
You may reply to this email to add a comment.

You are receiving this mail because:
You are watching the assignee of the bug.
#1 lore raw

[Bug 215844] scanf manpage incorrectly says that ll (ell-ell) is equivalent to L

https://bugzilla.kernel.org/show_bug.cgi?id=215844

--- Comment #1 from Alejandro Colomar (man-pages) ([email protected]) --- Relevant documents:

POSIX:
<https://pubs.opengroup.org/onlinepubs/9699919799/functions/fscanf.html>

glibc:
<https://www.gnu.org/software/libc/manual/html_mono/libc.html#Numeric-Input-Conversions>

ISO C2x:
<http://www.open-std.org/JTC1/SC22/WG14/www/docs/n2731.pdf#subsubsection.7.21.6.2>

Still, from the documentation linked above, it seems to me that "%Ln" is supported as a glibc extension, and doesn't fall into "either no effect or undefined behavior" as says the GCC warning shown in the bugzilla report. I didn't modify the documentation regarding %n, and recommend investigating a possible GCC bug.

---
 man3/scanf.3 | 35 ++++++++++++++++++++++++++---------
 1 file changed, 26 insertions(+), 9 deletions(-)
man3/scanf.3 +26 -9
index 55058f3d2..199c8a19a 100644
@@ -308,10 +308,6 @@ and the next pointer is a pointer to
 .I double
 (rather than
 .IR float ).
-Specifying two
-.B l
-characters is equivalent to
-.BR L .
 If used with
 .B %c
 or
@@ -320,12 +316,33 @@ the corresponding parameter is considered
 as a pointer to a wide character or wide-character string respectively.
 .\" This use of l was introduced in Amendment 1 to ISO C90.
 .TP
+.B ll
+(ell-ell)
+Indicates that the conversion will be one of
+.BR b ,
+.BR d ,
+.BR i ,
+.BR o ,
+.BR u ,
+.BR x ,
+.BR X ,
+or
+.B n
+and the next pointer is a pointer to a
+.I long long
+or
+.I unsigned long long
+(rather than
+.IR int ).
+.TP
 .B L
 Indicates that the conversion will be either
 \fBe\fP, \fBf\fP, or \fBg\fP
 and the next pointer is a pointer to
 .I "long double"
-or the conversion will be
+or
+(as a GNU extension)
+the conversion will be
 \fBd\fP, \fBi\fP, \fBo\fP, \fBu\fP, or \fBx\fP
 and the next pointer is a pointer to
 .IR "long long" .
@@ -683,17 +700,17 @@ floating-point conversion specifier (and is unaffected by
 etc.).
 .SH BUGS
 All functions are fully C89 conformant, but provide the
-additional specifiers
+additional modifiers
 .B q
 and
 .B a
 as well as an additional behavior of the
 .B L
 and
-.B l
-specifiers.
+.B ll
+modifiers.
 The latter may be considered to be a bug, as it changes the
-behavior of specifiers defined in C89.
+behavior of modifiers defined in C89.
 .PP
 Some combinations of the type modifiers and conversion
 specifiers defined by ANSI C do not make sense
Signature · 4 lines
You may reply to this email to add a comment.

You are receiving this mail because:
You are watching the assignee of the bug.