queries.c revision 1.1 1 1.1 rillig /* $NetBSD: queries.c,v 1.1 2022/07/05 22:50:41 rillig Exp $ */
2 1.1 rillig # 3 "queries.c"
3 1.1 rillig
4 1.1 rillig /*
5 1.1 rillig * Demonstrate the case-by-case queries. Unlike warnings, queries do not
6 1.1 rillig * point to questionable code but rather to code that may be interesting to
7 1.1 rillig * inspect manually on a case-by-case basis.
8 1.1 rillig *
9 1.1 rillig * Possible use cases are:
10 1.1 rillig *
11 1.1 rillig * Understanding how C works internally, by making the usual arithmetic
12 1.1 rillig * conversions visible.
13 1.1 rillig *
14 1.1 rillig * Finding code that intentionally suppresses a regular lint warning,
15 1.1 rillig * such as casts between arithmetic types.
16 1.1 rillig */
17 1.1 rillig
18 1.1 rillig /* lint1-extra-flags: -q 1,2,3,4,5,6,7 */
19 1.1 rillig
20 1.1 rillig int
21 1.1 rillig Q1(double dbl)
22 1.1 rillig {
23 1.1 rillig /* expect+1: implicit conversion from floating point 'double' to integer 'int' [Q1] */
24 1.1 rillig return dbl;
25 1.1 rillig }
26 1.1 rillig
27 1.1 rillig int
28 1.1 rillig Q2(double dbl)
29 1.1 rillig {
30 1.1 rillig /* expect+2: cast from floating point 'double' to integer 'int' [Q2] */
31 1.1 rillig /* expect+1: redundant cast from 'double' to 'int' before assignment [Q7] */
32 1.1 rillig return (int)dbl;
33 1.1 rillig }
34 1.1 rillig
35 1.1 rillig void
36 1.1 rillig Q3(int i, unsigned u)
37 1.1 rillig {
38 1.1 rillig /* expect+1: implicit conversion changes sign from 'int' to 'unsigned int' [Q3] */
39 1.1 rillig u = i;
40 1.1 rillig
41 1.1 rillig /* expect+1: implicit conversion changes sign from 'unsigned int' to 'int' [Q3] */
42 1.1 rillig i = u;
43 1.1 rillig }
44 1.1 rillig
45 1.1 rillig unsigned long long
46 1.1 rillig Q4(char *ptr, int i, unsigned long long ull)
47 1.1 rillig {
48 1.1 rillig /*
49 1.1 rillig * The conversion from 'char' to 'int' is done by the integer
50 1.1 rillig * promotions (C11 6.3.1.1p2), not by the usual arithmetic
51 1.1 rillig * conversions (C11 6.3.1.8p1).
52 1.1 rillig */
53 1.1 rillig /* expect+2: usual arithmetic conversion for '+' from 'int' to 'unsigned long long' [Q4] */
54 1.1 rillig /* expect+1: implicit conversion changes sign from 'int' to 'unsigned long long' [Q3] */
55 1.1 rillig return ptr[0] + ptr[1] + i + ull;
56 1.1 rillig }
57 1.1 rillig
58 1.1 rillig void
59 1.1 rillig Q5(char *ptr, int i)
60 1.1 rillig {
61 1.1 rillig if (ptr + i > ptr)
62 1.1 rillig return;
63 1.1 rillig
64 1.1 rillig /* expect+1: pointer addition has integer on the left-hand side [Q5] */
65 1.1 rillig if (i + ptr > ptr)
66 1.1 rillig return;
67 1.1 rillig
68 1.1 rillig if (ptr[i] != '\0')
69 1.1 rillig return;
70 1.1 rillig
71 1.1 rillig /* expect+1: pointer addition has integer on the left-hand side [Q5] */
72 1.1 rillig if (i[ptr] != '\0')
73 1.1 rillig return;
74 1.1 rillig }
75 1.1 rillig
76 1.1 rillig void
77 1.1 rillig Q6(int i)
78 1.1 rillig {
79 1.1 rillig /* expect+1: no-op cast from 'int' to 'int' [Q6] */
80 1.1 rillig i = (int)4;
81 1.1 rillig
82 1.1 rillig /* expect+1: no-op cast from 'int' to 'int' [Q6] */
83 1.1 rillig i = (int)i + 1;
84 1.1 rillig }
85 1.1 rillig
86 1.1 rillig extern void *allocate(unsigned long);
87 1.1 rillig
88 1.1 rillig char *
89 1.1 rillig Q7(void)
90 1.1 rillig {
91 1.1 rillig /* expect+1: redundant cast from 'pointer to void' to 'pointer to char' before assignment [Q7] */
92 1.1 rillig char *str = (char *)allocate(64);
93 1.1 rillig
94 1.1 rillig if (str == (void *)0)
95 1.1 rillig /* expect+1: redundant cast from 'pointer to void' to 'pointer to char' before assignment [Q7] */
96 1.1 rillig str = (char *)allocate(64);
97 1.1 rillig
98 1.1 rillig return str;
99 1.1 rillig }
100 1.1 rillig
101 1.1 rillig
102 1.1 rillig /*
103 1.1 rillig * Since queries do not affect the exit status, force a warning to make this
104 1.1 rillig * test conform to the general expectation that a test that produces output
105 1.1 rillig * exits non-successfully.
106 1.1 rillig */
107 1.1 rillig /* expect+1: warning: static variable 'unused' unused [226] */
108 1.1 rillig static int unused;
109