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