Fix X509_PUBKEY_cmp(), move to crypto/x509/x_pubkey.c, rename, export, and document it
[openssl.git] / util / check-format-test-positives.c
1 /*
2  * Copyright 2007-2020 The OpenSSL Project Authors. All Rights Reserved.
3  * Copyright Nokia 2007-2019
4  * Copyright Siemens AG 2015-2019
5  *
6  * Licensed under the Apache License 2.0 (the "License").  You may not use
7  * this file except in compliance with the License.  You can obtain a copy
8  * in the file LICENSE in the source distribution or at
9  * https://www.openssl.org/source/license.html
10  */
11
12 /*
13  * This demonstrates/tests cases where check-format.pl should report issues.
14  * Some of the reports are due to sanity checks for proper nesting of comment
15  * delimiters and parenthesis-like symbols, e.g., on unexpected/unclosed braces.
16  */
17
18 /*
19  * The '@'s after '*' are used for self-tests: they mark lines containing
20  * a single flaw that should be reported. Normally it should be reported
21  * while handling the given line, but in case of delayed checks there is a
22  * following digit indicating the number of reports expected for this line.
23  */
24
25 /* For each of the following set of lines the tool should complain once */
26 /*@ tab character:       */
27 /*@ intra-line carriage return character: \r */
28 /*@ non-printable ASCII character: \b */
29 /*@ non-ASCII character: รค */
30 /*@ whitespace at EOL: */ 
31 // /*@ end-of-line comment style not allowed (for C90 compatibility) */
32  /*@0 intra-line comment indent off by 1, reported unless sloppy-cmt */
33 /*X */ /*@2 no space nor '*' after comment start, reported unless sloppy-spc */
34 /* X*/ /*@ no space before comment end , reported unless sloppy-spc */
35 /*@ comment starting delimiter: /* inside intra-line comment */
36  /*@0
37   *@ above multi-line comment start indent off by 1, reported unless sloppy-cmt; this comment line is too long
38    *@ multi-line comment indent further off by 1 relative to comment start
39   *@ multi-line comment ending with text on last line */
40 /*@2 multi-line comment starting with text on first line
41  *@ comment starting delimiter: /* inside multi-line comment
42 *@ multi-line comment indent off by -1
43  *X*@ no spc after leading '*' in multi-line comment, reported unless sloppy-spc
44  *@0 more than two spaces after .   in comment, reported unless sloppy-spc
45 */ /*@2 multi-line comment end indent off by -1 (relative to comment start) */
46 */ /*@ unexpected comment ending delimiter outside comment */
47 /*@ comment line is 4 columns tooooooooooooooooo wide, reported unless sloppy-len */
48 /*@ comment line is 5 columns toooooooooooooooooooooooooooooooooooooooooooooo wide */
49 #define X   1       /*@0 double space false negative due to coincidence */
50  #define Y  2       /*@ indent of preprocessor directive off by 1 (must be 0) */
51 typedef struct  {   /*@0 double space in code, reported unless sloppy-spc */
52     enum {          /*@1 double space  in comment, reported unless sloppy-spc */
53            w = 0 /*@2 hanging expr indent off by 1, or 3 for lines after '{' */
54              && 1,  /*@ hanging expr indent off by 3, or -1 for leading '&&' */
55          x = 1,     /*@ hanging expr indent off by -1 */
56           y,z       /*@ no space after ',', reported unless sloppy-spc */
57     } e_member ;    /*@ space before ';', reported unless sloppy-spc */
58     int v[1;        /*@ unclosed bracket in type declaration */
59    union {          /*@ statement/type declaration indent off by -1 */
60         struct{} s; /*@ no space before '{', reported unless sloppy-spc */
61     }u_member;      /*@ no space after '}', reported unless sloppy-spc */
62     } s_type;       /*@ statement/type declaration indent off by 4 */
63 int* somefunc();    /*@ no space before '*' in type decl, r unless sloppy-spc */
64 void main(int n) {  /*@ opening brace at end of function definition header */
65     for (;;n++) {   /*@ no space after ';', reported unless sloppy-spc */
66         return;     /*@0 (1-line) single statement in braces */
67     }}              /*@2 code after '}' outside expr */
68 }                   /*@ unexpected closing brace (too many '}') outside expr */
69 )                   /*@ unexpected closing paren outside expr */
70 #endif              /*@ unexpected #endif */
71 int f (int a,       /*@ space after fn before '(', reported unless sloppy-spc */
72       int b,        /*@ hanging expr indent off by -1 */
73        long l)      /*@ one-letter name 'l' */
74 { int               /*@ code after '{' opening a block */
75     xx = 1) +       /*@ unexpected closing parenthesis */
76         2] -        /*@ unexpected closing bracket */
77         3: *        /*@ unexpected ':' (without preceding '?') within expr */
78         4};         /*@ unexpected closing brace within expression */
79     char y[] = {    /*@0 unclosed brace within initializer/enum expression */
80         1* 1,       /*@ no space etc. before '*', reported unless sloppy-spc */
81          2,         /*@ hanging expr indent (for lines after '{') off by 1 */
82         (xx         /*@0 unclosed parenthesis in expression */
83          ? y        /*@0 unclosed '? (conditional expression) */
84          [0;        /*@4 unclosed bracket in expression */
85    s_type s;        /*@ local variable declaration indent off by -1 */
86    somefunc(a,      /*@ statement indent off by -1 */
87           "aligned" /*@ expr indent off by -2 accepted if sloppy-hang */ "right"
88            , b,     /*@ expr indent off by -1 */
89            b,       /*@ expr indent as on line above, accepted if sloppy-hang */
90     b, /*@ expr indent off -8 but @ extra indent accepted if sloppy-hang */
91    "again aligned" /*@ expr indent off by -9 (left of stmt indent, */ "right",
92             123 == /*@ .. so reported also with sloppy-hang; this line is too long */ 456
93 # define MAC(A) (A) /*@ nesting indent of preprocessor directive off by 1 */
94              ? 1    /*@ hanging expr indent off by 1 */
95               : 2); /*@ hanging expr indent off by 2, or 1 for leading ':' */
96     if(a            /*@ no space after 'if', reported unless sloppy-spc */
97           /*@0 intra-line comment indent off by -1 (not: by 3 due to '&&') */
98            && ! 0   /*@2 space after '!', reported unless sloppy-spc */
99          || b ==    /*@ hanging expr indent off by 2, or -2 for leading '||' */
100        (xx+= 2) +   /*@ no space before '+=', reported unless sloppy-spc */
101        (a^ 1) +     /*@ no space before '^', reported unless sloppy-spc */
102        a %2 /       /*@ no space after '%', reported unless sloppy-spc */
103        1 +/* */     /*@ no space before comment, reported unless sloppy-spc */
104        /* */+       /*@ no space after comment, reported unless sloppy-spc */
105        s. e_member) /*@ space after '.', reported unless sloppy-spc */
106          xx = a + b /*@ extra single-statement indent off by 1 */
107                + 0; /*@ two times extra single-statement indent off by 3 */
108     if (a ++)       /*@ space before postfix '++', reported unless sloppy-spc */
109     {               /*@ {' not on same line as preceding 'if' */
110         c;          /*@0 single stmt in braces, reported on 1-stmt */
111     } else          /*@ no '{' on same line after '} else' */
112       {             /*@ statement indent off by 2 */
113         d;          /*@0 single stmt in braces, reported on 1-stmt */
114           }         /*@ statement indent off by 6 */
115     if (1) f(a,     /*@ (non-brace) code after end of 'if' condition */
116              b); else /*@ (non-brace) code before 'else' */
117         do f(c, c); /*@ (non-brace) code after 'do' */
118         while ( 2); /*@ space after '(', reported unless sloppy-spc */
119     b; c;           /*@ more than one statement per line */
120     do{             /*@ no space before '{', reported unless sloppy-spc */
121         f (3,       /*@ space after fn before '(', reported unless sloppy-spc */
122            4);      /*@0 false negative: should report single stmt in braces */
123     }               /*@0 'while' not on same line as preceding '}' */
124     while (a+ 0);   /*@2 no space before '+', reported unless sloppy-spc */
125     switch (b ) {   /*@ space before ')', reported unless sloppy-spc */
126    case 1:          /*@ 'case' special statement indent off by -1 */
127     case(2):        /*@ no space after 'case', reported unless sloppy-spc */
128     default: ;      /*@ code after 'default:' */
129 }                   /*@ statement indent off by -4 */
130   label:            /*@ label special statement indent off by 1 */
131     return(         /*@ no space after 'return', reported unless sloppy-spc */
132            x); }    /*@ code before block-level '}' */
133 /* Here the tool should stop complaining apart from the below issues at EOF */
134
135 void f_looong_body()
136 {
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338 }                   /*@ function body length > 200 lines */
339
340 #if 0               /*@0 unclosed #if */
341 struct t {          /*@0 unclosed brace at decl/block level */
342     enum {          /*@0 unclosed brace at enum/expression level */
343           v = (1    /*@0 unclosed parenthesis */
344                etyp /*@0 empty line follows just before EOF: */
345