]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - www/analyzer/potential_checkers.html
Vendor import of clang trunk r238337:
[FreeBSD/FreeBSD.git] / www / analyzer / potential_checkers.html
1 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
2           "http://www.w3.org/TR/html4/strict.dtd">
3 <html>
4 <head>
5   <title>List of potential checkers</title>
6   <link type="text/css" rel="stylesheet" href="content.css">
7   <link type="text/css" rel="stylesheet" href="menu.css">
8   <script type="text/javascript" src="scripts/expandcollapse.js"></script>
9   <script type="text/javascript" src="scripts/menu.js"></script>
10 </head>
11 <body onload="initExpandCollapse()">
12
13 <div id="page">
14
15 <!-- menu -->
16 <!--#include virtual="menu.html.incl"-->
17 <!-- page content -->
18 <div id="content">
19 <h1>List of potential checkers</h1>
20
21 <p>This page contains a list of potential checkers to implement in the static analyzer.  If you are interested in contributing to the analyzer's development, this is a good resource to help you get started.  The specific names of the checkers are subject to review, and are provided here as suggestions.</p>
22
23 <!-- ========================= allocation/deallocation ======================= -->
24 <h3>memory</h3>
25 <table class="checkers">
26 <col class="namedescr"><col class="example"><col class="progress">
27 <thead><tr><td>Name, Description</td><td>Example</td><td>Progress</td></tr></thead>
28
29 <tr><td><div class="namedescr expandable"><span class="name">
30 memory.LeakEvalOrder</span><span class="lang">
31 (C, C++)</span><div class="descr">
32 Potential memory leaks caused by an undefined argument evaluation order.
33 <p>Source: <a href="http://www.boost.org/doc/libs/1_49_0/libs/smart_ptr/shared_ptr.htm#BestPractices">
34 boost docs: shared_ptr</a>.</p></div></div></td>
35 <td><div class="exampleContainer expandable">
36 <div class="example"><pre>
37 void f(int, int);
38 int g(void *);
39 int h() __attribute__((noreturn));
40
41 void test() {
42   // It is possible that 'malloc(1)' is called first,
43   // then 'h()', that is (or calls) noreturn and eventually
44   // 'g()' is never called.
45   f(g(malloc(1)), h()); // warn: 'g()' may never be called.
46 }
47 </pre></div>
48 <div class="example"><pre>
49 void f(int, int);
50 int g(int *);
51 int h() { throw 1; };
52
53 void test() {
54   // It is possible that 'new int' is called first,
55   // then 'h()', that throws an exception and eventually
56   // 'g()' is never called.
57   f(g(new int), h()); // warn: 'g()' may never be called.
58 }
59 </pre></div></div></td>
60 <td class="aligned"></td></tr>
61
62
63 <tr><td><div class="namedescr expandable"><span class="name">
64 memory.DstBufferTooSmall</span><span class="lang">
65 (C, C++)</span><div class="descr">
66 Destination buffer passed to memory function is too small.
67 <br>Note: <span class="name">security.insecureAPI.strcpy</span> currently warns
68 on usage of <code>strcpy</code> and suggests to replace it.
69 <br>Note: <span class="name">alpha.unix.CStringChecker</span> contains some similar checks.
70 <p>Source: <a href="https://cwe.mitre.org/data/definitions/120.html">CWE-120</a>.</p></div></div></td>
71 <td><div class="exampleContainer expandable">
72 <div class="example"><pre>
73 void test() {
74   const char* s1 = "abc";
75   char *s2 = new char;
76   strcpy(s2, s1); // warn
77 }
78 </pre></div>
79 <div class="example"><pre>
80 void test() {
81   int* p1 = new int[3];
82   int* p2 = new int;
83   memcpy(p2, p1, 3); // warn
84 }
85 </pre></div></div></td>
86 <td class="aligned"></td></tr>
87
88
89 <tr><td><div class="namedescr expandable"><span class="name">
90 memory.NegativeArraySize</span><span class="lang">
91 (C, C++)</span><div class="descr">
92 'n' is used to specify the buffer size may be negative.
93 <br>Note: possibly an enhancement to <span class="name">
94 alpha.security.MallocOverflow</span>.
95 <p>Source: <a href="http://cwe.mitre.org/data/definitions/20.html">CWE-20,
96 Example 2</a>.</p></div></div></td>
97 <td><div class="exampleContainer expandable">
98 <div class="example"><pre>
99 void test() {
100   int *p;
101   int n1 = -1;
102   p = new int[n1]; // warn
103 }
104 </pre></div></div></td>
105 <td class="aligned"></td></tr>
106
107 <tr><td><div class="namedescr expandable"><span class="name">
108 memory.ZeroAlloc</span><span class="lang">
109 (C, C++)</span><div class="descr">
110 Allocation of zero bytes.
111 <br>Note: an enhancement to <span class="name">unix.Malloc</span>.
112 <br>Note: <span class="name">unix.API</span> perform C-checks for zero 
113 allocation. This should be moved to <span class="name">unix.Malloc</span>.
114 <p>Source: C++03 3.7.3.1p2; C++11 3.7.4.1p2.</p></div></div></td>
115 <td><div class="exampleContainer expandable">
116 <div class="example"><pre>
117 #include &lt;stdlib.h&gt;
118
119 void test() {
120   int *p = malloc(0); // warn
121   free(p);
122 }
123 </pre></div>
124 <div class="example"><pre>
125 void test() {
126   int *p = new int[0]; // warn
127   delete[] p;
128 }
129 </pre></div></div></td>
130 <td class="aligned"><a href="http://reviews.llvm.org/D6178">
131 D6178</a></td></tr>
132
133 </table>
134
135 <!-- ======================= constructors/destructors ====================== -->
136 <h3>constructors/destructors</h3>
137 <table class="checkers">
138 <col class="namedescr"><col class="example"><col class="progress">
139 <thead><tr><td>Name, Description</td><td>Example</td><td>Progress</td></tr></thead>
140
141 <tr><td><div class="namedescr expandable"><span class="name">
142 ctordtor.ExptInsideDtor</span><span class="lang">
143 (C++)</span><div class="descr">
144 It is dangerous to let an exception leave a destructor.
145 Using <code>try..catch</code> solves the problem.
146 <p>Source: Scott Meyers "More Effective C++", item 11: Prevent exceptions from
147 leaving destructors.</p></div></div></td>
148 <td><div class="exampleContainer expandable">
149 <div class="example"><pre>
150 class A {
151   A() {}
152   ~A() { throw 1; } // warn
153 };
154 </pre></div>
155 <div class="example"><pre>
156 void f() throw(int);
157
158 class A {
159   A() {}
160   ~A() { f(); } // warn
161 };
162 </pre></div></div></td>
163 <td class="aligned"></td></tr>
164
165
166 <tr><td><div class="namedescr expandable"><span class="name">
167 ctordtor.PlacementSelfCopy</span><span class="lang">
168 (C++11)</span><div class="descr">
169 For a placement copy or move, it is almost certainly an error if the
170 constructed object is also the object being copied from.</div></div></td>
171 <td><div class="exampleContainer expandable">
172 <div class="example"><pre>
173 class A {};
174
175 void test(A *dst, A *src) {
176   ::new (dst) A(*dst); // warn (should be 'src')
177 }
178 </pre></div></div></td>
179 <td class="aligned"><!--rdar://problem/13688366--></td></tr>
180
181 </table>
182
183 <!-- =============================== va_list =============================== -->
184 <h3>va_list</h3>
185 <table class="checkers">
186 <col class="namedescr"><col class="example"><col class="progress">
187 <thead><tr><td>Name, Description</td><td>Example</td><td>Progress</td></tr></thead>
188
189 <tr><td><div class="namedescr expandable"><span class="name">
190 valist.Uninitialized</span><span class="lang">
191 (C)</span><div class="descr">
192 Calls to the <code>va_arg</code>, <code>va_copy</code>, or
193 <code>va_end</code> macro must happen after calling <code>va_start</code> and
194 before calling <code>va_end</code>.</div></div></td>
195 <td><div class="exampleContainer expandable">
196 <div class="example"><pre>
197 #include &lt;stdarg.h&gt;
198
199 void test(int x, ...) {
200   va_list args;
201   int y = va_arg(args, int); // warn
202 }
203 </pre></div>
204 <div class="example"><pre>
205 #include &lt;stdarg.h&gt;
206
207 void test(int x, ...) {
208   va_list args;
209   va_start(args, x); 
210   va_end(args);
211   int z = va_arg(args, int); // warn
212 }
213 </pre></div></div></td>
214 <td class="aligned"><a href="http://llvm.org/bugs/show_bug.cgi?id=16812">
215 PR16811</a></td></tr>
216
217 <tr><td><div class="namedescr expandable"><span class="name">
218 valist.Unterminated</span><span class="lang">
219 (C)</span><div class="descr">
220 Every <code>va_start</code> must be matched by a <code>va_end</code>. A va_list
221 can only be ended once.
222
223 <i>This should be folded into the generalized "ownership checker"
224 described on the <a href="open_projects.html">
225 Open Projects</a> page.</i></div></div></td>
226 <td><div class="exampleContainer expandable">
227 <div class="example"><pre>
228 #include &lt;stdarg.h&gt;
229
230 void test(int x, ...) {
231   va_list args;
232   va_start(args, x);
233   int y = x + va_arg(args, int);
234 } // warn: missing va_end
235 </pre></div></div></td>
236 <td class="aligned"><a href="http://llvm.org/bugs/show_bug.cgi?id=16812">
237 PR16812</a></td></tr>
238
239 </table>
240
241 <!-- ============================== exceptions ============================= -->
242 <h3>exceptions</h3>
243 <table class="checkers">
244 <col class="namedescr"><col class="example"><col class="progress">
245 <thead><tr><td>Name, Description</td><td>Example</td><td>Progress</td></tr></thead>
246
247 <tr><td><div class="namedescr expandable"><span class="name">
248 exceptions.ThrowSpecButNotThrow</span><span class="lang">
249 (C++)</span><div class="descr">
250 Function declaration has a <code>throw(<i>type</i>)</code> specifier but the
251 function do not throw exceptions.</div></div></td>
252 <td><div class="exampleContainer expandable">
253 <div class="example"><pre>
254 void test() throw(int) {
255 } // warn
256 </pre></div></div></td>
257 <td class="aligned"></td></tr>
258
259
260 <tr><td><div class="namedescr expandable"><span class="name">
261 exceptions.NoThrowSpecButThrows</span><span class="lang">
262 (C++)</span><div class="descr">
263 An exception is throw from a function having a <code>throw()</code>
264 specifier.</div></div></td>
265 <td><div class="exampleContainer expandable">
266 <div class="example"><pre>
267 void test() throw() {
268   throw(1); // warn
269 }
270 </pre></div></div></td>
271 <td class="aligned"></td></tr>
272
273
274 <tr><td><div class="namedescr expandable"><span class="name">
275 exceptions.ThrownTypeDiffersSpec</span><span class="lang">
276 (C++)</span><div class="descr">
277 The type of a thrown exception differs from those specified in
278 a <code>throw(<i>type</i>)</code> specifier.</div></div></td>
279 <td><div class="exampleContainer expandable">
280 <div class="example"><pre>
281 struct S{};
282
283 void test() throw(int) {
284   S s;
285   throw (s); // warn
286 }
287 </pre></div></div></td>
288 <td class="aligned"></td></tr>
289
290 </table>
291
292 <!-- ========================= smart pointers ============================== -->
293 <h3>smart pointers</h3>
294 <table class="checkers">
295 <col class="namedescr"><col class="example"><col class="progress">
296 <thead><tr><td>Name, Description</td><td>Example</td><td>Progress</td></tr></thead>
297
298 <tr><td><div class="namedescr expandable"><span class="name">
299 smartptr.SmartPtrInit</span><span class="lang">
300 (C++)</span><div class="descr">
301 C++03: <code>auto_ptr</code> should store a pointer to an object obtained via
302 new as allocated memory will be cleaned using <code>delete</code>.<br>
303 C++11: one should use <code>unique_ptr&lt;<i>type</i>[]&gt;</code> to keep a
304 pointer to memory allocated by <code>new[]</code>.<br>
305 C++11: to keep a pointer to memory allocated by <code>new[]</code> in
306 a <code>shared_ptr</code> one should use a custom deleter that calls <code>
307 delete[].</code>.
308 <p>Source: C++03 20.4.5p1; C++11 <code>auto_ptr</code> is deprecated (D.10).</p></div></div></td>
309 <td><div class="exampleContainer expandable">
310 <div class="example"><pre>
311 #include &lt;stdlib.h&gt;
312 #include &lt;memory&gt;
313
314 void test() {
315   std::auto_ptr&lt;int&gt; p1(new int); // Ok
316   std::auto_ptr&lt;int&gt; p2(new int[3]); // warn
317 }
318 </pre></div>
319 <div class="example"><pre>
320 #include &lt;stdlib.h&gt;
321 #include &lt;memory&gt;
322
323 void test() {
324   std::auto_ptr&lt;int&gt; p((int *)malloc(sizeof(int))); // warn
325 }
326 </pre></div></div></td>
327 <td class="aligned"></td></tr>
328
329 </table>
330
331 <!-- ============================== dead code ============================== -->
332 <h3>dead code</h3>
333 <table class="checkers">
334 <col class="namedescr"><col class="example"><col class="progress">
335 <thead><tr><td>Name, Description</td><td>Example</td><td>Progress</td></tr></thead>
336
337 <tr><td><div class="namedescr expandable"><span class="name">
338 deadcode.UnmodifiedVariable</span><span class="lang">
339 (C, C++)</span><div class="descr">
340 A variable is never modified but was not declared const and is not a
341 reference.<br><br><i>(opt-in checker)</i></div></div></td>
342 <td><div class="exampleContainer expandable">
343 <div class="example"><pre>
344 extern int computeDelta();
345
346 int test(bool cond) {
347   int i = 0;
348   if (cond) {
349     const int delta = computeDelta();
350     // warn: forgot to modify 'i'
351   }
352   return i;
353 }
354 </pre></div></div></td>
355 <td class="aligned"><a href="http://llvm.org/bugs/show_bug.cgi?id=16890">PR16890</a></td></tr>
356
357 <tr><td><div class="namedescr expandable"><span class="name">
358 deadcode.IdempotentOperations</span><span class="lang">
359 (C)</span><div class="descr">
360 Warn about idempotent operations.</div></div></td>
361 <td><div class="exampleContainer expandable">
362 <div class="example"><pre>
363 void test() {
364   int x = 7;
365   x = x; // warn: value is always the same
366 }
367 </pre></div>
368 <div class="example"><pre>
369 void test() {
370   int x = 7;
371   x /= x; // warn: value is always 1
372 }
373 </pre></div>
374 <div class="example"><pre>
375 void test() {
376   int x = 7, one = 1;
377   x *= one; // warn: right op is always 1
378 }
379 </pre></div>
380 <div class="example"><pre>
381 void test() {
382   int x = 7, zero = 0;
383   x = x - zero;
384    // warn: the right operand to '-' is always 0
385 }
386 </pre></div></div></td>
387 <td class="aligned">removed from alpha.deadcode.* at r198476</td></tr>
388
389 </table>
390
391 <!-- ================================ POSIX ================================ -->
392 <h3>POSIX</h3>
393 <table class="checkers">
394 <col class="namedescr"><col class="example"><col class="progress">
395 <thead><tr><td>Name, Description</td><td>Example</td><td>Progress</td></tr></thead>
396
397 <tr><td><div class="namedescr expandable"><span class="name">
398 posix.Errno</span><span class="lang">
399 (C)</span><div class="descr">
400 Record that <code>errno</code> is non-zero when certain functions
401 fail.</div></div></td>
402 <td><div class="exampleContainer expandable">
403 <div class="example"><pre>
404 #include &lt;stdlib.h&gt;
405
406 int readWrapper(int fd, int *count) {
407   int lcount = read(fd, globalBuf, sizeof(globalBuf));
408   if (lcount < 0)
409     return errno;
410   *count = lcount;
411   return 0;
412 }
413
414 void use(int fd) {
415   int count;
416   if (!readWrapper(fd, &amp;count))
417     print("%d", count); // should not warn
418 }
419 </pre></div></div></td>
420 <td class="aligned"><a href="http://llvm.org/bugs/show_bug.cgi?id=18701">PR18701</a></td></tr>
421
422 </table>
423
424 <!-- ========================= undefined behavior ========================== -->
425 <h3>undefined behavior</h3>
426 <table class="checkers">
427 <col class="namedescr"><col class="example"><col class="progress">
428 <thead><tr><td>Name, Description</td><td>Example</td><td>Progress</td></tr></thead>
429
430 <tr><td><div class="namedescr expandable"><span class="name">
431 undefbehavior.ExitInDtor</span><span class="lang">
432 (C++)</span><div class="descr">
433 Undefined behavior: <code>std::exit()</code> is called to end the program during
434 the destruction of an object with static storage duration.
435 <p>Source: C++11 3.6.1p4.</p></div></div></td>
436 <td><div class="exampleContainer expandable">
437 <div class="example"><pre>
438 #include &lt;cstdlib&gt;
439
440 class A {
441 public:
442   ~A() {
443     std::exit(1); // warn
444   }
445 };
446 </pre></div></div></td>
447 <td class="aligned"></td></tr>
448
449
450 <tr><td><div class="namedescr expandable"><span class="name">
451 undefbehavior.LocalStaticDestroyed</span><span class="lang">
452 (C++)</span><div class="descr">
453 Undefined behavior: function containing a definition of static local object is 
454 called during the destruction of an object with static storage duration so that 
455 flow of control passes through the definition of the previously destroyed 
456 static local object.
457 <p>Source: C++11 3.6.3p2.</p></div></div></td>
458 <td><div class="exampleContainer expandable">
459 <div class="example"><pre>
460 void f();
461
462 class A {
463 public:
464   ~A() {
465     f(); // warn
466   }
467 };
468
469 class B {};
470
471 A a;
472
473 void f() {
474   static B b;
475 }
476 </pre></div></div></td>
477 <td class="aligned"></td></tr>
478
479
480 <tr><td><div class="namedescr expandable"><span class="name">
481 undefbehavior.ZeroAllocDereference</span><span class="lang">
482 (C, C++)</span><div class="descr">
483 The effect of dereferencing a pointer returned as a request for zero size is 
484 undefined.<br>
485 Note: possibly an enhancement to <span class="name">
486 unix.Malloc</span>.
487 <p>Source: C++03 3.7.3.1p2; C++11 3.7.4.1p2.</p></div></div></td>
488 <td><div class="exampleContainer expandable">
489 <div class="example"><pre>
490 #include &lt;stdlib.h&gt;
491
492 void test() {
493   int *p = (int *)malloc(0);
494   *p = 1; // warn
495   free(p);
496 }
497 </pre></div>
498 <div class="example"><pre>
499 void f(int);
500
501 void test() {
502   int *p = new int[0];
503   f(*p); // warn
504   delete[] p;
505 }
506 </pre></div></div></td>
507 <td class="aligned"><a href="http://reviews.llvm.org/D8273">D8273</a></td></tr>
508
509
510 <tr><td><div class="namedescr expandable"><span class="name">
511 undefbehavior.DeadReferenced</span><span class="lang">
512 (C++)</span><div class="descr">
513 Undefined behavior: the following usage of the pointer to the object whose
514 lifetime has ended can result in undefined behavior:<br>
515 The object will be or was of a class type with a non-trivial destructor and
516 <ul><li>the pointer is used as the operand of a delete-expression</li></ul>
517 The object will be or was of a non-POD class type (C++11: any class type) and
518 <ul><li>the pointer is used to access a non-static data member or call a
519 non-static member function of the object</li>
520 <li>the pointer is implicitly converted to a pointer to a base class
521 type</li>
522 <li>the pointer is used as the operand of a <code>static_cast</code> (except
523 when the conversion is to <code>void*</code>, or to <code>void*</code> and 
524 subsequently to <code>char*</code>, or <code>unsigned char*</code>)</li>
525 <li>the pointer is used as the operand of a <code>dynamic_cast</code></li></ul>
526 <p>Source: C++03 3.8p5, p7; C++11 3.8p5, p7.</p></div></div></td>
527 <td><div class="exampleContainer expandable">
528 <div class="example"><pre>
529 #include &lt;new&gt;
530
531 class A {
532 public:
533   ~A();
534 };
535
536 class B : public A {};
537
538 void test() {
539   A *a = new A;
540   new(a) B;
541   delete a; // warn
542 }
543 </pre></div>
544 <div class="example"><pre>
545 #include &lt;new&gt;
546
547 class A {
548 public:
549   ~A();
550 };
551
552 class B {};
553
554 void test() {
555   A *a = new A;
556   new(a) B;
557   a->~A();
558 }
559 </pre></div>
560 <div class="example"><pre>
561 #include &lt;new&gt;
562
563 class A {
564 public:
565   ~A();
566 };
567
568 class B : public A {};
569
570 class C {};
571
572 void f(A*);
573
574 void test() {
575   B *b = new B;
576   new(b) C;
577   f(b); // warn
578 }
579 </pre></div>
580 <div class="example"><pre>
581 #include &lt;new&gt;
582
583 class A {
584 public:
585   ~A();
586 };
587
588 class B : public A {};
589
590 class C {};
591
592 A* test() {
593   B *b = new B;
594   new(b) C;
595   return static_cast&lt;A*&gt;(b); // warn
596 }
597 </pre></div>
598 <div class="example"><pre>
599 #include &lt;new&gt;
600
601 class A {
602 public:
603   ~A();
604 };
605
606 class B : public A {};
607
608 class C {};
609
610 A* test() {
611   B *b = new B;
612   new(b) C;
613   return dynamic_cast&lt;A*&gt;(b); // warn
614 }
615 </pre></div></div></td>
616 <td class="aligned"></td></tr>
617
618
619 <tr><td><div class="namedescr expandable"><span class="name">
620 undefbehavior.ObjLocChanges</span><span class="lang">
621 (C++)</span><div class="descr">
622 Undefined behavior: the program must ensure that an object occupies the same 
623 storage location when the implicit or explicit destructor call takes place.
624 <p>Source: C++11 3.8p8.</p></div></div></td>
625 <td><div class="exampleContainer expandable">
626 <div class="example"><pre>
627 #include &lt;new&gt;
628
629 class A {};
630
631 class B {
632 public:
633   ~B();
634 };
635
636 void test() {
637   B b;
638   new (&b) A;
639 } // warn
640 </pre></div>
641 <div class="example"><pre>
642 #include &lt;new&gt;
643
644 class A {};
645
646 class B {
647 public:
648   ~B();
649 };
650
651 void test() {
652   B *b = new B;
653   new (b) A;
654   delete b; // warn
655 }
656 </pre></div></div></td>
657 <td class="aligned"></td></tr>
658
659
660 <tr><td><div class="namedescr expandable"><span class="name">
661 undefbehavior.ExprEvalOrderUndef</span><span class="lang">
662 (C, C++03)</span><div class="descr">
663 Undefined behavior: a scalar object shall have its stored value modified at 
664 most once by the evaluation of an expression.<br>
665 Note: most cases are currently handled by the Clang core (search for 'multiple
666 unsequenced modifications' warning in Clang tests).
667 <p>Source: C++03 5p4.</p></div></div></td>
668 <td><div class="exampleContainer expandable">
669 <div class="example"><pre>
670 int test () {
671   int i = 0;
672   i = ++i + 1; // warn
673   return i;
674 }
675 </pre></div></div></td>
676 <td class="aligned"></td></tr>
677
678
679 <tr><td><div class="namedescr expandable"><span class="name">
680 undefbehavior.StaticInitReentered</span><span class="lang">
681 (C++)</span><div class="descr">
682 Undefined behavior: static declaration is re-entered while the object is being 
683 initialized.
684 <p>Source: C++11 6.7p4.</p></div></div></td>
685 <td><div class="exampleContainer expandable">
686 <div class="example"><pre>
687 int test(int i) {
688   static int s = test(2 * i); // warn
689   return i + 1;
690 }
691 </pre></div></div></td>
692 <td class="aligned"></td></tr>
693
694
695 <tr><td><div class="namedescr expandable"><span class="name">
696 undefbehavior.ConstModified</span><span class="lang">
697 (C, C++)</span><div class="descr">
698 Undefined behavior: const object is being modified.
699 <p>Source: C++03 7.1.5.1p4, C++11 7.1.6.1p4.</p></div></div></td>
700 <td><div class="exampleContainer expandable">
701 <div class="example"><pre>
702 void test() {
703   const int *cp = new const int (0);
704   int *p = const_cast&lt;int *&gt;(cp);
705   *p = 1; // warn
706   delete p;
707 }
708 </pre></div>
709 <div class="example"><pre>
710 class C {
711 public :
712   int i;
713   C();
714 };
715
716 void test() {
717   const C cb;
718
719   C* cp = const_cast&lt;C *&gt;(&cb);
720   cp-&gt;i = 1; // warn
721 }
722 </pre></div></div></td>
723 <td class="aligned"></td></tr>
724
725
726 <tr><td><div class="namedescr expandable"><span class="name">
727 undefbehavior.DeadDestructed</span><span class="lang">
728 (C++)</span><div class="descr">
729 Undefined behavior: the destructor is invoked for an object whose lifetime 
730 has ended.
731 <p>Source: C++11 12.4p14.</p></div></div></td>
732 <td><div class="exampleContainer expandable">
733 <div class="example"><pre>
734 class A {
735 public:
736   void f();
737   A();
738   ~A();
739 };
740
741 void test() {
742   A a;
743   a.~A();
744 } // warn
745 </pre></div></div></td>
746 <td class="aligned"></td></tr>
747
748
749 <tr><td><div class="namedescr expandable"><span class="name">
750 undefbehavior.MethodCallBeforeBaseInit</span><span class="lang">
751 (C++)</span><div class="descr">
752 Undefined behavior: calls member function but base not yet initialized.
753 <p>Source: C++03 12.6.2p8; C++11 12.6.2p13.</p></div></div></td>
754 <td><div class="exampleContainer expandable">
755 <div class="example"><pre>
756 class A {
757 public :
758   A(int);
759 };
760
761 class B : public A {
762 public :
763   int f();
764   B() : A(f()) {} // warn
765 };
766 </pre></div></div></td>
767 <td class="aligned"></td></tr>
768
769
770 <tr><td><div class="namedescr expandable"><span class="name">
771 undefbehavior.MemberOrBaseRefBeforeCtor</span><span class="lang">
772 (C++)</span><div class="descr">
773 C++ Undefined behavior: non-static member or base class of non-POD class type 
774 is referred before constructor begins execution.<br>
775 C++11 Undefined behavior: non-static member or base class of a class with a 
776 non-trivial constructor is referred before constructor begins execution.
777 <p>Source: C++03 12.7p1; C++11 12.7p1.</p></div></div></td>
778 <td><div class="exampleContainer expandable">
779 <div class="example"><pre>
780 struct non_POD {
781   int i;
782   non_POD();
783 };
784
785 extern non_POD non_pod;
786
787 int *p = &amp;non_pod.i; // warn
788 </pre></div>
789 <div class="example"><pre>
790 struct POD { 
791   int i; 
792 };
793
794 struct non_POD : public POD {
795   POD pod;
796 };
797
798 extern non_POD non_pod;
799
800 int *p = &amp;non_pod.pod.i; // warn
801 </pre></div>
802 <div class="example"><pre>
803 struct POD {
804   int i; 
805 };
806
807 struct non_POD : public POD {};
808
809 extern non_POD non_pod;
810
811 POD *p = &amp;non_pod; // warn
812 </pre></div>
813 <div class="example"><pre>
814 struct non_POD {
815   int i;
816   non_POD();
817 };
818
819 struct S {
820   int *k;
821   non_POD non_pod;
822   S() : k(&amp;non_pod.i) {} // warn
823 };
824 </pre></div></div></td>
825 <td class="aligned"></td></tr>
826
827
828 <tr><td><div class="namedescr expandable"><span class="name">
829 undefbehavior.MemberRefAfterDtor</span><span class="lang">
830 (C++)</span><div class="descr">
831 C++03: Undefined behavior: non-static member of non-POD class type is referred 
832 after destructor ends execution.<br>
833 C++11: Undefined behavior: non-static member of a class with a non-trivial 
834 destructor is referred after destructor ends execution.
835 <p>Source: C++03 12.7p1; C++11 12.7p1.</p></div></div></td>
836 <td><div class="exampleContainer expandable">
837 <div class="example"><pre>
838 class C {
839 public:
840   C();
841   void f();
842 };
843
844 void test() {
845   C *c = new C();
846   c-&gt;~C();
847   c-&gt;f(); // warn
848 }
849 </pre></div></div></td>
850 <td class="aligned"></td></tr>
851
852
853 <tr><td><div class="namedescr expandable"><span class="name">
854 undefbehavior.CtorForeignCall</span><span class="lang">
855 (C++)</span><div class="descr">
856 Undefined behavior: call to virtual function of an object under construction 
857 whose type is neither the constructors own class or one of its bases.
858 <p>Source: C++11 12.7p4.</p></div></div></td>
859 <td><div class="exampleContainer expandable">
860 <div class="example"><pre>
861 class A {
862 public:
863   virtual void f() {};
864 };
865
866 class B {
867 public:
868   B(A* a) { a-&gt;f(); } // warn
869 };
870
871 class C : public A, B {
872 public:
873   C() : B((A*)this) {}
874 };
875 </pre></div></div></td>
876 <td class="aligned"></td></tr>
877
878
879 <tr><td><div class="namedescr expandable"><span class="name">
880 undefbehavior.CtorForeignTypeid</span><span class="lang">
881 (C++)</span><div class="descr">
882 Undefined behavior: the operand of <code>typeid</code> is an object under
883 construction whose type is neither the constructors own class or one of its 
884 bases.
885 <p>Source: C++11 12.7p5.</p></div></div></td>
886 <td><div class="exampleContainer expandable">
887 <div class="example"><pre>
888 #include &lt;typeinfo&gt;
889
890 class A {};
891
892 class B {
893 public:
894   B(A* a) {
895     (void)typeid(*a); // warn
896   }
897 };
898
899 class C : public A, B {
900 public:
901   C() : B((A*)this) {}
902 };
903 </pre></div></div></td>
904 <td class="aligned"></td></tr>
905
906
907 <tr><td><div class="namedescr expandable"><span class="name">
908 undefbehavior.CtorForeignCast</span><span class="lang">
909 (C++)</span><div class="descr">
910 Undefined behavior: the operand of <code>dynamic_cast</code> is an object under
911 construction whose type is neither the constructors own class or one of its
912 bases.
913 <p>Source: C++11 12.7p6.</p></div></div></td>
914 <td><div class="exampleContainer expandable">
915 <div class="example"><pre>
916 #include &lt;typeinfo&gt;
917
918 class A {
919 public:
920   virtual void f() {};
921 };
922
923 class B {
924 public:
925   B(A* a) { 
926     (void)dynamic_cast&lt;B*&gt;(a); //warn
927   }
928 };
929
930 class C : public A, B {
931 public:
932   C() : B((A*)this) {}
933 };
934 </pre></div></div></td>
935 <td class="aligned"></td></tr>
936
937
938 <tr><td><div class="namedescr expandable"><span class="name">
939 undefbehavior.MemberOrBaseRefInCatch</span><span class="lang">
940 (C++)</span><div class="descr">
941 Undefined behavior: referring to any non-static member or base class of an 
942 object in the handler for a function-try-block of a constructor or destructor 
943 for that object results in undefined behavior.
944 <p>Source: C++11 15.3p10.</p></div></div></td>
945 <td><div class="exampleContainer expandable">
946 <div class="example"><pre>
947 void f() { throw 1; }
948
949 class C {
950   int i;
951 public :
952   C()
953   try {
954     f();
955   }
956   catch (...) {
957     i=2; // warn
958   }
959 };
960 </pre></div>
961 <div class="example"><pre>
962 void f() { throw 1; }
963
964 class Base {
965 public:
966   int i;
967 };
968
969 class C: public Base {
970 public :
971   ~C() try {
972     f();
973   }
974   catch (...) {
975     i=2; // warn
976   }
977 };
978 </pre></div></div></td>
979 <td class="aligned"></td></tr>
980
981
982 <tr><td><div class="namedescr expandable"><span class="name">
983 undefbehavior.ReturnAtCatchEnd</span><span class="lang">
984 (C++)</span><div class="descr">
985 Undefined behavior: a function returns when control reaches the end of a 
986 handler. This results in undefined behavior in a value-returning function.
987 <p>Source: C++11 15.3p10.</p></div></div></td>
988 <td><div class="exampleContainer expandable">
989 <div class="example"><pre>
990 void f() { throw 1; }
991
992 int test() try {
993   f();
994   return 1;
995 }
996 catch(int) {
997 } // warn
998 </pre></div></div></td>
999 <td class="aligned"></td></tr>
1000
1001
1002 <tr><td><div class="namedescr expandable"><span class="name">
1003 undefbehavior.AutoptrsOwnSameObj</span><span class="lang">
1004 (C++03)</span><div class="descr">
1005 Undefined behavior: if more than one <code>auto_ptr</code> owns the same object
1006 at the same time the behavior of the program is undefined.
1007 <p>Source: C++03 20.4.5p3; C++11 <code>auto_ptr</code> is deprecated
1008 (D.10).</p></div></div></td>
1009 <td><div class="exampleContainer expandable">
1010 <div class="example"><pre>
1011 #include &lt;memory&gt;
1012
1013 void test() {
1014   int *data = new int;
1015   std::auto_ptr&lt;int&gt; p(data);
1016   std::auto_ptr&lt;int&gt; q(data); // warn
1017 }
1018 </pre></div></div></td>
1019 <td class="aligned"></td></tr>
1020
1021
1022 <tr><td><div class="namedescr expandable"><span class="name">
1023 undefbehavior.BasicStringOutOfBound</span><span class="lang">
1024 (C++03)</span><div class="descr">
1025 Undefined behavior: out-of-bound <code>basic_string</code> access/modification.
1026 <br>Note: possibly an enhancement to <span class="name">
1027 alpha.security.ArrayBoundV2</span>.
1028 <p>Source: C++03 21.3.4p1; C++11 behavior is defined
1029 (21.4.5p2).</p></div></div></td>
1030 <td><div class="exampleContainer expandable">
1031 <div class="example"><pre>
1032 #include &lt;string&gt;
1033
1034 void test() {
1035   std::basic_string&lt;char&gt; s;
1036   char c = s[10]; // warn
1037 }
1038 </pre></div>
1039 <div class="example"><pre>
1040 #include &lt;string&gt;
1041
1042 void test() {
1043   std::basic_string&lt;char&gt; s;
1044   s[10] = 0; // warn
1045 }
1046 </pre></div></div></td>
1047 <td class="aligned"></td></tr>
1048
1049
1050 <tr><td><div class="namedescr expandable"><span class="name">
1051 undefbehavior.EosDereference</span><span class="lang">
1052 (C++)</span><div class="descr">
1053 Undefined behavior: the result of <code>operator*()</code> on an end of a
1054 stream is undefined.
1055 <p>Source: C++03 24.5.3p2; C++11 24.6.3p2.</p></div></div></td>
1056 <td><div class="exampleContainer expandable">
1057 <div class="example"><pre>
1058 #include &lt;vector&gt;
1059
1060 int test() {
1061   std::vector&lt;int&gt; v;
1062   return *v.end(); // warn
1063 }
1064 </pre></div></div></td>
1065 <td class="aligned"></td></tr>
1066
1067
1068 <tr><td><div class="namedescr expandable"><span class="name">
1069 undefbehavior.QsortNonPODNonTrivial</span><span class="lang">
1070 (C++)</span><div class="descr">
1071 C++03: Undefined behavior: the objects in the array passed to qsort are of 
1072 non-POD type.<br>
1073 C++11: Undefined behavior: the objects in the array passed to qsort are of 
1074 non-trivial type.
1075 <p>Source: C++03 25.4p4; C++11 25.5p4.</p></div></div></td>
1076 <td><div class="exampleContainer expandable">
1077 <div class="example"><pre>
1078 // C++03
1079 #include &lt;cstdlib&gt;
1080
1081
1082 struct non_POD {
1083   non_POD();
1084 };
1085
1086 non_POD values[] = { non_POD(), non_POD() };
1087
1088 int compare(const void *a, const void *b);
1089
1090 void test() {
1091   qsort(values, 2, sizeof(non_POD), compare); // warn
1092 }
1093 </pre></div>
1094 <div class="example"><pre>
1095 // C++11
1096 #include &lt;cstdlib&gt;
1097
1098 struct S {};
1099
1100 struct trivial_non_POD : public S {
1101   int i;
1102 };
1103
1104 struct non_trivial {
1105   int i;
1106   non_trivial();
1107 };
1108
1109 trivial_non_POD tnp[2];
1110 non_trivial nt[2];
1111
1112 int compare1(const void *a, const void *b);
1113
1114 int compare2(const void *a, const void *b);
1115
1116 void test() {
1117   qsort(tnp, 2, sizeof(trivial_non_POD), compare1); // ok
1118   qsort(nt, 2, sizeof(non_trivial), compare2); // warn
1119 }
1120 </pre></div></div></td>
1121 <td class="aligned"></td></tr>
1122
1123
1124 <tr><td><div class="namedescr expandable"><span class="name">
1125 undefbehavior.ThrowWhileCopy</span><span class="lang">
1126 (C++)</span><div class="descr">
1127 Undefined behavior: copy constructor/assignment operator can throw an exception.
1128 The effects are undefined if an exception is thrown.</div></div></td>
1129 <td><div class="exampleContainer expandable">
1130 <div class="example"><pre>
1131 class C {
1132 public:
1133   int i, j;
1134   C (const C &amp;c) {
1135     i = c.i;
1136     throw 1; // warn
1137     j = c.j;
1138   };
1139 };
1140 </pre></div>
1141 <div class="example"><pre>
1142 class C {
1143 public:
1144   int i, j;
1145   C &amp;operator=(const C &amp;c) {
1146     i = c.i;
1147     throw 1; // warn
1148     j = c.j;
1149   };
1150 };
1151 </pre></div></div></td>
1152 <td class="aligned"></td></tr>
1153
1154
1155 <tr><td><div class="namedescr expandable"><span class="name">
1156 undefbehavior.ValarrayArgBound</span><span class="lang">
1157 (C++)</span><div class="descr">
1158 Undefined behavior: the value of the <code><i>n</i></code> argument passed
1159 to <code>valarray</code> constructor is greater than the number of values
1160 pointed to by the first argument (source).
1161 <p>Source: C++03 26.3.2.1p4; C++11 26.6.2.2p4.</p></div></div></td>
1162 <td><div class="exampleContainer expandable">
1163 <div class="example"><pre>
1164 #include &lt;valarray&gt;
1165
1166 struct S {
1167   int i;
1168   S(int ii) : i(ii) {};
1169 };
1170
1171 void test(void) {
1172   S s[] = { S(1), S(2) };
1173   std::valarray&lt;S&gt; v(s,3); // warn
1174 }
1175 </pre></div></div></td>
1176 <td class="aligned"></td></tr>
1177
1178
1179 <tr><td><div class="namedescr expandable"><span class="name">
1180 undefbehavior.ValarrayLengthDiffer</span><span class="lang">
1181 (C++)</span><div class="descr">
1182 Undefined behavior: <code>valarray</code> operands are of different length.
1183 <p>Source: C++03 26.3.2.2p1, 26.3.2.6p3, 26.3.3.1p3, 26.3.3.2p3;
1184 C++11 defined (26.6.2.3p1), 26.6.2.7p3, 26.6.3.1p3,
1185 26.6.3.2p3.</p></div></div></td>
1186 <td><div class="exampleContainer expandable">
1187 <div class="example"><pre>
1188 // C++03
1189 #include &lt;valarray&gt;
1190
1191 void test(void) {
1192   std::valarray&lt;int&gt; a(0, 1), b(0, 2);
1193   a = b; // warn
1194   b.resize(1);
1195   a = b; // ok
1196 }
1197 </pre></div>
1198 <div class="example"><pre>
1199 // C++03, C++11
1200 #include &lt;valarray&gt;
1201
1202 void test(void) {
1203   std::valarray&lt;int&gt; a(0, 1), b(0, 2);
1204   a *= b; // warn
1205 }
1206 </pre></div>
1207 <div class="example"><pre>
1208 // C++03, C++11
1209 #include &lt;valarray&gt;
1210
1211 void test(void) {
1212   std::valarray&lt;int&gt; a(0, 1), b(0, 2);
1213   a = a + b; // warn
1214 }
1215 </pre></div>
1216 <div class="example"><pre>
1217 // C++03, C++11
1218 #include &lt;valarray&gt;
1219
1220 void test(void) {
1221   std::valarray&lt;int&gt; a(0, 1), b(0, 2);
1222   std::valarray&lt;bool&gt; c(false, 1);
1223   c = a == b; // warn
1224 }
1225 </pre></div></div></td>
1226 <td class="aligned"></td></tr>
1227
1228
1229 <tr><td><div class="namedescr expandable"><span class="name">
1230 undefbehavior.ValarrayZeroLength</span><span class="lang">
1231 (C++)</span><div class="descr">
1232 Undefined behavior: calling <code>sum()</code>/<code>min()</code>/<code>
1233 max()</code> methods of a zero length <code>valarray<code> the behavior is
1234 undefined.
1235 <p>Source: C++03 26.3.2.7p2, p3, p4; C++11 26.6.2.8p5, p6,
1236 p7.</p></div></div></td>
1237 <td><div class="exampleContainer expandable">
1238 <div class="example"><pre>
1239 #include &lt;valarray&gt;
1240
1241 void test(void) {
1242   std::valarray&lt;int&gt; v(0, 0);
1243   v.sum(); // warn
1244 }
1245 </pre></div></div></td>
1246 <td class="aligned"></td></tr>
1247
1248
1249 <tr><td><div class="namedescr expandable"><span class="name">
1250 undefbehavior.ValarrayBadIndirection</span><span class="lang">
1251 (C++)</span><div class="descr">
1252 Undefined behavior: element is specified more than once in an indirection.
1253 <p>Source: C++03 26.3.9.2p2, 26.3.9.3p2; C++11 26.6.9.2p2,
1254 26.6.9.3p2.</p></div></div></td>
1255 <td><div class="exampleContainer expandable">
1256 <div class="example"><pre>
1257 #include &lt;valarray&gt;
1258
1259 void test() {
1260   // '1' is specified more then once
1261   size_t addr[] = {0, 1, 1};
1262   std::valarray&lt;size_t&gt;indirect(addr, 3);
1263   std::valarray&lt;int&gt; a(0, 5), b(1, 3);
1264   a[indirect] = b; //warn
1265 }
1266 </pre></div>
1267 <div class="example"><pre>
1268 #include &lt;valarray&gt;
1269
1270 void test() {
1271   // '1' is specified more then once
1272   size_t addr[] = {0, 1, 1};
1273   std::valarray&lt;size_t&gt;indirect(addr, 3);
1274   std::valarray&lt;int&gt; a(0, 5), b(1, 3);
1275   a[indirect] *= b; //warn
1276 }
1277 </pre></div></div></td>
1278 <td class="aligned"></td></tr>
1279
1280
1281 <tr><td><div class="namedescr expandable"><span class="name">
1282 undefbehavior.IosBaseDestroyedBeforeInit</span><span class="lang">
1283 (C++)</span><div class="descr">
1284 Undefined behavior: <code>ios_base</code> object is destroyed before
1285 initialization have taken place. <code>basic_ios::init</code> should be call to
1286 initialize <code>ios_base</code> members.
1287 <p>Source: C++03 27.4.2.7p1, 27.4.4.1p2; C++11 27.5.3.7p1,
1288 27.5.5.2p2.</p></div></div></td>
1289 <td><div class="exampleContainer expandable">
1290 <div class="example"><pre>
1291 #include &lt;ios&gt;
1292
1293 using namespace std;
1294 template &lt;class T, class Traits = std::char_traits&lt;T&gt; &gt;
1295 class my_stream1 : public std::basic_ios&lt;T, Traits&gt; {
1296 };
1297
1298 template &lt;class T, class Traits = std::char_traits&lt;T&gt; &gt;
1299 class my_stream2 : public std::basic_ios&lt;T, Traits&gt; {
1300   class my_streambuf
1301   : public std::basic_streambuf&lt;T, Traits&gt; {
1302   };
1303 public:
1304   my_stream2() {
1305     this->init(new my_streambuf);
1306   }
1307 };
1308
1309 void test() {
1310   my_stream1&lt;char&gt; *p1 = new my_stream1&lt;char&gt;;
1311   my_stream2&lt;char&gt; *p2 = new my_stream2&lt;char&gt;;
1312   delete p1; // warn
1313   delete p2; // ok
1314 }
1315 </pre></div></div></td>
1316 <td class="aligned"></td></tr>
1317
1318
1319 <tr><td><div class="namedescr expandable"><span class="name">
1320 undefbehavior.IosBaseUsedBeforeInit</span><span class="lang">
1321 (C++11)</span><div class="descr">
1322 Undefined behavior: <code>ios_base</code> object is used before initialization
1323 have taken place. <code>basic_ios::init</code> should be call to
1324 initialize <code>ios_base</code> members.
1325 <p>Source: C++11 27.5.3.7p1, 27.5.5.2p2.</p></div></div></td>
1326 <td><div class="exampleContainer expandable">
1327 <div class="example"><pre>
1328 #include &lt;ios&gt;
1329
1330 using namespace std;
1331 template &lt;class T, class Traits = std::char_traits&lt;T&gt; &gt;
1332 class my_stream1 : public std::basic_ios&lt;T, Traits&gt; {
1333 };
1334
1335 template &lt;class T, class Traits = std::char_traits&lt;T&gt; &gt;
1336 class my_stream2 : public std::basic_ios&lt;T, Traits&gt; {
1337   class my_streambuf
1338   : public std::basic_streambuf&lt;T, Traits&gt; {
1339   };
1340 public:
1341   my_stream2() {
1342     this->init(new my_streambuf);
1343   }
1344 };
1345
1346 void test() {
1347   my_stream1&lt;char&gt; *p1 = new my_stream1&lt;char&gt;;
1348   my_stream2&lt;char&gt; *p2 = new my_stream2&lt;char&gt;;
1349   p1->narrow('a', 'b'); // warn
1350   p2->narrow('a', 'b'); // ok
1351 }
1352 </pre></div></div></td>
1353 <td class="aligned"></td></tr>
1354
1355
1356 <tr><td><div class="namedescr expandable"><span class="name">
1357 undefbehavior.MinusOnePosType</span><span class="lang">
1358 (C++)</span><div class="descr">
1359 Undefined behavior: passing -1 to any <code>streambuf</code>/<code>
1360 istream</code>/<code>ostream</code> member that accepts a value of
1361 type <code>traits::pos_type</code> result in undefined behavior.
1362 <p>Source: C++03 27.4.3.2p3; C++11 27.5.4.2p3.</p></div></div></td>
1363 <td><div class="exampleContainer expandable">
1364 <div class="example"><pre>
1365 #include &lt;fstream&gt;
1366
1367 class my_streambuf : public std::streambuf {
1368   void f() {
1369     seekpos(-1); // warn
1370   }
1371 };
1372 </pre></div>
1373 <div class="example"><pre>
1374 #include &lt;fstream&gt;
1375
1376 void test() {
1377   std::filebuf fb;
1378   std::istream in(&amp;fb);
1379   std::filebuf::off_type pos(-1);
1380   in.seekg(pos); // warn
1381 }
1382 </pre></div></div></td>
1383 <td class="aligned"></td></tr>
1384
1385 </table>
1386
1387 <!-- ============================ different ================================ -->
1388 <h3>different</h3>
1389 <table class="checkers">
1390 <col class="namedescr"><col class="example"><col class="progress">
1391 <thead><tr><td>Name, Description</td><td>Example</td><td>Progress</td></tr>
1392 </thead>
1393
1394 <tr><td><div class="namedescr expandable"><span class="name">
1395 different.SuccessiveAssign</span><span class="lang">
1396 (C)</span><div class="descr">
1397 Successive assign to a variable.</div></div></td>
1398 <td><div class="exampleContainer expandable">
1399 <div class="example"><pre>
1400 int test() {
1401   int i;
1402   i=1;
1403   i=2; // warn
1404   return i;
1405 }
1406 </pre></div></div></td>
1407 <td class="aligned"></td></tr>
1408
1409
1410 <tr><td><div class="namedescr expandable"><span class="name">
1411 different.NullDerefStmtOrder</span><span class="lang">
1412 (C)</span><div class="descr">
1413 Dereferencing of the null pointer might take place. Checking the pointer for 
1414 null should be performed first.
1415 <br>Note: possibly an enhancement to <span class="name">
1416 core.NullDereference</span>.</div></div></td>
1417 <td><div class="exampleContainer expandable">
1418 <div class="example"><pre>
1419 struct S {
1420   int x;
1421 };
1422
1423 struct S* f();
1424
1425 void test() {
1426   struct S *p1 = f();
1427   int x1 = p1-&gt;x; // warn
1428   if (p1) {};
1429
1430   struct S *p2 = f();
1431   int x2 = p2-&gt;x; // ok
1432 }
1433 </pre></div></div></td>
1434 <td class="aligned"></td></tr>
1435
1436
1437 <tr><td><div class="namedescr expandable"><span class="name">
1438 different.NullDerefCondOrder</span><span class="lang">
1439 (C)</span><div class="descr">
1440 Dereferencing of the null pointer might take place. Checking the pointer for 
1441 null should be performed first.
1442 <br>Note: possibly an enhancement to <span class="name">
1443 core.NullDereference</span>.</div></div></td>
1444 <td><div class="exampleContainer expandable">
1445 <div class="example"><pre>
1446 struct S {int i;};
1447
1448 struct S* f();
1449
1450 void test() {
1451   struct S *p = f();
1452   if (p-&gt;i && p) {}; // warn
1453 }
1454 </pre></div></div></td>
1455 <td class="aligned"></td></tr>
1456
1457
1458 <tr><td><div class="namedescr expandable"><span class="name">
1459 different.MultipleAccessors</span><span class="lang">
1460 (C++)</span><div class="descr">
1461 Identical accessor bodies. Possibly a misprint.</div></div></td>
1462 <td><div class="exampleContainer expandable">
1463 <div class="example"><pre>
1464 class A {
1465   int i;
1466   int j;
1467 public:
1468   int getI() { return i; }
1469   int getJ() { return i; } // warn
1470 };
1471 </pre></div>
1472 <div class="example"><pre>
1473 class A {
1474   int i;
1475   int j;
1476 public:
1477   void setI(int& ii) { i = ii; }
1478   void setJ(int& jj) { i = jj; } // warn
1479 };
1480 </pre></div></div></td>
1481 <td class="aligned"></td></tr>
1482
1483
1484 <tr><td><div class="namedescr expandable"><span class="name">
1485 different.AccessorsForPublic</span><span class="lang">
1486 (C++)</span><div class="descr">
1487 Accessors exist for a public class field. Should this field really be
1488 public?</div></div></td>
1489 <td><div class="exampleContainer expandable">
1490 <div class="example"><pre>
1491 class A {
1492 public:
1493   int i; // warn
1494   int getI() { return i; }
1495   void setI(int& ii) { i = ii; }
1496 };
1497 </pre></div></div></td>
1498 <td class="aligned"></td></tr>
1499
1500
1501 <tr><td><div class="namedescr expandable"><span class="name">
1502 different.LibFuncResultUnised</span><span class="lang">
1503 (C, C++)</span><div class="descr">
1504 Calling a function ignoring its return value is of no use (create the list of
1505 known system/library/API functions falling into this category).</div></div></td>
1506 <td><div class="exampleContainer expandable">
1507 <div class="example"><pre>
1508 #include &lt;vector&gt;
1509
1510 void test() {
1511   std::vector&lt;int&gt; v;
1512   v.empty(); // warn
1513 }
1514 </pre></div></div></td>
1515 <td class="aligned"></td></tr>
1516
1517
1518 <tr><td><div class="namedescr expandable"><span class="name">
1519 different.WrongVarForStmt</span><span class="lang">
1520 (C, C++)</span><div class="descr">
1521 Wrong variable is possibly used in the loop/cond-expression of
1522 the <code>for</code> statement. Did you mean
1523 'proper_variable_name'?</div></div></td>
1524 <td><div class="exampleContainer expandable">
1525 <div class="example"><pre>
1526 void test() {
1527   int i = 0;
1528   int j = 0;
1529   for (i = 0; i < 3; j += 1); // warn
1530 }
1531 </pre></div>
1532 <div class="example"><pre>
1533 void test() {
1534   int i = 0;
1535   int j = 0;
1536   for (int j = 0; i < 3; ++j); // warn
1537 }
1538 </pre></div></div></td>
1539 <td class="aligned"></td></tr>
1540
1541
1542 <tr><td><div class="namedescr expandable"><span class="name">
1543 different.FloatingCompare</span><span class="lang">
1544 (C)</span><div class="descr">
1545 Comparing floating point numbers may be not precise.</div></div></td>
1546 <td><div class="exampleContainer expandable">
1547 <div class="example"><pre>
1548 #include &lt;math.h&gt;
1549
1550 double test() {
1551   double b = sin(M_PI / 6.0);
1552   if (b == 0.5) // warn
1553     b = 0;
1554   return b;
1555 }
1556 </pre></div></div></td>
1557 <td class="aligned"></td></tr>
1558
1559
1560 <tr><td><div class="namedescr expandable"><span class="name">
1561 different.BitwiseOpBoolArg</span><span class="lang">
1562 (C, C++)</span><div class="descr">
1563 Boolean value met at the left/right part of the bitwise <code>&amp;</code>
1564 or <code>|</code> operator.
1565 Did you mean <code>&amp;&amp;</code> (<code>||</code>) ?</div></div></td>
1566 <td><div class="exampleContainer expandable">
1567 <div class="example"><pre>
1568 int f();
1569
1570 void test() {
1571   bool b = true;
1572   if (b &amp; f()) {} // warn
1573 }
1574 </pre></div></div></td>
1575 <td class="aligned"></td></tr>
1576
1577
1578 <tr><td><div class="namedescr expandable"><span class="name">
1579 different.LabelInsideSwitch</span><span class="lang">
1580 (C)</span><div class="descr">
1581 Possibly a misprint: label found inside a <code>switch()</code>
1582 statement.</div></div></td>
1583 <td><div class="exampleContainer expandable">
1584 <div class="example"><pre>
1585 void test(int c) {
1586   switch(c){
1587   case 1:
1588     c += 1; break;
1589   defalt: // warn (did you mean 'default'?)
1590     c -= 1; break;
1591   }
1592 }
1593 </pre></div></div></td>
1594 <td class="aligned"></td></tr>
1595
1596
1597 <tr><td><div class="namedescr expandable"><span class="name">
1598 different.IdenticalCondIfIf</span><span class="lang">
1599 (C)</span><div class="descr">
1600 The conditions of two subsequent <code>if</code> statements are
1601 identical.</div></div></td>
1602 <td><div class="exampleContainer expandable">
1603 <div class="example"><pre>
1604 int test(int c) {
1605   if (c &gt; 5)
1606     c += 1;
1607   if (c &gt; 5) // warn
1608     c -= 1;
1609   return c;
1610 }
1611 </pre></div></div></td>
1612 <td class="aligned"></td></tr>
1613
1614
1615 <tr><td><div class="namedescr expandable"><span class="name">
1616 different.LogicalOpUselessArg</span><span class="lang">
1617 (C)</span><div class="descr">
1618 The second operand of a <code>&amp;&amp;</code> operator has no impact on
1619 expression result.</div></div></td>
1620 <td><div class="exampleContainer expandable">
1621 <div class="example"><pre>
1622 void test(unsigned a) {
1623   if (a&lt;7 &amp;&amp; a&lt;10) {}; // warn
1624 }
1625 </pre></div></div></td>
1626 <td class="aligned"></td></tr>
1627
1628
1629 <tr><td><div class="namedescr expandable"><span class="name">
1630 different.SameResLogicalExpr</span><span class="lang">
1631 (C)</span><div class="descr">
1632 An expression is always evaluated to true/false.</div></div></td>
1633 <td><div class="exampleContainer expandable">
1634 <div class="example"><pre>
1635 void test() {
1636   int i = 0;
1637   if (i != 0) {}; // warn
1638 }
1639 </pre></div>
1640 <div class="example"><pre>
1641 void test(int i) {
1642   if (i == 0 &amp;&amp; i == 1) {}; // warn
1643 }
1644 </pre></div>
1645 <div class="example"><pre>
1646 void test(int i) {
1647   if (i < 0 || i >= 0) {}; // warn
1648 }
1649 </pre></div></div></td>
1650 <td class="aligned"></td></tr>
1651
1652
1653 <tr><td><div class="namedescr expandable"><span class="name">
1654 different.OpPrecedenceAssignCmp</span><span class="lang">
1655 (C, C++)</span><div class="descr">
1656 Comparison operation has higher precedence then assignment. Boolean value is
1657 assigned to a variable of other type. Parenthesis may bee required around an
1658 assignment.</div></div></td>
1659 <td><div class="exampleContainer expandable">
1660 <div class="example"><pre>
1661 int f();
1662
1663 void test(int x, int y) {
1664   bool b;
1665   if((b = x != y)) {} // ok
1666   if((x = f() != y)) {} // warn
1667 }
1668 </pre></div></div></td>
1669 <td class="aligned"></td></tr>
1670
1671
1672 <tr><td><div class="namedescr expandable"><span class="name">
1673 different.OpPrecedenceIifShift</span><span class="lang">
1674 (C, C++)</span><div class="descr">
1675 <code>?:</code> has lower precedence then <code>&lt;&lt;</code>.
1676 <p>Source: Stephen C. Dewhurst "C++ Gotchas: Avoiding Common Problems in Coding
1677 and Design", advise 15.</p></div></div></td>
1678 <td><div class="exampleContainer expandable">
1679 <div class="example"><pre>
1680 #include &lt;iostream&gt;
1681
1682 void test(int a) {
1683   std::cout &lt;&lt; a ? "a" : "b"; // warn
1684 }
1685 </pre></div>
1686 <div class="example"><pre>
1687 void test(int a) {
1688   a &lt;&lt; a &gt; 7 ? 1 : 2; // warn
1689 }
1690 </pre></div></div></td>
1691 <td class="aligned"></td></tr>
1692
1693
1694 <tr><td><div class="namedescr expandable"><span class="name">
1695 different.ObjectUnused</span><span class="lang">
1696 (C++)</span><div class="descr">
1697 The object was created but is not being used.</div></div></td>
1698 <td><div class="exampleContainer expandable">
1699 <div class="example"><pre>
1700 struct S {
1701   int x, y;
1702   S(int xx, int yy) : x(xx), y(yy) {}
1703   S(int xx) {
1704     S(xx, 0); // warn
1705   }
1706 };
1707 </pre></div>
1708 <div class="example"><pre>
1709 #include &lt;exception&gt;
1710
1711 void test() {
1712   std::exception();
1713     // warn (did you mean 'throw std::exception()'?)
1714 }
1715 </pre></div></div></td>
1716 <td class="aligned"></td></tr>
1717
1718
1719 <tr><td><div class="namedescr expandable"><span class="name">
1720 different.StaticArrayPtrCompare</span><span class="lang">
1721 (C)</span><div class="descr">
1722 Pointer to static array is being compared to NULL. May the subscripting is
1723 missing.</div></div></td>
1724 <td><div class="exampleContainer expandable">
1725 <div class="example"><pre>
1726 void test() {
1727   int a[1][1];
1728   if (a[0] == 0) {}; // warn
1729 }
1730 </pre></div></div></td>
1731 <td class="aligned"></td></tr>
1732
1733
1734 <tr><td><div class="namedescr expandable"><span class="name">
1735 different.ConversionToBool</span><span class="lang">
1736 (C, C++)</span><div class="descr">
1737 Odd implicit conversion to boolean.
1738 <br>Note: possibly merge with <span class="name">
1739 alpha.core.BoolAssignment</span>.</div></div></td>
1740 <td><div class="exampleContainer expandable">
1741 <div class="example"><pre>
1742 bool test() {
1743   return 1.; // warn
1744 }
1745 </pre></div>
1746 <div class="example"><pre>
1747 bool test() {
1748   return ""; // warn
1749 }
1750 </pre></div></div></td>
1751 <td class="aligned"></td></tr>
1752
1753
1754 <tr><td><div class="namedescr expandable"><span class="name">
1755 different.ArrayBound</span><span class="lang">
1756 (C++)</span><div class="descr">
1757 Out-of-bound dynamic array access.
1758 <br>Note: possibly an enhancement to <span class="name">
1759 alpha.security.ArrayBoundV2</span>.</div></div></td>
1760 <td><div class="exampleContainer expandable">
1761 <div class="example"><pre>
1762 void test() {
1763   int *p = new int[1];
1764   int i = 1;
1765   if(p[i]) {}; // warn
1766   delete[] p;
1767 }
1768 </pre></div></div></td>
1769 <td class="aligned"></td></tr>
1770
1771
1772 <tr><td><div class="namedescr expandable"><span class="name">
1773 different.StrcpyInputSize</span><span class="lang">
1774 (C)</span><div class="descr">
1775 Buffer copy without checking the size of input.
1776 <br>Note: possibly an enhancement to <span class="name">
1777 alpha.unix.cstring.OutOfBounds</span>.</div></div></td>
1778 <td><div class="exampleContainer expandable">
1779 <div class="example"><pre>
1780 void test(char* string) {
1781   char buf[24];
1782   strcpy(buf, string); // warn
1783 }
1784 </pre></div></div></td>
1785 <td class="aligned"></td></tr>
1786
1787
1788 <tr><td><div class="namedescr expandable"><span class="name">
1789 different.IntegerOverflow</span><span class="lang">
1790 (C)</span><div class="descr">
1791 Integer overflow.
1792 <br>Note: partially handled by Clang core
1793 (search for 'overflow in expression' warning in Clang tests).
1794 <p>Source: <a href="http://cwe.mitre.org/data/definitions/190.html">
1795 CWE-190</a>.</p></div></div></td>
1796 <td><div class="exampleContainer expandable">
1797 <div class="example"><pre>
1798 #include &lt;limits.h&gt;
1799
1800 int f(int x);
1801
1802 void test() {
1803   f(INT_MAX + 1); // warn
1804 }
1805 </pre></div>
1806 <div class="example"><pre>
1807 #include &lt;limits.h&gt;
1808
1809 int test() {
1810   int x = INT_MAX / 2 + 1;
1811   return x * 2; // warn
1812 }
1813 </pre></div></div></td>
1814 <td class="aligned"></td></tr>
1815
1816
1817 <tr><td><div class="namedescr expandable"><span class="name">
1818 different.SignExtension</span><span class="lang">
1819 (C)</span><div class="descr">
1820 Unexpected sign extension might take place.
1821 <p>Source: <a href="http://cwe.mitre.org/data/definitions/194.html">
1822 CWE-194</a>.</p></div></div></td>
1823 <td><div class="exampleContainer expandable">
1824 <div class="example"><pre>
1825 unsigned long long test(long long sll) {
1826   unsigned long long ull = sll; // warn
1827   return ull;
1828 }
1829 </pre></div>
1830 <div class="example"><pre>
1831 void f(unsigned int i);
1832
1833 void test(int si) {
1834   f(si); // warn
1835 }
1836 </pre></div>
1837 <div class="example"><pre>
1838 unsigned int test(int i) {
1839   return i;
1840 }
1841 </pre></div></div></td>
1842 <td class="aligned"></td></tr>
1843
1844
1845 <tr><td><div class="namedescr expandable"><span class="name">
1846 different.NumericTruncation</span><span class="lang">
1847 (C)</span><div class="descr">
1848 Numeric truncation might take place.
1849 <p>Source: <a href="http://cwe.mitre.org/data/definitions/197.html">
1850 CWE-197</a>.</p></div></div></td>
1851 <td><div class="exampleContainer expandable">
1852 <div class="example"><pre>
1853 unsigned long test(unsigned long long ull) {
1854   unsigned long ul = ull; // warn
1855   return ul;
1856 }
1857 </pre></div>
1858 <div class="example"><pre>
1859 void f(int i);
1860
1861 void test(long long sll) {
1862   f(sll); // warn
1863 }
1864 </pre></div>
1865 <div class="example"><pre>
1866 int f();
1867
1868 short test(long long sll) {
1869   short ss = f();
1870   return ss;
1871 }
1872 </pre></div></div></td>
1873 <td class="aligned"></td></tr>
1874
1875
1876 <tr><td><div class="namedescr expandable"><span class="name">
1877 different.MissingCopyCtorAssignOp</span><span class="lang">
1878 (C++)</span><div class="descr">
1879 A class has dynamically allocated data members but do not define a copy
1880 constructor/assignment operator.
1881 <p>Source: Scott Meyers "Effective C++", item 11: Prevent exceptions from
1882 leaving destructors.</p></div></div></td>
1883 <td><div class="exampleContainer expandable">
1884 <div class="example"><pre>
1885 class C {
1886   int *p; // warn
1887 public:
1888   C() { p = new int; }
1889   ~C() { delete p; }
1890 };
1891 </pre></div></div></td>
1892 <td class="aligned"></td></tr>
1893
1894 </table>
1895
1896 <!-- ============================ WinAPI =================================== -->
1897 <h3>WinAPI</h3>
1898 <table class="checkers">
1899 <col class="namedescr"><col class="example"><col class="progress">
1900 <thead><tr><td>Name, Description</td><td>Example</td><td>Progress</td></tr></thead>
1901
1902 <tr><td><div class="namedescr expandable"><span class="name">
1903 WinAPI.CreateProcess</span><span class="lang">
1904 (C)</span><div class="descr">
1905 <code>CreateProcess()</code>: if the first parameter <code><i>
1906 lpApplicationName</i></code> is NULL then the executable name must be in the
1907 white space-delimited string pointed to by <code><i>lpCommandLine</code></i>.
1908 If the executable or path name has a space in it, there is a risk that a
1909 different executable could be run because of the way the function parses
1910 spaces.
1911 <p>Source: <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425%28v=vs.85%29.aspx">
1912 MSDN: CreateProcess function, Security Remarks</a>.</p></div></div></td>
1913 <td><div class="exampleContainer expandable">
1914 <div class="example"><pre>
1915 #include &lt;windows.h&gt;
1916
1917 void test() {
1918   STARTUPINFO si;
1919   PROCESS_INFORMATION pi;
1920   CreateProcess(NULL, TEXT("C:\\Program Files\\App -L -S"),
1921                 NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
1922     // warn
1923 }
1924 </pre></div></div></td>
1925 <td class="aligned"></td></tr>
1926
1927
1928 <tr><td><div class="namedescr expandable"><span class="name">
1929 WinAPI.LoadLibrary</span><span class="lang">
1930 (C)</span><div class="descr">
1931 The <code>SearchPath()</code> function is used to retrieve a path to a DLL for
1932 a subsequent <code>LoadLibrary()</code> call.
1933 <p>Source: <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms684175%28v=vs.85%29.aspx">
1934 MSDN: LoadLibrary function, Security Remarks</a>.</p></div></div></td>
1935 <td><div class="exampleContainer expandable">
1936 <div class="example"><pre>
1937 #include &lt;windows.h&gt;
1938
1939 HINSTANCE test() {
1940   char filePath[100];
1941   SearchPath(NULL, "file.dll", NULL, 100, filePath, NULL);
1942   return LoadLibrary(filePath); // warn
1943 }
1944 </pre></div></div></td>
1945 <td class="aligned"></td></tr>
1946
1947
1948 <tr><td><div class="namedescr expandable"><span class="name">
1949 WinAPI.WideCharToMultiByte</span><span class="lang">
1950 (C)</span><div class="descr">
1951 Buffer overrun while calling <code>WideCharToMultiByte()</code>. The size of
1952 the input buffer equals the number of characters in the Unicode string, while
1953 the size of the output buffer equals the number of bytes.
1954 <p>Source: <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/dd374130%28v=vs.85%29.aspx">
1955 MSDN: WideCharToMultiByte function</a>.</p></div></div></td>
1956 <td><div class="exampleContainer expandable">
1957 <div class="example"><pre>
1958 #include &lt;windows.h&gt;
1959
1960 void test() {
1961   wchar_t ws[] = L"abc";
1962   char s[3];
1963   WideCharToMultiByte(CP_UTF8, 0, ws, -1, s,
1964                       3, NULL, NULL); // warn
1965 }
1966 </pre></div></div></td>
1967 <td class="aligned"></td></tr>
1968
1969
1970 </table>
1971
1972 <!-- =========================== optimization ============================== -->
1973 <h3>optimization</h3>
1974 <table class="checkers">
1975 <col class="namedescr"><col class="example"><col class="progress">
1976 <thead><tr><td>Name, Description</td><td>Example</td><td>Progress</td></tr></thead>
1977
1978 <tr><td><div class="namedescr expandable"><span class="name">
1979 optimization.PassConstObjByValue</span><span class="lang">
1980 (C, C++)</span><div class="descr">
1981 Optimization: It is more effective to pass constant parameter by reference to
1982 avoid unnecessary object copying.</div></div></td>
1983 <td><div class="exampleContainer expandable">
1984 <div class="example"><pre>
1985 struct A {};
1986
1987 void f(const struct A a); // warn
1988 </pre></div></div></td>
1989 <td class="aligned"></td></tr>
1990
1991
1992 <tr><td><div class="namedescr expandable"><span class="name">
1993 optimization.PostfixIncIter</span><span class="lang">
1994 (C++)</span><div class="descr">
1995 Optimization: It is more effective to use prefix increment operator with
1996 iterator.
1997 <p>Source: Scott Meyers "More Effective C++", item 6:
1998 Distinguish between prefix and postfix forms of increment and decrement
1999 operators.</p></div></div></td>
2000 <td><div class="exampleContainer expandable">
2001 <div class="example"><pre>
2002 #include &lt;vector&gt;
2003
2004 void test() {
2005   std::vector&lt;int&gt; v;
2006   std::vector&lt;int&gt;::const_iterator it;
2007   for(it = v.begin(); 
2008       it != v.end(); it++) {}; // warn
2009 }
2010 </pre></div></div></td>
2011 <td class="aligned"></td></tr>
2012
2013
2014 <tr><td><div class="namedescr expandable"><span class="name">
2015 optimization.MultipleCallsStrlen</span><span class="lang">
2016 (C)</span><div class="descr">
2017 Optimization: multiple calls to <code>strlen()</code> for a string in an
2018 expression. It is more effective to hold a value returned
2019 from <code>strlen()</code> in a temporary variable.</div></div></td>
2020 <td><div class="exampleContainer expandable">
2021 <div class="example"><pre>
2022 #include &lt;string.h&gt;
2023
2024 void test(const char* s) {
2025   if (strlen(s) &gt; 0 &amp;&amp;
2026       strlen(s) &lt; 7) {}; // warn
2027 }
2028 </pre></div></div></td>
2029 <td class="aligned"></td></tr>
2030
2031
2032 <tr><td><div class="namedescr expandable"><span class="name">
2033 optimization.StrLengthCalculation</span><span class="lang">
2034 (C++)</span><div class="descr">
2035 Optimization: it is more efficient to use <code>string::length()</code> to
2036 calculate the length of an <code>std::string</code>.</div></div></td>
2037 <td><div class="exampleContainer expandable">
2038 <div class="example"><pre>
2039 #include &lt;string&gt;
2040 #include &lt;string.h&gt;
2041
2042 void test() {
2043   std::string s;
2044   if (strlen(s.c_str()) != 0) {}; // warn
2045 }
2046 </pre></div></div></td>
2047 <td class="aligned"></td></tr>
2048
2049
2050 <tr><td><div class="namedescr expandable"><span class="name">
2051 optimization.EmptyContainerDetect</span><span class="lang">
2052 (C++)</span><div class="descr">
2053 Optimization: It is more efficient to use containers <code>empty()</code>
2054 method to identify an empty container.</div></div></td>
2055 <td><div class="exampleContainer expandable">
2056 <div class="example"><pre>
2057 #include &lt;list&gt;
2058
2059 void test() {
2060   std::list&lt;int&gt; l;
2061   if (l.size() != 0) {}; // warn
2062 }
2063 </pre></div></div></td>
2064 <td class="aligned"></td></tr>
2065
2066
2067 </table>
2068
2069 <br>
2070 </div> <!-- page -->
2071 </div> <!-- content -->
2072 </body>
2073 </html>