]> git.saurik.com Git - apple/libc.git/blob - stdio/FreeBSD/printf.3
Libc-997.1.1.tar.gz
[apple/libc.git] / stdio / FreeBSD / printf.3
1 .\" Copyright (c) 1990, 1991, 1993
2 .\" The Regents of the University of California. All rights reserved.
3 .\"
4 .\" This code is derived from software contributed to Berkeley by
5 .\" Chris Torek and the American National Standards Committee X3,
6 .\" on Information Processing Systems.
7 .\"
8 .\" Redistribution and use in source and binary forms, with or without
9 .\" modification, are permitted provided that the following conditions
10 .\" are met:
11 .\" 1. Redistributions of source code must retain the above copyright
12 .\" notice, this list of conditions and the following disclaimer.
13 .\" 2. Redistributions in binary form must reproduce the above copyright
14 .\" notice, this list of conditions and the following disclaimer in the
15 .\" documentation and/or other materials provided with the distribution.
16 .\" 4. Neither the name of the University nor the names of its contributors
17 .\" may be used to endorse or promote products derived from this software
18 .\" without specific prior written permission.
19 .\"
20 .\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21 .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 .\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24 .\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 .\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 .\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 .\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 .\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 .\" SUCH DAMAGE.
31 .\"
32 .\" @(#)printf.3 8.1 (Berkeley) 6/4/93
33 .\" $FreeBSD: src/lib/libc/stdio/printf.3,v 1.64 2009/12/02 07:51:25 brueffer Exp $
34 .\"
35 .Dd December 2, 2009
36 .Dt PRINTF 3
37 .Os
38 .Sh NAME
39 .Nm printf , fprintf , sprintf , snprintf , asprintf , dprintf ,
40 .Nm vprintf , vfprintf, vsprintf , vsnprintf , vasprintf, vdprintf
41 .Nd formatted output conversion
42 .Sh LIBRARY
43 .Lb libc
44 .Sh SYNOPSIS
45 .In stdio.h
46 .Ft int
47 .Fn printf "const char * restrict format" ...
48 .Ft int
49 .Fn fprintf "FILE * restrict stream" "const char * restrict format" ...
50 .Ft int
51 .Fn sprintf "char * restrict str" "const char * restrict format" ...
52 .Ft int
53 .Fn snprintf "char * restrict str" "size_t size" "const char * restrict format" ...
54 .Ft int
55 .Fn asprintf "char **ret" "const char *format" ...
56 .Ft int
57 .Fn dprintf "int fd" "const char * restrict format" ...
58 .In stdarg.h
59 .Ft int
60 .Fn vprintf "const char * restrict format" "va_list ap"
61 .Ft int
62 .Fn vfprintf "FILE * restrict stream" "const char * restrict format" "va_list ap"
63 .Ft int
64 .Fn vsprintf "char * restrict str" "const char * restrict format" "va_list ap"
65 .Ft int
66 .Fn vsnprintf "char * restrict str" "size_t size" "const char * restrict format" "va_list ap"
67 .Ft int
68 .Fn vasprintf "char **ret" "const char *format" "va_list ap"
69 .Ft int
70 .Fn vdprintf "int fd" "const char * restrict format" "va_list ap"
71 .Sh DESCRIPTION
72 The
73 .Fn printf
74 family of functions produces output according to a
75 .Fa format
76 as described below.
77 The
78 .Fn printf
79 and
80 .Fn vprintf
81 functions
82 write output to
83 .Dv stdout ,
84 the standard output stream;
85 .Fn fprintf
86 and
87 .Fn vfprintf
88 write output to the given output
89 .Fa stream ;
90 .Fn dprintf
91 and
92 .Fn vdprintf
93 write output to the given file descriptor;
94 .Fn sprintf ,
95 .Fn snprintf ,
96 .Fn vsprintf ,
97 and
98 .Fn vsnprintf
99 write to the character string
100 .Fa s ;
101 and
102 .Fn asprintf
103 and
104 .Fn vasprintf
105 dynamically allocate a new string with
106 .Xr malloc 3 .
107 .Pp
108 Extended locale versions of these functions are documented in
109 .Xr printf_l 3 .
110 See
111 .Xr xlocale 3
112 for more information.
113 .Pp
114 These functions write the output under the control of a
115 .Fa format
116 string that specifies how subsequent arguments
117 (or arguments accessed via the variable-length argument facilities of
118 .Xr stdarg 3 )
119 are converted for output.
120 .Pp
121 These functions return the number of characters printed
122 (not including the trailing
123 .Ql \e0
124 used to end output to strings) or a negative value if an output error occurs,
125 except for
126 .Fn snprintf
127 and
128 .Fn vsnprintf ,
129 which return the number of characters that would have been printed if the
130 .Fa n
131 were unlimited
132 (again, not including the final
133 .Ql \e0 ) .
134 .Pp
135 The
136 .Fn asprintf
137 and
138 .Fn vasprintf
139 functions
140 set
141 .Fa *ret
142 to be a pointer to a buffer sufficiently large to hold the formatted string.
143 This pointer should be passed to
144 .Xr free 3
145 to release the allocated storage when it is no longer needed.
146 If sufficient space cannot be allocated,
147 .Fn asprintf
148 and
149 .Fn vasprintf
150 will return \-1 and set
151 .Fa ret
152 to be a
153 .Dv NULL
154 pointer.
155 .Pp
156 The
157 .Fn snprintf
158 and
159 .Fn vsnprintf
160 functions
161 will write at most
162 .Fa n Ns \-1
163 of the characters printed into the output string
164 (the
165 .Fa n Ns \'th
166 character then gets the terminating
167 .Ql \e0 ) ;
168 if the return value is greater than or equal to the
169 .Fa n
170 argument, the string was too short
171 and some of the printed characters were discarded.
172 The output is always null-terminated.
173 .Pp
174 The
175 .Fn sprintf
176 and
177 .Fn vsprintf
178 functions
179 effectively assume an infinite
180 .Fa n .
181 .Pp
182 For those routines that write to a user-provided character string,
183 that string and the format strings should not overlap, as the
184 behavior is undefined.
185 .Pp
186 The format string is composed of zero or more directives:
187 ordinary
188 .\" multibyte
189 characters (not
190 .Cm % ) ,
191 which are copied unchanged to the output stream;
192 and conversion specifications, each of which results
193 in fetching zero or more subsequent arguments.
194 Each conversion specification is introduced by
195 the
196 .Cm %
197 character.
198 The arguments must correspond properly (after type promotion)
199 with the conversion specifier.
200 After the
201 .Cm % ,
202 the following appear in sequence:
203 .Bl -bullet
204 .It
205 An optional field, consisting of a decimal digit string followed by a
206 .Cm $ ,
207 specifying the next argument to access.
208 If this field is not provided, the argument following the last
209 argument accessed will be used.
210 Arguments are numbered starting at
211 .Cm 1 .
212 If unaccessed arguments in the format string are interspersed with ones that
213 are accessed the results will be indeterminate.
214 .It
215 Zero or more of the following flags:
216 .Bl -tag -width ".So \ Sc (space)"
217 .It Sq Cm #
218 The value should be converted to an
219 .Dq alternate form .
220 For
221 .Cm c , d , i , n , p , s ,
222 and
223 .Cm u
224 conversions, this option has no effect.
225 For
226 .Cm o
227 conversions, the precision of the number is increased to force the first
228 character of the output string to a zero.
229 For
230 .Cm x
231 and
232 .Cm X
233 conversions, a non-zero result has the string
234 .Ql 0x
235 (or
236 .Ql 0X
237 for
238 .Cm X
239 conversions) prepended to it.
240 For
241 .Cm a , A , e , E , f , F , g ,
242 and
243 .Cm G
244 conversions, the result will always contain a decimal point, even if no
245 digits follow it (normally, a decimal point appears in the results of
246 those conversions only if a digit follows).
247 For
248 .Cm g
249 and
250 .Cm G
251 conversions, trailing zeros are not removed from the result as they
252 would otherwise be.
253 .It So Cm 0 Sc (zero)
254 Zero padding.
255 For all conversions except
256 .Cm n ,
257 the converted value is padded on the left with zeros rather than blanks.
258 If a precision is given with a numeric conversion
259 .Cm ( d , i , o , u , i , x ,
260 and
261 .Cm X ) ,
262 the
263 .Cm 0
264 flag is ignored.
265 .It Sq Cm \-
266 A negative field width flag;
267 the converted value is to be left adjusted on the field boundary.
268 Except for
269 .Cm n
270 conversions, the converted value is padded on the right with blanks,
271 rather than on the left with blanks or zeros.
272 A
273 .Cm \-
274 overrides a
275 .Cm 0
276 if both are given.
277 .It So "\ " Sc (space)
278 A blank should be left before a positive number
279 produced by a signed conversion
280 .Cm ( a , A , d , e , E , f , F , g , G ,
281 or
282 .Cm i ) .
283 .It Sq Cm +
284 A sign must always be placed before a
285 number produced by a signed conversion.
286 A
287 .Cm +
288 overrides a space if both are used.
289 .It Sq Cm '
290 Decimal conversions
291 .Cm ( d , u ,
292 or
293 .Cm i )
294 or the integral portion of a floating point conversion
295 .Cm ( f
296 or
297 .Cm F )
298 should be grouped and separated by thousands using
299 the non-monetary separator returned by
300 .Xr localeconv 3 .
301 .El
302 .It
303 An optional separator character (
304 .Cm \ , | \; | \ : | _
305 ) used for separating multiple values when printing an AltiVec or SSE vector,
306 or other multi-value unit.
307 .Pp
308 NOTE: This is an extension to the
309 .Fn printf
310 specification.
311 Behaviour of these values for
312 .Fn printf
313 is only defined for operating systems conforming to the
314 AltiVec Technology Programming Interface Manual.
315 (At time of writing this includes only Mac OS X 10.2 and later.)
316 .It
317 An optional decimal digit string specifying a minimum field width.
318 If the converted value has fewer characters than the field width, it will
319 be padded with spaces on the left (or right, if the left-adjustment
320 flag has been given) to fill out
321 the field width.
322 .It
323 An optional precision, in the form of a period
324 .Cm \&.
325 followed by an
326 optional digit string.
327 If the digit string is omitted, the precision is taken as zero.
328 This gives the minimum number of digits to appear for
329 .Cm d , i , o , u , x ,
330 and
331 .Cm X
332 conversions, the number of digits to appear after the decimal-point for
333 .Cm a , A , e , E , f ,
334 and
335 .Cm F
336 conversions, the maximum number of significant digits for
337 .Cm g
338 and
339 .Cm G
340 conversions, or the maximum number of characters to be printed from a
341 string for
342 .Cm s
343 conversions.
344 .It
345 An optional length modifier, that specifies the size of the argument.
346 The following length modifiers are valid for the
347 .Cm d , i , n , o , u , x ,
348 or
349 .Cm X
350 conversion:
351 .Bl -column ".Cm q Em (deprecated)" ".Vt signed char" ".Vt unsigned long long" ".Vt long long *"
352 .It Sy Modifier Ta Cm d , i Ta Cm o , u , x , X Ta Cm n
353 .It Cm hh Ta Vt "signed char" Ta Vt "unsigned char" Ta Vt "signed char *"
354 .It Cm h Ta Vt short Ta Vt "unsigned short" Ta Vt "short *"
355 .It Cm l No (ell) Ta Vt long Ta Vt "unsigned long" Ta Vt "long *"
356 .It Cm ll No (ell ell) Ta Vt "long long" Ta Vt "unsigned long long" Ta Vt "long long *"
357 .It Cm j Ta Vt intmax_t Ta Vt uintmax_t Ta Vt "intmax_t *"
358 .It Cm t Ta Vt ptrdiff_t Ta (see note) Ta Vt "ptrdiff_t *"
359 .It Cm z Ta (see note) Ta Vt size_t Ta (see note)
360 .It Cm q Em (deprecated) Ta Vt quad_t Ta Vt u_quad_t Ta Vt "quad_t *"
361 .El
362 .Pp
363 Note:
364 the
365 .Cm t
366 modifier, when applied to a
367 .Cm o , u , x ,
368 or
369 .Cm X
370 conversion, indicates that the argument is of an unsigned type
371 equivalent in size to a
372 .Vt ptrdiff_t .
373 The
374 .Cm z
375 modifier, when applied to a
376 .Cm d
377 or
378 .Cm i
379 conversion, indicates that the argument is of a signed type equivalent in
380 size to a
381 .Vt size_t .
382 Similarly, when applied to an
383 .Cm n
384 conversion, it indicates that the argument is a pointer to a signed type
385 equivalent in size to a
386 .Vt size_t .
387 .Pp
388 The following length modifier is valid for the
389 .Cm a , A , e , E , f , F , g ,
390 or
391 .Cm G
392 conversion:
393 .Bl -column ".Sy Modifier" ".Cm a , A , e , E , f , F , g , G"
394 .It Sy Modifier Ta Cm a , A , e , E , f , F , g , G
395 .It Cm l No (ell) Ta Vt double
396 (ignored, same behavior as without it)
397 .It Cm L Ta Vt "long double"
398 .El
399 .Pp
400 The following length modifier is valid for the
401 .Cm c
402 or
403 .Cm s
404 conversion:
405 .Bl -column ".Sy Modifier" ".Vt wint_t" ".Vt wchar_t *"
406 .It Sy Modifier Ta Cm c Ta Cm s
407 .It Cm l No (ell) Ta Vt wint_t Ta Vt "wchar_t *"
408 .El
409 .Pp
410 The AltiVec Technology Programming Interface Manual also defines five additional length modifiers
411 which can be used (in place of the conventional length modifiers) for the printing of AltiVec or SSE vectors:
412 .Bl -tag -compact
413 .It Cm v
414 Treat the argument as a vector value, unit length will be determined by the conversion
415 specifier (default = 16 8-bit units for all integer conversions,
416 4 32-bit units for floating point conversions).
417 .It Cm vh, hv
418 Treat the argument as a vector of 8 16-bit units.
419 .It Cm vl, lv
420 Treat the argument as a vector of 4 32-bit units.
421 .El
422 .Pp
423 NOTE: The vector length specifiers are extensions to the
424 .Fn printf
425 specification.
426 Behaviour of these values for
427 .Fn printf
428 is only defined for operating systems conforming to the
429 AltiVec Technology Programming Interface Manual.
430 (At time of writing this includes only Mac OS X 10.2 and later.)
431 .Pp
432 As a further extension, for SSE2 64-bit units:
433 .Bl -tag -compact
434 .It Cm vll, llv
435 Treat the argument as a vector of 2 64-bit units.
436 .El
437 .It
438 A character that specifies the type of conversion to be applied.
439 .El
440 .Pp
441 A field width or precision, or both, may be indicated by
442 an asterisk
443 .Ql *
444 or an asterisk followed by one or more decimal digits and a
445 .Ql $
446 instead of a
447 digit string.
448 In this case, an
449 .Vt int
450 argument supplies the field width or precision.
451 A negative field width is treated as a left adjustment flag followed by a
452 positive field width; a negative precision is treated as though it were
453 missing.
454 If a single format directive mixes positional
455 .Pq Li nn$
456 and non-positional arguments, the results are undefined.
457 .Pp
458 The conversion specifiers and their meanings are:
459 .Bl -tag -width ".Cm diouxX"
460 .It Cm diouxX
461 The
462 .Vt int
463 (or appropriate variant) argument is converted to signed decimal
464 .Cm ( d
465 and
466 .Cm i ) ,
467 unsigned octal
468 .Pq Cm o ,
469 unsigned decimal
470 .Pq Cm u ,
471 or unsigned hexadecimal
472 .Cm ( x
473 and
474 .Cm X )
475 notation.
476 The letters
477 .Dq Li abcdef
478 are used for
479 .Cm x
480 conversions; the letters
481 .Dq Li ABCDEF
482 are used for
483 .Cm X
484 conversions.
485 The precision, if any, gives the minimum number of digits that must
486 appear; if the converted value requires fewer digits, it is padded on
487 the left with zeros.
488 .It Cm DOU
489 The
490 .Vt "long int"
491 argument is converted to signed decimal, unsigned octal, or unsigned
492 decimal, as if the format had been
493 .Cm ld , lo ,
494 or
495 .Cm lu
496 respectively.
497 These conversion characters are deprecated, and will eventually disappear.
498 .It Cm eE
499 The
500 .Vt double
501 argument is rounded and converted in the style
502 .Sm off
503 .Oo \- Oc Ar d Li \&. Ar ddd Li e \\*[Pm] Ar dd
504 .Sm on
505 where there is one digit before the
506 decimal-point character
507 and the number of digits after it is equal to the precision;
508 if the precision is missing,
509 it is taken as 6; if the precision is
510 zero, no decimal-point character appears.
511 An
512 .Cm E
513 conversion uses the letter
514 .Ql E
515 (rather than
516 .Ql e )
517 to introduce the exponent.
518 The exponent always contains at least two digits; if the value is zero,
519 the exponent is 00.
520 .Pp
521 For
522 .Cm a , A , e , E , f , F , g ,
523 and
524 .Cm G
525 conversions, positive and negative infinity are represented as
526 .Li inf
527 and
528 .Li -inf
529 respectively when using the lowercase conversion character, and
530 .Li INF
531 and
532 .Li -INF
533 respectively when using the uppercase conversion character.
534 Similarly, NaN is represented as
535 .Li nan
536 when using the lowercase conversion, and
537 .Li NAN
538 when using the uppercase conversion.
539 .It Cm fF
540 The
541 .Vt double
542 argument is rounded and converted to decimal notation in the style
543 .Sm off
544 .Oo \- Oc Ar ddd Li \&. Ar ddd ,
545 .Sm on
546 where the number of digits after the decimal-point character
547 is equal to the precision specification.
548 If the precision is missing, it is taken as 6; if the precision is
549 explicitly zero, no decimal-point character appears.
550 If a decimal point appears, at least one digit appears before it.
551 .It Cm gG
552 The
553 .Vt double
554 argument is converted in style
555 .Cm f
556 or
557 .Cm e
558 (or
559 .Cm F
560 or
561 .Cm E
562 for
563 .Cm G
564 conversions).
565 The precision specifies the number of significant digits.
566 If the precision is missing, 6 digits are given; if the precision is zero,
567 it is treated as 1.
568 Style
569 .Cm e
570 is used if the exponent from its conversion is less than \-4 or greater than
571 or equal to the precision.
572 Trailing zeros are removed from the fractional part of the result; a
573 decimal point appears only if it is followed by at least one digit.
574 .It Cm aA
575 The
576 .Vt double
577 argument is rounded and converted to hexadecimal notation in the style
578 .Sm off
579 .Oo \- Oc Li 0x Ar h Li \&. Ar hhhp Oo \\*[Pm] Oc Ar d ,
580 .Sm on
581 where the number of digits after the hexadecimal-point character
582 is equal to the precision specification.
583 If the precision is missing, it is taken as enough to represent
584 the floating-point number exactly, and no rounding occurs.
585 If the precision is zero, no hexadecimal-point character appears.
586 The
587 .Cm p
588 is a literal character
589 .Ql p ,
590 and the exponent consists of a positive or negative sign
591 followed by a decimal number representing an exponent of 2.
592 The
593 .Cm A
594 conversion uses the prefix
595 .Dq Li 0X
596 (rather than
597 .Dq Li 0x ) ,
598 the letters
599 .Dq Li ABCDEF
600 (rather than
601 .Dq Li abcdef )
602 to represent the hex digits, and the letter
603 .Ql P
604 (rather than
605 .Ql p )
606 to separate the mantissa and exponent.
607 .Pp
608 Note that there may be multiple valid ways to represent floating-point
609 numbers in this hexadecimal format.
610 For example,
611 .Li 0x1.92p+1 , 0x3.24p+0 , 0x6.48p-1 ,
612 and
613 .Li 0xc.9p-2
614 are all equivalent.
615 The format chosen depends on the internal representation of the
616 number, but the implementation guarantees that the length of the
617 mantissa will be minimized.
618 Zeroes are always represented with a mantissa of 0 (preceded by a
619 .Ql -
620 if appropriate) and an exponent of
621 .Li +0 .
622 .It Cm C
623 Treated as
624 .Cm c
625 with the
626 .Cm l
627 (ell) modifier.
628 .It Cm c
629 The
630 .Vt int
631 argument is converted to an
632 .Vt "unsigned char" ,
633 and the resulting character is written.
634 .Pp
635 If the
636 .Cm l
637 (ell) modifier is used, the
638 .Vt wint_t
639 argument shall be converted to a
640 .Vt wchar_t ,
641 and the (potentially multi-byte) sequence representing the
642 single wide character is written, including any shift sequences.
643 If a shift sequence is used, the shift state is also restored
644 to the original state after the character.
645 .It Cm S
646 Treated as
647 .Cm s
648 with the
649 .Cm l
650 (ell) modifier.
651 .It Cm s
652 The
653 .Vt "char *"
654 argument is expected to be a pointer to an array of character type (pointer
655 to a string).
656 Characters from the array are written up to (but not including)
657 a terminating
658 .Dv NUL
659 character;
660 if a precision is specified, no more than the number specified are
661 written.
662 If a precision is given, no null character
663 need be present; if the precision is not specified, or is greater than
664 the size of the array, the array must contain a terminating
665 .Dv NUL
666 character.
667 .Pp
668 If the
669 .Cm l
670 (ell) modifier is used, the
671 .Vt "wchar_t *"
672 argument is expected to be a pointer to an array of wide characters
673 (pointer to a wide string).
674 For each wide character in the string, the (potentially multi-byte)
675 sequence representing the
676 wide character is written, including any shift sequences.
677 If any shift sequence is used, the shift state is also restored
678 to the original state after the string.
679 Wide characters from the array are written up to (but not including)
680 a terminating wide
681 .Dv NUL
682 character;
683 if a precision is specified, no more than the number of bytes specified are
684 written (including shift sequences).
685 Partial characters are never written.
686 If a precision is given, no null character
687 need be present; if the precision is not specified, or is greater than
688 the number of bytes required to render the multibyte representation of
689 the string, the array must contain a terminating wide
690 .Dv NUL
691 character.
692 .It Cm p
693 The
694 .Vt "void *"
695 pointer argument is printed in hexadecimal (as if by
696 .Ql %#x
697 or
698 .Ql %#lx ) .
699 .It Cm n
700 The number of characters written so far is stored into the
701 integer indicated by the
702 .Vt "int *"
703 (or variant) pointer argument.
704 No argument is converted.
705 .It Cm %
706 A
707 .Ql %
708 is written.
709 No argument is converted.
710 The complete conversion specification
711 is
712 .Ql %% .
713 .El
714 .Pp
715 The decimal point
716 character is defined in the program's locale (category
717 .Dv LC_NUMERIC ) .
718 .Pp
719 In no case does a non-existent or small field width cause truncation of
720 a numeric field; if the result of a conversion is wider than the field
721 width, the
722 field is expanded to contain the conversion result.
723 .Sh EXAMPLES
724 To print a date and time in the form
725 .Dq Li "Sunday, July 3, 10:02" ,
726 where
727 .Fa weekday
728 and
729 .Fa month
730 are pointers to strings:
731 .Bd -literal -offset indent
732 #include <stdio.h>
733 fprintf(stdout, "%s, %s %d, %.2d:%.2d\en",
734 weekday, month, day, hour, min);
735 .Ed
736 .Pp
737 To print \*(Pi
738 to five decimal places:
739 .Bd -literal -offset indent
740 #include <math.h>
741 #include <stdio.h>
742 fprintf(stdout, "pi = %.5f\en", 4 * atan(1.0));
743 .Ed
744 .Pp
745 To allocate a 128 byte string and print into it:
746 .Bd -literal -offset indent
747 #include <stdio.h>
748 #include <stdlib.h>
749 #include <stdarg.h>
750 char *newfmt(const char *fmt, ...)
751 {
752 char *p;
753 va_list ap;
754 if ((p = malloc(128)) == NULL)
755 return (NULL);
756 va_start(ap, fmt);
757 (void) vsnprintf(p, 128, fmt, ap);
758 va_end(ap);
759 return (p);
760 }
761 .Ed
762 .Sh SECURITY CONSIDERATIONS
763 The
764 .Fn sprintf
765 and
766 .Fn vsprintf
767 functions are easily misused in a manner which enables malicious users
768 to arbitrarily change a running program's functionality through
769 a buffer overflow attack.
770 Because
771 .Fn sprintf
772 and
773 .Fn vsprintf
774 assume an infinitely long string,
775 callers must be careful not to overflow the actual space;
776 this is often hard to assure.
777 For safety, programmers should use the
778 .Fn snprintf
779 interface instead.
780 For example:
781 .Bd -literal
782 void
783 foo(const char *arbitrary_string, const char *and_another)
784 {
785 char onstack[8];
786
787 #ifdef BAD
788 /*
789 * This first sprintf is bad behavior. Do not use sprintf!
790 */
791 sprintf(onstack, "%s, %s", arbitrary_string, and_another);
792 #else
793 /*
794 * The following two lines demonstrate better use of
795 * snprintf().
796 */
797 snprintf(onstack, sizeof(onstack), "%s, %s", arbitrary_string,
798 and_another);
799 #endif
800 }
801 .Ed
802 .Pp
803 The
804 .Fn printf
805 and
806 .Fn sprintf
807 family of functions are also easily misused in a manner
808 allowing malicious users to arbitrarily change a running program's
809 functionality by either causing the program
810 to print potentially sensitive data
811 .Dq "left on the stack" ,
812 or causing it to generate a memory fault or bus error
813 by dereferencing an invalid pointer.
814 .Pp
815 .Cm %n
816 can be used to write arbitrary data to potentially carefully-selected
817 addresses.
818 Programmers are therefore strongly advised to never pass untrusted strings
819 as the
820 .Fa format
821 argument, as an attacker can put format specifiers in the string
822 to mangle your stack,
823 leading to a possible security hole.
824 This holds true even if the string was built using a function like
825 .Fn snprintf ,
826 as the resulting string may still contain user-supplied conversion specifiers
827 for later interpolation by
828 .Fn printf .
829 .Pp
830 Always use the proper secure idiom:
831 .Pp
832 .Dl "snprintf(buffer, sizeof(buffer), \*q%s\*q, string);"
833 .Sh COMPATIBILITY
834 The conversion formats
835 .Cm \&%D , \&%O ,
836 and
837 .Cm %U
838 are not standard and
839 are provided only for backward compatibility.
840 The effect of padding the
841 .Cm %p
842 format with zeros (either by the
843 .Cm 0
844 flag or by specifying a precision), and the benign effect (i.e., none)
845 of the
846 .Cm #
847 flag on
848 .Cm %n
849 and
850 .Cm %p
851 conversions, as well as other
852 nonsensical combinations such as
853 .Cm %Ld ,
854 are not standard; such combinations
855 should be avoided.
856 .Sh ERRORS
857 In addition to the errors documented for the
858 .Xr write 2
859 system call, the
860 .Fn printf
861 family of functions may fail if:
862 .Bl -tag -width Er
863 .It Bq Er EILSEQ
864 An invalid wide character code was encountered.
865 .It Bq Er ENOMEM
866 Insufficient storage space is available.
867 .El
868 .Sh SEE ALSO
869 .Xr printf 1 ,
870 .Xr printf_l 3 ,
871 .Xr fmtcheck 3 ,
872 .Xr scanf 3 ,
873 .Xr setlocale 3 ,
874 .Xr stdarg 3 ,
875 .Xr wprintf 3
876 .Sh STANDARDS
877 Subject to the caveats noted in the
878 .Sx BUGS
879 section below, the
880 .Fn fprintf ,
881 .Fn printf ,
882 .Fn sprintf ,
883 .Fn vprintf ,
884 .Fn vfprintf ,
885 and
886 .Fn vsprintf
887 functions
888 conform to
889 .St -ansiC
890 and
891 .St -isoC-99 .
892 With the same reservation, the
893 .Fn snprintf
894 and
895 .Fn vsnprintf
896 functions conform to
897 .St -isoC-99 ,
898 while
899 .Fn dprintf
900 and
901 .Fn vdprintf
902 conform to
903 .St -p1003.1-2008 .
904 .Sh HISTORY
905 The functions
906 .Fn asprintf
907 and
908 .Fn vasprintf
909 first appeared in the
910 .Tn GNU C
911 library.
912 These were implemented by
913 .An Peter Wemm Aq peter@FreeBSD.org
914 in
915 .Fx 2.2 ,
916 but were later replaced with a different implementation
917 from
918 .An Todd C. Miller Aq Todd.Miller@courtesan.com
919 for
920 .Ox 2.3 .
921 The
922 .Fn dprintf
923 and
924 .Fn vdprintf
925 functions were added in
926 .Fx 8.0 .
927 .Sh BUGS
928 The
929 .Nm
930 family of functions do not correctly handle multibyte characters in the
931 .Fa format
932 argument.