read_printf.ln revision 1.2
11.2Srillig# $NetBSD: read_printf.ln,v 1.2 2021/08/08 11:07:19 rillig Exp $
21.1Srillig#
31.1Srillig# Test reading of declarations and usage of printf-like functions.
41.1Srillig
51.1Srillig# void my_printf(const char *, ...);
61.1Srillig0sprintf-def.c
71.1SrilligSprintf-def.c
81.1Srillig3d0.3d9my_printfF2PcCEV
91.1Srillig
101.1Srillig0sprintf-use.c
111.1SrilligSprintf-use.c
121.1Srillig
131.1Srillig# my_printf("string %s", "string %s%%%3d");
141.1Srillig#
151.1Srillig# Argument 1 is converted to 'const char *', due to the function prototype.
161.1Srillig# After that, is it not a string literal anymore, therefore no information
171.1Srillig# about this argument is written to the .ln file.
181.1Srillig#
191.1Srillig# Argument 2 is part of the '...', therefore no conversion to 'const char *'
201.1Srillig# takes place.  Since it is still the address of a string, its value is
211.1Srillig# analyzed for printf format specifiers.  This is unnecessary though since in
221.1Srillig# this example, the format string is already in argument 1, but not 2.
231.1Srillig11c0.11 s2"%s%%%3d" i 9my_printf f2 PcC PC V
241.1Srillig
251.1Srillig# my_printf("int %d", 12345);
261.1Srillig#
271.1Srillig# Argument 2 is a positive integer.
281.1Srillig12c0.12 p2 i 9my_printf f2 PcC I V
291.1Srillig
301.1Srillig# my_printf("%s %d %p", "\t", -6, (const void *)0);
311.1Srillig#
321.1Srillig# Argument 2 is a string without any printf-like format specifiers.
331.1Srillig# Argument 3 is a negative integer.
341.1Srillig# Argument 4 has no further interesting properties.
351.1Srillig13c0.13 s2"" n3 i 9my_printf f4 PcC PC I PcV V
361.2Srillig
371.2Srillig# See tests/lint1/emit.c, function cover_outqchar.
381.2Srillig161c0.161 s2"%" i 9my_printf f2 PcC PC V
391.2Srillig162c0.162 s2"%s"i 9my_printf f2 PcC PC V
401.2Srillig163c0.163 s2"%%" i 9my_printf f2 PcC PC V
411.2Srillig164c0.164 s2"%\a%\b%\f%\n%\r%\t%\v%\177" i 9my_printf f2 PcC PC V
42