You've already forked linux-packaging-mono
							
							
		
			
	
	
		
			2017 lines
		
	
	
		
			54 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
		
		
			
		
	
	
			2017 lines
		
	
	
		
			54 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
|   | <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" | ||
|  |           "http://www.w3.org/TR/html4/strict.dtd"> | ||
|  | <html> | ||
|  | <head> | ||
|  |   <title>List of potential checkers</title> | ||
|  |   <link type="text/css" rel="stylesheet" href="content.css"> | ||
|  |   <link type="text/css" rel="stylesheet" href="menu.css"> | ||
|  |   <script type="text/javascript" src="scripts/expandcollapse.js"></script> | ||
|  |   <script type="text/javascript" src="scripts/menu.js"></script> | ||
|  | </head> | ||
|  | <body onload="initExpandCollapse()"> | ||
|  | 
 | ||
|  | <div id="page"> | ||
|  | 
 | ||
|  | <!-- menu --> | ||
|  | <!--#include virtual="menu.html.incl"--> | ||
|  | <!-- page content --> | ||
|  | <div id="content"> | ||
|  | <h1>List of potential checkers</h1> | ||
|  | 
 | ||
|  | <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> | ||
|  | 
 | ||
|  | <!-- ========================= allocation/deallocation ======================= --> | ||
|  | <h3>memory</h3> | ||
|  | <table class="checkers"> | ||
|  | <col class="namedescr"><col class="example"><col class="progress"> | ||
|  | <thead><tr><td>Name, Description</td><td>Example</td><td>Progress</td></tr></thead> | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | memory.LeakEvalOrder</span><span class="lang"> | ||
|  | (C, C++)</span><div class="descr"> | ||
|  | Potential memory leaks caused by an undefined argument evaluation order. | ||
|  | <p>Source: <a href="http://www.boost.org/doc/libs/1_49_0/libs/smart_ptr/shared_ptr.htm#BestPractices"> | ||
|  | boost docs: shared_ptr</a>.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | void f(int, int); | ||
|  | int g(void *); | ||
|  | int h() __attribute__((noreturn)); | ||
|  | 
 | ||
|  | void test() { | ||
|  |   // It is possible that 'malloc(1)' is called first, | ||
|  |   // then 'h()', that is (or calls) noreturn and eventually | ||
|  |   // 'g()' is never called. | ||
|  |   f(g(malloc(1)), h()); // warn: 'g()' may never be called. | ||
|  | } | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | void f(int, int); | ||
|  | int g(int *); | ||
|  | int h() { throw 1; }; | ||
|  | 
 | ||
|  | void test() { | ||
|  |   // It is possible that 'new int' is called first, | ||
|  |   // then 'h()', that throws an exception and eventually | ||
|  |   // 'g()' is never called. | ||
|  |   f(g(new int), h()); // warn: 'g()' may never be called. | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | memory.DstBufferTooSmall</span><span class="lang"> | ||
|  | (C, C++)</span><div class="descr"> | ||
|  | Destination buffer passed to memory function is too small. | ||
|  | <br>Note: <span class="name">security.insecureAPI.strcpy</span> currently warns | ||
|  | on usage of <code>strcpy</code> and suggests to replace it. | ||
|  | <br>Note: <span class="name">alpha.unix.CStringChecker</span> contains some similar checks. | ||
|  | <p>Source: <a href="https://cwe.mitre.org/data/definitions/120.html">CWE-120</a>.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | void test() { | ||
|  |   const char* s1 = "abc"; | ||
|  |   char *s2 = new char; | ||
|  |   strcpy(s2, s1); // warn | ||
|  | } | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | void test() { | ||
|  |   int* p1 = new int[3]; | ||
|  |   int* p2 = new int; | ||
|  |   memcpy(p2, p1, 3); // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | memory.NegativeArraySize</span><span class="lang"> | ||
|  | (C, C++)</span><div class="descr"> | ||
|  | 'n' is used to specify the buffer size may be negative. | ||
|  | <br>Note: possibly an enhancement to <span class="name"> | ||
|  | alpha.security.MallocOverflow</span>. | ||
|  | <p>Source: <a href="http://cwe.mitre.org/data/definitions/20.html">CWE-20, | ||
|  | Example 2</a>.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | void test() { | ||
|  |   int *p; | ||
|  |   int n1 = -1; | ||
|  |   p = new int[n1]; // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | memory.ZeroAlloc</span><span class="lang"> | ||
|  | (C, C++)</span><div class="descr"> | ||
|  | Allocation of zero bytes. | ||
|  | <br>Note: an enhancement to <span class="name">unix.Malloc</span>. | ||
|  | <br>Note: <span class="name">unix.API</span> perform C-checks for zero  | ||
|  | allocation. This should be moved to <span class="name">unix.Malloc</span>. | ||
|  | <p>Source: C++03 3.7.3.1p2; C++11 3.7.4.1p2.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | #include <stdlib.h> | ||
|  | 
 | ||
|  | void test() { | ||
|  |   int *p = malloc(0); // warn | ||
|  |   free(p); | ||
|  | } | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | void test() { | ||
|  |   int *p = new int[0]; // warn | ||
|  |   delete[] p; | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"><a href="http://reviews.llvm.org/D6178"> | ||
|  | D6178</a></td></tr> | ||
|  | 
 | ||
|  | </table> | ||
|  | 
 | ||
|  | <!-- ======================= constructors/destructors ====================== --> | ||
|  | <h3>constructors/destructors</h3> | ||
|  | <table class="checkers"> | ||
|  | <col class="namedescr"><col class="example"><col class="progress"> | ||
|  | <thead><tr><td>Name, Description</td><td>Example</td><td>Progress</td></tr></thead> | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | ctordtor.ExptInsideDtor</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | It is dangerous to let an exception leave a destructor. | ||
|  | Using <code>try..catch</code> solves the problem. | ||
|  | <p>Source: Scott Meyers "More Effective C++", item 11: Prevent exceptions from | ||
|  | leaving destructors.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | class A { | ||
|  |   A() {} | ||
|  |   ~A() { throw 1; } // warn | ||
|  | }; | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | void f() throw(int); | ||
|  | 
 | ||
|  | class A { | ||
|  |   A() {} | ||
|  |   ~A() { f(); } // warn | ||
|  | }; | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | ctordtor.PlacementSelfCopy</span><span class="lang"> | ||
|  | (C++11)</span><div class="descr"> | ||
|  | For a placement copy or move, it is almost certainly an error if the | ||
|  | constructed object is also the object being copied from.</div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | class A {}; | ||
|  | 
 | ||
|  | void test(A *dst, A *src) { | ||
|  |   ::new (dst) A(*dst); // warn (should be 'src') | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"><!--rdar://problem/13688366--></td></tr> | ||
|  | 
 | ||
|  | </table> | ||
|  | 
 | ||
|  | <!-- ============================== exceptions ============================= --> | ||
|  | <h3>exceptions</h3> | ||
|  | <table class="checkers"> | ||
|  | <col class="namedescr"><col class="example"><col class="progress"> | ||
|  | <thead><tr><td>Name, Description</td><td>Example</td><td>Progress</td></tr></thead> | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | exceptions.ThrowSpecButNotThrow</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | Function declaration has a <code>throw(<i>type</i>)</code> specifier but the | ||
|  | function do not throw exceptions.</div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | void test() throw(int) { | ||
|  | } // warn | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | exceptions.NoThrowSpecButThrows</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | An exception is throw from a function having a <code>throw()</code> | ||
|  | specifier.</div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | void test() throw() { | ||
|  |   throw(1); // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | exceptions.ThrownTypeDiffersSpec</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | The type of a thrown exception differs from those specified in | ||
|  | a <code>throw(<i>type</i>)</code> specifier.</div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | struct S{}; | ||
|  | 
 | ||
|  | void test() throw(int) { | ||
|  |   S s; | ||
|  |   throw (s); // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | </table> | ||
|  | 
 | ||
|  | <!-- ========================= smart pointers ============================== --> | ||
|  | <h3>smart pointers</h3> | ||
|  | <table class="checkers"> | ||
|  | <col class="namedescr"><col class="example"><col class="progress"> | ||
|  | <thead><tr><td>Name, Description</td><td>Example</td><td>Progress</td></tr></thead> | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | smartptr.SmartPtrInit</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | C++03: <code>auto_ptr</code> should store a pointer to an object obtained via | ||
|  | new as allocated memory will be cleaned using <code>delete</code>.<br> | ||
|  | C++11: one should use <code>unique_ptr<<i>type</i>[]></code> to keep a | ||
|  | pointer to memory allocated by <code>new[]</code>.<br> | ||
|  | C++11: to keep a pointer to memory allocated by <code>new[]</code> in | ||
|  | a <code>shared_ptr</code> one should use a custom deleter that calls <code> | ||
|  | delete[].</code>. | ||
|  | <p>Source: C++03 20.4.5p1; C++11 <code>auto_ptr</code> is deprecated (D.10).</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | #include <stdlib.h> | ||
|  | #include <memory> | ||
|  | 
 | ||
|  | void test() { | ||
|  |   std::auto_ptr<int> p1(new int); // Ok | ||
|  |   std::auto_ptr<int> p2(new int[3]); // warn | ||
|  | } | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | #include <stdlib.h> | ||
|  | #include <memory> | ||
|  | 
 | ||
|  | void test() { | ||
|  |   std::auto_ptr<int> p((int *)malloc(sizeof(int))); // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | </table> | ||
|  | 
 | ||
|  | <!-- ============================== dead code ============================== --> | ||
|  | <h3>dead code</h3> | ||
|  | <table class="checkers"> | ||
|  | <col class="namedescr"><col class="example"><col class="progress"> | ||
|  | <thead><tr><td>Name, Description</td><td>Example</td><td>Progress</td></tr></thead> | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | deadcode.UnmodifiedVariable</span><span class="lang"> | ||
|  | (C, C++)</span><div class="descr"> | ||
|  | A variable is never modified but was not declared const and is not a | ||
|  | reference.<br><br><i>(opt-in checker)</i></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | extern int computeDelta(); | ||
|  | 
 | ||
|  | int test(bool cond) { | ||
|  |   int i = 0; | ||
|  |   if (cond) { | ||
|  |     const int delta = computeDelta(); | ||
|  |     // warn: forgot to modify 'i' | ||
|  |   } | ||
|  |   return i; | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"><a href="http://llvm.org/bugs/show_bug.cgi?id=16890">PR16890</a></td></tr> | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | deadcode.IdempotentOperations</span><span class="lang"> | ||
|  | (C)</span><div class="descr"> | ||
|  | Warn about idempotent operations.</div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | void test() { | ||
|  |   int x = 7; | ||
|  |   x = x; // warn: value is always the same | ||
|  | } | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | void test() { | ||
|  |   int x = 7; | ||
|  |   x /= x; // warn: value is always 1 | ||
|  | } | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | void test() { | ||
|  |   int x = 7, one = 1; | ||
|  |   x *= one; // warn: right op is always 1 | ||
|  | } | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | void test() { | ||
|  |   int x = 7, zero = 0; | ||
|  |   x = x - zero; | ||
|  |    // warn: the right operand to '-' is always 0 | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned">removed from alpha.deadcode.* at | ||
|  | <a href="https://reviews.llvm.org/rL198476">r198476</a></td></tr> | ||
|  | 
 | ||
|  | </table> | ||
|  | 
 | ||
|  | <!-- ================================ POSIX ================================ --> | ||
|  | <h3>POSIX</h3> | ||
|  | <table class="checkers"> | ||
|  | <col class="namedescr"><col class="example"><col class="progress"> | ||
|  | <thead><tr><td>Name, Description</td><td>Example</td><td>Progress</td></tr></thead> | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | posix.Errno</span><span class="lang"> | ||
|  | (C)</span><div class="descr"> | ||
|  | Record that <code>errno</code> is non-zero when certain functions | ||
|  | fail.</div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | #include <stdlib.h> | ||
|  | 
 | ||
|  | int readWrapper(int fd, int *count) { | ||
|  |   int lcount = read(fd, globalBuf, sizeof(globalBuf)); | ||
|  |   if (lcount < 0) | ||
|  |     return errno; | ||
|  |   *count = lcount; | ||
|  |   return 0; | ||
|  | } | ||
|  | 
 | ||
|  | void use(int fd) { | ||
|  |   int count; | ||
|  |   if (!readWrapper(fd, &count)) | ||
|  |     print("%d", count); // should not warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"><a href="http://llvm.org/bugs/show_bug.cgi?id=18701">PR18701</a></td></tr> | ||
|  | 
 | ||
|  | </table> | ||
|  | 
 | ||
|  | <!-- ========================= undefined behavior ========================== --> | ||
|  | <h3>undefined behavior</h3> | ||
|  | <table class="checkers"> | ||
|  | <col class="namedescr"><col class="example"><col class="progress"> | ||
|  | <thead><tr><td>Name, Description</td><td>Example</td><td>Progress</td></tr></thead> | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | undefbehavior.ExitInDtor</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | Undefined behavior: <code>std::exit()</code> is called to end the program during | ||
|  | the destruction of an object with static storage duration. | ||
|  | <p>Source: C++11 3.6.1p4.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | #include <cstdlib> | ||
|  | 
 | ||
|  | class A { | ||
|  | public: | ||
|  |   ~A() { | ||
|  |     std::exit(1); // warn | ||
|  |   } | ||
|  | }; | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | undefbehavior.LocalStaticDestroyed</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | Undefined behavior: function containing a definition of static local object is  | ||
|  | called during the destruction of an object with static storage duration so that  | ||
|  | flow of control passes through the definition of the previously destroyed  | ||
|  | static local object. | ||
|  | <p>Source: C++11 3.6.3p2.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | void f(); | ||
|  | 
 | ||
|  | class A { | ||
|  | public: | ||
|  |   ~A() { | ||
|  |     f(); // warn | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | class B {}; | ||
|  | 
 | ||
|  | A a; | ||
|  | 
 | ||
|  | void f() { | ||
|  |   static B b; | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | undefbehavior.ZeroAllocDereference</span><span class="lang"> | ||
|  | (C, C++)</span><div class="descr"> | ||
|  | The effect of dereferencing a pointer returned as a request for zero size is  | ||
|  | undefined.<br> | ||
|  | Note: possibly an enhancement to <span class="name"> | ||
|  | unix.Malloc</span>. | ||
|  | <p>Source: C++03 3.7.3.1p2; C++11 3.7.4.1p2.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | #include <stdlib.h> | ||
|  | 
 | ||
|  | void test() { | ||
|  |   int *p = (int *)malloc(0); | ||
|  |   *p = 1; // warn | ||
|  |   free(p); | ||
|  | } | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | void f(int); | ||
|  | 
 | ||
|  | void test() { | ||
|  |   int *p = new int[0]; | ||
|  |   f(*p); // warn | ||
|  |   delete[] p; | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"><a href="http://reviews.llvm.org/D8273">D8273</a></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | undefbehavior.DeadReferenced</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | Undefined behavior: the following usage of the pointer to the object whose | ||
|  | lifetime has ended can result in undefined behavior:<br> | ||
|  | The object will be or was of a class type with a non-trivial destructor and | ||
|  | <ul><li>the pointer is used as the operand of a delete-expression</li></ul> | ||
|  | The object will be or was of a non-POD class type (C++11: any class type) and | ||
|  | <ul><li>the pointer is used to access a non-static data member or call a | ||
|  | non-static member function of the object</li> | ||
|  | <li>the pointer is implicitly converted to a pointer to a base class | ||
|  | type</li> | ||
|  | <li>the pointer is used as the operand of a <code>static_cast</code> (except | ||
|  | when the conversion is to <code>void*</code>, or to <code>void*</code> and  | ||
|  | subsequently to <code>char*</code>, or <code>unsigned char*</code>)</li> | ||
|  | <li>the pointer is used as the operand of a <code>dynamic_cast</code></li></ul> | ||
|  | <p>Source: C++03 3.8p5, p7; C++11 3.8p5, p7.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | #include <new> | ||
|  | 
 | ||
|  | class A { | ||
|  | public: | ||
|  |   ~A(); | ||
|  | }; | ||
|  | 
 | ||
|  | class B : public A {}; | ||
|  | 
 | ||
|  | void test() { | ||
|  |   A *a = new A; | ||
|  |   new(a) B; | ||
|  |   delete a; // warn | ||
|  | } | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | #include <new> | ||
|  | 
 | ||
|  | class A { | ||
|  | public: | ||
|  |   ~A(); | ||
|  | }; | ||
|  | 
 | ||
|  | class B {}; | ||
|  | 
 | ||
|  | void test() { | ||
|  |   A *a = new A; | ||
|  |   new(a) B; | ||
|  |   a->~A(); | ||
|  | } | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | #include <new> | ||
|  | 
 | ||
|  | class A { | ||
|  | public: | ||
|  |   ~A(); | ||
|  | }; | ||
|  | 
 | ||
|  | class B : public A {}; | ||
|  | 
 | ||
|  | class C {}; | ||
|  | 
 | ||
|  | void f(A*); | ||
|  | 
 | ||
|  | void test() { | ||
|  |   B *b = new B; | ||
|  |   new(b) C; | ||
|  |   f(b); // warn | ||
|  | } | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | #include <new> | ||
|  | 
 | ||
|  | class A { | ||
|  | public: | ||
|  |   ~A(); | ||
|  | }; | ||
|  | 
 | ||
|  | class B : public A {}; | ||
|  | 
 | ||
|  | class C {}; | ||
|  | 
 | ||
|  | A* test() { | ||
|  |   B *b = new B; | ||
|  |   new(b) C; | ||
|  |   return static_cast<A*>(b); // warn | ||
|  | } | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | #include <new> | ||
|  | 
 | ||
|  | class A { | ||
|  | public: | ||
|  |   ~A(); | ||
|  | }; | ||
|  | 
 | ||
|  | class B : public A {}; | ||
|  | 
 | ||
|  | class C {}; | ||
|  | 
 | ||
|  | A* test() { | ||
|  |   B *b = new B; | ||
|  |   new(b) C; | ||
|  |   return dynamic_cast<A*>(b); // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | undefbehavior.ObjLocChanges</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | Undefined behavior: the program must ensure that an object occupies the same  | ||
|  | storage location when the implicit or explicit destructor call takes place. | ||
|  | <p>Source: C++11 3.8p8.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | #include <new> | ||
|  | 
 | ||
|  | class A {}; | ||
|  | 
 | ||
|  | class B { | ||
|  | public: | ||
|  |   ~B(); | ||
|  | }; | ||
|  | 
 | ||
|  | void test() { | ||
|  |   B b; | ||
|  |   new (&b) A; | ||
|  | } // warn | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | #include <new> | ||
|  | 
 | ||
|  | class A {}; | ||
|  | 
 | ||
|  | class B { | ||
|  | public: | ||
|  |   ~B(); | ||
|  | }; | ||
|  | 
 | ||
|  | void test() { | ||
|  |   B *b = new B; | ||
|  |   new (b) A; | ||
|  |   delete b; // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | undefbehavior.ExprEvalOrderUndef</span><span class="lang"> | ||
|  | (C, C++03)</span><div class="descr"> | ||
|  | Undefined behavior: a scalar object shall have its stored value modified at  | ||
|  | most once by the evaluation of an expression.<br> | ||
|  | Note: most cases are currently handled by the Clang core (search for 'multiple | ||
|  | unsequenced modifications' warning in Clang tests). | ||
|  | <p>Source: C++03 5p4.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | int test () { | ||
|  |   int i = 0; | ||
|  |   i = ++i + 1; // warn | ||
|  |   return i; | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | undefbehavior.StaticInitReentered</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | Undefined behavior: static declaration is re-entered while the object is being  | ||
|  | initialized. | ||
|  | <p>Source: C++11 6.7p4.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | int test(int i) { | ||
|  |   static int s = test(2 * i); // warn | ||
|  |   return i + 1; | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | undefbehavior.ConstModified</span><span class="lang"> | ||
|  | (C, C++)</span><div class="descr"> | ||
|  | Undefined behavior: const object is being modified. | ||
|  | <p>Source: C++03 7.1.5.1p4, C++11 7.1.6.1p4.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | void test() { | ||
|  |   const int *cp = new const int (0); | ||
|  |   int *p = const_cast<int *>(cp); | ||
|  |   *p = 1; // warn | ||
|  |   delete p; | ||
|  | } | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | class C { | ||
|  | public : | ||
|  |   int i; | ||
|  |   C(); | ||
|  | }; | ||
|  | 
 | ||
|  | void test() { | ||
|  |   const C cb; | ||
|  | 
 | ||
|  |   C* cp = const_cast<C *>(&cb); | ||
|  |   cp->i = 1; // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | undefbehavior.DeadDestructed</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | Undefined behavior: the destructor is invoked for an object whose lifetime  | ||
|  | has ended. | ||
|  | <p>Source: C++11 12.4p14.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | class A { | ||
|  | public: | ||
|  |   void f(); | ||
|  |   A(); | ||
|  |   ~A(); | ||
|  | }; | ||
|  | 
 | ||
|  | void test() { | ||
|  |   A a; | ||
|  |   a.~A(); | ||
|  | } // warn | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | undefbehavior.MethodCallBeforeBaseInit</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | Undefined behavior: calls member function but base not yet initialized. | ||
|  | <p>Source: C++03 12.6.2p8; C++11 12.6.2p13.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | class A { | ||
|  | public : | ||
|  |   A(int); | ||
|  | }; | ||
|  | 
 | ||
|  | class B : public A { | ||
|  | public : | ||
|  |   int f(); | ||
|  |   B() : A(f()) {} // warn | ||
|  | }; | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | undefbehavior.MemberOrBaseRefBeforeCtor</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | C++ Undefined behavior: non-static member or base class of non-POD class type  | ||
|  | is referred before constructor begins execution.<br> | ||
|  | C++11 Undefined behavior: non-static member or base class of a class with a  | ||
|  | non-trivial constructor is referred before constructor begins execution. | ||
|  | <p>Source: C++03 12.7p1; C++11 12.7p1.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | struct non_POD { | ||
|  |   int i; | ||
|  |   non_POD(); | ||
|  | }; | ||
|  | 
 | ||
|  | extern non_POD non_pod; | ||
|  | 
 | ||
|  | int *p = &non_pod.i; // warn | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | struct POD {  | ||
|  |   int i;  | ||
|  | }; | ||
|  | 
 | ||
|  | struct non_POD : public POD { | ||
|  |   POD pod; | ||
|  | }; | ||
|  | 
 | ||
|  | extern non_POD non_pod; | ||
|  | 
 | ||
|  | int *p = &non_pod.pod.i; // warn | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | struct POD { | ||
|  |   int i;  | ||
|  | }; | ||
|  | 
 | ||
|  | struct non_POD : public POD {}; | ||
|  | 
 | ||
|  | extern non_POD non_pod; | ||
|  | 
 | ||
|  | POD *p = &non_pod; // warn | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | struct non_POD { | ||
|  |   int i; | ||
|  |   non_POD(); | ||
|  | }; | ||
|  | 
 | ||
|  | struct S { | ||
|  |   int *k; | ||
|  |   non_POD non_pod; | ||
|  |   S() : k(&non_pod.i) {} // warn | ||
|  | }; | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | undefbehavior.MemberRefAfterDtor</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | C++03: Undefined behavior: non-static member of non-POD class type is referred  | ||
|  | after destructor ends execution.<br> | ||
|  | C++11: Undefined behavior: non-static member of a class with a non-trivial  | ||
|  | destructor is referred after destructor ends execution. | ||
|  | <p>Source: C++03 12.7p1; C++11 12.7p1.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | class C { | ||
|  | public: | ||
|  |   C(); | ||
|  |   void f(); | ||
|  | }; | ||
|  | 
 | ||
|  | void test() { | ||
|  |   C *c = new C(); | ||
|  |   c->~C(); | ||
|  |   c->f(); // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | undefbehavior.CtorForeignCall</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | Undefined behavior: call to virtual function of an object under construction  | ||
|  | whose type is neither the constructors own class or one of its bases. | ||
|  | <p>Source: C++11 12.7p4.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | class A { | ||
|  | public: | ||
|  |   virtual void f() {}; | ||
|  | }; | ||
|  | 
 | ||
|  | class B { | ||
|  | public: | ||
|  |   B(A* a) { a->f(); } // warn | ||
|  | }; | ||
|  | 
 | ||
|  | class C : public A, B { | ||
|  | public: | ||
|  |   C() : B((A*)this) {} | ||
|  | }; | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | undefbehavior.CtorForeignTypeid</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | Undefined behavior: the operand of <code>typeid</code> is an object under | ||
|  | construction whose type is neither the constructors own class or one of its  | ||
|  | bases. | ||
|  | <p>Source: C++11 12.7p5.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | #include <typeinfo> | ||
|  | 
 | ||
|  | class A {}; | ||
|  | 
 | ||
|  | class B { | ||
|  | public: | ||
|  |   B(A* a) { | ||
|  |     (void)typeid(*a); // warn | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | class C : public A, B { | ||
|  | public: | ||
|  |   C() : B((A*)this) {} | ||
|  | }; | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | undefbehavior.CtorForeignCast</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | Undefined behavior: the operand of <code>dynamic_cast</code> is an object under | ||
|  | construction whose type is neither the constructors own class or one of its | ||
|  | bases. | ||
|  | <p>Source: C++11 12.7p6.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | #include <typeinfo> | ||
|  | 
 | ||
|  | class A { | ||
|  | public: | ||
|  |   virtual void f() {}; | ||
|  | }; | ||
|  | 
 | ||
|  | class B { | ||
|  | public: | ||
|  |   B(A* a) {  | ||
|  |     (void)dynamic_cast<B*>(a); //warn | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | class C : public A, B { | ||
|  | public: | ||
|  |   C() : B((A*)this) {} | ||
|  | }; | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | undefbehavior.MemberOrBaseRefInCatch</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | Undefined behavior: referring to any non-static member or base class of an  | ||
|  | object in the handler for a function-try-block of a constructor or destructor  | ||
|  | for that object results in undefined behavior. | ||
|  | <p>Source: C++11 15.3p10.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | void f() { throw 1; } | ||
|  | 
 | ||
|  | class C { | ||
|  |   int i; | ||
|  | public : | ||
|  |   C() | ||
|  |   try { | ||
|  |     f(); | ||
|  |   } | ||
|  |   catch (...) { | ||
|  |     i=2; // warn | ||
|  |   } | ||
|  | }; | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | void f() { throw 1; } | ||
|  | 
 | ||
|  | class Base { | ||
|  | public: | ||
|  |   int i; | ||
|  | }; | ||
|  | 
 | ||
|  | class C: public Base { | ||
|  | public : | ||
|  |   ~C() try { | ||
|  |     f(); | ||
|  |   } | ||
|  |   catch (...) { | ||
|  |     i=2; // warn | ||
|  |   } | ||
|  | }; | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | undefbehavior.ReturnAtCatchEnd</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | Undefined behavior: a function returns when control reaches the end of a  | ||
|  | handler. This results in undefined behavior in a value-returning function. | ||
|  | <p>Source: C++11 15.3p10.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | void f() { throw 1; } | ||
|  | 
 | ||
|  | int test() try { | ||
|  |   f(); | ||
|  |   return 1; | ||
|  | } | ||
|  | catch(int) { | ||
|  | } // warn | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | undefbehavior.AutoptrsOwnSameObj</span><span class="lang"> | ||
|  | (C++03)</span><div class="descr"> | ||
|  | Undefined behavior: if more than one <code>auto_ptr</code> owns the same object | ||
|  | at the same time the behavior of the program is undefined. | ||
|  | <p>Source: C++03 20.4.5p3; C++11 <code>auto_ptr</code> is deprecated | ||
|  | (D.10).</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | #include <memory> | ||
|  | 
 | ||
|  | void test() { | ||
|  |   int *data = new int; | ||
|  |   std::auto_ptr<int> p(data); | ||
|  |   std::auto_ptr<int> q(data); // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | undefbehavior.BasicStringOutOfBound</span><span class="lang"> | ||
|  | (C++03)</span><div class="descr"> | ||
|  | Undefined behavior: out-of-bound <code>basic_string</code> access/modification. | ||
|  | <br>Note: possibly an enhancement to <span class="name"> | ||
|  | alpha.security.ArrayBoundV2</span>. | ||
|  | <p>Source: C++03 21.3.4p1; C++11 behavior is defined | ||
|  | (21.4.5p2).</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | #include <string> | ||
|  | 
 | ||
|  | void test() { | ||
|  |   std::basic_string<char> s; | ||
|  |   char c = s[10]; // warn | ||
|  | } | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | #include <string> | ||
|  | 
 | ||
|  | void test() { | ||
|  |   std::basic_string<char> s; | ||
|  |   s[10] = 0; // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | undefbehavior.EosDereference</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | Undefined behavior: the result of <code>operator*()</code> on an end of a | ||
|  | stream is undefined. | ||
|  | <p>Source: C++03 24.5.3p2; C++11 24.6.3p2.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | #include <vector> | ||
|  | 
 | ||
|  | int test() { | ||
|  |   std::vector<int> v; | ||
|  |   return *v.end(); // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | undefbehavior.QsortNonPODNonTrivial</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | C++03: Undefined behavior: the objects in the array passed to qsort are of  | ||
|  | non-POD type.<br> | ||
|  | C++11: Undefined behavior: the objects in the array passed to qsort are of  | ||
|  | non-trivial type. | ||
|  | <p>Source: C++03 25.4p4; C++11 25.5p4.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | // C++03 | ||
|  | #include <cstdlib> | ||
|  | 
 | ||
|  | 
 | ||
|  | struct non_POD { | ||
|  |   non_POD(); | ||
|  | }; | ||
|  | 
 | ||
|  | non_POD values[] = { non_POD(), non_POD() }; | ||
|  | 
 | ||
|  | int compare(const void *a, const void *b); | ||
|  | 
 | ||
|  | void test() { | ||
|  |   qsort(values, 2, sizeof(non_POD), compare); // warn | ||
|  | } | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | // C++11 | ||
|  | #include <cstdlib> | ||
|  | 
 | ||
|  | struct S {}; | ||
|  | 
 | ||
|  | struct trivial_non_POD : public S { | ||
|  |   int i; | ||
|  | }; | ||
|  | 
 | ||
|  | struct non_trivial { | ||
|  |   int i; | ||
|  |   non_trivial(); | ||
|  | }; | ||
|  | 
 | ||
|  | trivial_non_POD tnp[2]; | ||
|  | non_trivial nt[2]; | ||
|  | 
 | ||
|  | int compare1(const void *a, const void *b); | ||
|  | 
 | ||
|  | int compare2(const void *a, const void *b); | ||
|  | 
 | ||
|  | void test() { | ||
|  |   qsort(tnp, 2, sizeof(trivial_non_POD), compare1); // ok | ||
|  |   qsort(nt, 2, sizeof(non_trivial), compare2); // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | undefbehavior.ThrowWhileCopy</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | Undefined behavior: copy constructor/assignment operator can throw an exception. | ||
|  | The effects are undefined if an exception is thrown.</div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | class C { | ||
|  | public: | ||
|  |   int i, j; | ||
|  |   C (const C &c) { | ||
|  |     i = c.i; | ||
|  |     throw 1; // warn | ||
|  |     j = c.j; | ||
|  |   }; | ||
|  | }; | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | class C { | ||
|  | public: | ||
|  |   int i, j; | ||
|  |   C &operator=(const C &c) { | ||
|  |     i = c.i; | ||
|  |     throw 1; // warn | ||
|  |     j = c.j; | ||
|  |   }; | ||
|  | }; | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | undefbehavior.ValarrayArgBound</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | Undefined behavior: the value of the <code><i>n</i></code> argument passed | ||
|  | to <code>valarray</code> constructor is greater than the number of values | ||
|  | pointed to by the first argument (source). | ||
|  | <p>Source: C++03 26.3.2.1p4; C++11 26.6.2.2p4.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | #include <valarray> | ||
|  | 
 | ||
|  | struct S { | ||
|  |   int i; | ||
|  |   S(int ii) : i(ii) {}; | ||
|  | }; | ||
|  | 
 | ||
|  | void test(void) { | ||
|  |   S s[] = { S(1), S(2) }; | ||
|  |   std::valarray<S> v(s,3); // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | undefbehavior.ValarrayLengthDiffer</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | Undefined behavior: <code>valarray</code> operands are of different length. | ||
|  | <p>Source: C++03 26.3.2.2p1, 26.3.2.6p3, 26.3.3.1p3, 26.3.3.2p3; | ||
|  | C++11 defined (26.6.2.3p1), 26.6.2.7p3, 26.6.3.1p3, | ||
|  | 26.6.3.2p3.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | // C++03 | ||
|  | #include <valarray> | ||
|  | 
 | ||
|  | void test(void) { | ||
|  |   std::valarray<int> a(0, 1), b(0, 2); | ||
|  |   a = b; // warn | ||
|  |   b.resize(1); | ||
|  |   a = b; // ok | ||
|  | } | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | // C++03, C++11 | ||
|  | #include <valarray> | ||
|  | 
 | ||
|  | void test(void) { | ||
|  |   std::valarray<int> a(0, 1), b(0, 2); | ||
|  |   a *= b; // warn | ||
|  | } | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | // C++03, C++11 | ||
|  | #include <valarray> | ||
|  | 
 | ||
|  | void test(void) { | ||
|  |   std::valarray<int> a(0, 1), b(0, 2); | ||
|  |   a = a + b; // warn | ||
|  | } | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | // C++03, C++11 | ||
|  | #include <valarray> | ||
|  | 
 | ||
|  | void test(void) { | ||
|  |   std::valarray<int> a(0, 1), b(0, 2); | ||
|  |   std::valarray<bool> c(false, 1); | ||
|  |   c = a == b; // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | undefbehavior.ValarrayZeroLength</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | Undefined behavior: calling <code>sum()</code>/<code>min()</code>/<code> | ||
|  | max()</code> methods of a zero length <code>valarray<code> the behavior is | ||
|  | undefined. | ||
|  | <p>Source: C++03 26.3.2.7p2, p3, p4; C++11 26.6.2.8p5, p6, | ||
|  | p7.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | #include <valarray> | ||
|  | 
 | ||
|  | void test(void) { | ||
|  |   std::valarray<int> v(0, 0); | ||
|  |   v.sum(); // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | undefbehavior.ValarrayBadIndirection</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | Undefined behavior: element is specified more than once in an indirection. | ||
|  | <p>Source: C++03 26.3.9.2p2, 26.3.9.3p2; C++11 26.6.9.2p2, | ||
|  | 26.6.9.3p2.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | #include <valarray> | ||
|  | 
 | ||
|  | void test() { | ||
|  |   // '1' is specified more then once | ||
|  |   size_t addr[] = {0, 1, 1}; | ||
|  |   std::valarray<size_t>indirect(addr, 3); | ||
|  |   std::valarray<int> a(0, 5), b(1, 3); | ||
|  |   a[indirect] = b; //warn | ||
|  | } | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | #include <valarray> | ||
|  | 
 | ||
|  | void test() { | ||
|  |   // '1' is specified more then once | ||
|  |   size_t addr[] = {0, 1, 1}; | ||
|  |   std::valarray<size_t>indirect(addr, 3); | ||
|  |   std::valarray<int> a(0, 5), b(1, 3); | ||
|  |   a[indirect] *= b; //warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | undefbehavior.IosBaseDestroyedBeforeInit</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | Undefined behavior: <code>ios_base</code> object is destroyed before | ||
|  | initialization have taken place. <code>basic_ios::init</code> should be call to | ||
|  | initialize <code>ios_base</code> members. | ||
|  | <p>Source: C++03 27.4.2.7p1, 27.4.4.1p2; C++11 27.5.3.7p1, | ||
|  | 27.5.5.2p2.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | #include <ios> | ||
|  | 
 | ||
|  | using namespace std; | ||
|  | template <class T, class Traits = std::char_traits<T> > | ||
|  | class my_stream1 : public std::basic_ios<T, Traits> { | ||
|  | }; | ||
|  | 
 | ||
|  | template <class T, class Traits = std::char_traits<T> > | ||
|  | class my_stream2 : public std::basic_ios<T, Traits> { | ||
|  |   class my_streambuf | ||
|  |   : public std::basic_streambuf<T, Traits> { | ||
|  |   }; | ||
|  | public: | ||
|  |   my_stream2() { | ||
|  |     this->init(new my_streambuf); | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | void test() { | ||
|  |   my_stream1<char> *p1 = new my_stream1<char>; | ||
|  |   my_stream2<char> *p2 = new my_stream2<char>; | ||
|  |   delete p1; // warn | ||
|  |   delete p2; // ok | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | undefbehavior.IosBaseUsedBeforeInit</span><span class="lang"> | ||
|  | (C++11)</span><div class="descr"> | ||
|  | Undefined behavior: <code>ios_base</code> object is used before initialization | ||
|  | have taken place. <code>basic_ios::init</code> should be call to | ||
|  | initialize <code>ios_base</code> members. | ||
|  | <p>Source: C++11 27.5.3.7p1, 27.5.5.2p2.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | #include <ios> | ||
|  | 
 | ||
|  | using namespace std; | ||
|  | template <class T, class Traits = std::char_traits<T> > | ||
|  | class my_stream1 : public std::basic_ios<T, Traits> { | ||
|  | }; | ||
|  | 
 | ||
|  | template <class T, class Traits = std::char_traits<T> > | ||
|  | class my_stream2 : public std::basic_ios<T, Traits> { | ||
|  |   class my_streambuf | ||
|  |   : public std::basic_streambuf<T, Traits> { | ||
|  |   }; | ||
|  | public: | ||
|  |   my_stream2() { | ||
|  |     this->init(new my_streambuf); | ||
|  |   } | ||
|  | }; | ||
|  | 
 | ||
|  | void test() { | ||
|  |   my_stream1<char> *p1 = new my_stream1<char>; | ||
|  |   my_stream2<char> *p2 = new my_stream2<char>; | ||
|  |   p1->narrow('a', 'b'); // warn | ||
|  |   p2->narrow('a', 'b'); // ok | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | undefbehavior.MinusOnePosType</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | Undefined behavior: passing -1 to any <code>streambuf</code>/<code> | ||
|  | istream</code>/<code>ostream</code> member that accepts a value of | ||
|  | type <code>traits::pos_type</code> result in undefined behavior. | ||
|  | <p>Source: C++03 27.4.3.2p3; C++11 27.5.4.2p3.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | #include <fstream> | ||
|  | 
 | ||
|  | class my_streambuf : public std::streambuf { | ||
|  |   void f() { | ||
|  |     seekpos(-1); // warn | ||
|  |   } | ||
|  | }; | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | #include <fstream> | ||
|  | 
 | ||
|  | void test() { | ||
|  |   std::filebuf fb; | ||
|  |   std::istream in(&fb); | ||
|  |   std::filebuf::off_type pos(-1); | ||
|  |   in.seekg(pos); // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | </table> | ||
|  | 
 | ||
|  | <!-- ============================ different ================================ --> | ||
|  | <h3>different</h3> | ||
|  | <table class="checkers"> | ||
|  | <col class="namedescr"><col class="example"><col class="progress"> | ||
|  | <thead><tr><td>Name, Description</td><td>Example</td><td>Progress</td></tr> | ||
|  | </thead> | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | different.SuccessiveAssign</span><span class="lang"> | ||
|  | (C)</span><div class="descr"> | ||
|  | Successive assign to a variable.</div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | int test() { | ||
|  |   int i; | ||
|  |   i=1; | ||
|  |   i=2; // warn | ||
|  |   return i; | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | different.NullDerefStmtOrder</span><span class="lang"> | ||
|  | (C)</span><div class="descr"> | ||
|  | Dereferencing of the null pointer might take place. Checking the pointer for  | ||
|  | null should be performed first. | ||
|  | <br>Note: possibly an enhancement to <span class="name"> | ||
|  | core.NullDereference</span>.</div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | struct S { | ||
|  |   int x; | ||
|  | }; | ||
|  | 
 | ||
|  | struct S* f(); | ||
|  | 
 | ||
|  | void test() { | ||
|  |   struct S *p1 = f(); | ||
|  |   int x1 = p1->x; // warn | ||
|  |   if (p1) {}; | ||
|  | 
 | ||
|  |   struct S *p2 = f(); | ||
|  |   int x2 = p2->x; // ok | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | different.NullDerefCondOrder</span><span class="lang"> | ||
|  | (C)</span><div class="descr"> | ||
|  | Dereferencing of the null pointer might take place. Checking the pointer for  | ||
|  | null should be performed first. | ||
|  | <br>Note: possibly an enhancement to <span class="name"> | ||
|  | core.NullDereference</span>.</div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | struct S {int i;}; | ||
|  | 
 | ||
|  | struct S* f(); | ||
|  | 
 | ||
|  | void test() { | ||
|  |   struct S *p = f(); | ||
|  |   if (p->i && p) {}; // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | different.MultipleAccessors</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | Identical accessor bodies. Possibly a misprint.</div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | class A { | ||
|  |   int i; | ||
|  |   int j; | ||
|  | public: | ||
|  |   int getI() { return i; } | ||
|  |   int getJ() { return i; } // warn | ||
|  | }; | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | class A { | ||
|  |   int i; | ||
|  |   int j; | ||
|  | public: | ||
|  |   void setI(int& ii) { i = ii; } | ||
|  |   void setJ(int& jj) { i = jj; } // warn | ||
|  | }; | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | different.AccessorsForPublic</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | Accessors exist for a public class field. Should this field really be | ||
|  | public?</div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | class A { | ||
|  | public: | ||
|  |   int i; // warn | ||
|  |   int getI() { return i; } | ||
|  |   void setI(int& ii) { i = ii; } | ||
|  | }; | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | different.LibFuncResultUnised</span><span class="lang"> | ||
|  | (C, C++)</span><div class="descr"> | ||
|  | Calling a function ignoring its return value is of no use (create the list of | ||
|  | known system/library/API functions falling into this category).</div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | #include <vector> | ||
|  | 
 | ||
|  | void test() { | ||
|  |   std::vector<int> v; | ||
|  |   v.empty(); // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | different.WrongVarForStmt</span><span class="lang"> | ||
|  | (C, C++)</span><div class="descr"> | ||
|  | Wrong variable is possibly used in the loop/cond-expression of | ||
|  | the <code>for</code> statement. Did you mean | ||
|  | 'proper_variable_name'?</div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | void test() { | ||
|  |   int i = 0; | ||
|  |   int j = 0; | ||
|  |   for (i = 0; i < 3; j += 1); // warn | ||
|  | } | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | void test() { | ||
|  |   int i = 0; | ||
|  |   int j = 0; | ||
|  |   for (int j = 0; i < 3; ++j); // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | different.FloatingCompare</span><span class="lang"> | ||
|  | (C)</span><div class="descr"> | ||
|  | Comparing floating point numbers may be not precise.</div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | #include <math.h> | ||
|  | 
 | ||
|  | double test() { | ||
|  |   double b = sin(M_PI / 6.0); | ||
|  |   if (b == 0.5) // warn | ||
|  |     b = 0; | ||
|  |   return b; | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | different.BitwiseOpBoolArg</span><span class="lang"> | ||
|  | (C, C++)</span><div class="descr"> | ||
|  | Boolean value met at the left/right part of the bitwise <code>&</code> | ||
|  | or <code>|</code> operator. | ||
|  | Did you mean <code>&&</code> (<code>||</code>) ?</div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | int f(); | ||
|  | 
 | ||
|  | void test() { | ||
|  |   bool b = true; | ||
|  |   if (b & f()) {} // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | different.LabelInsideSwitch</span><span class="lang"> | ||
|  | (C)</span><div class="descr"> | ||
|  | Possibly a misprint: label found inside a <code>switch()</code> | ||
|  | statement.</div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | void test(int c) { | ||
|  |   switch(c){ | ||
|  |   case 1: | ||
|  |     c += 1; break; | ||
|  |   defalt: // warn (did you mean 'default'?) | ||
|  |     c -= 1; break; | ||
|  |   } | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | different.IdenticalCondIfIf</span><span class="lang"> | ||
|  | (C)</span><div class="descr"> | ||
|  | The conditions of two subsequent <code>if</code> statements are | ||
|  | identical.</div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | int test(int c) { | ||
|  |   if (c > 5) | ||
|  |     c += 1; | ||
|  |   if (c > 5) // warn | ||
|  |     c -= 1; | ||
|  |   return c; | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | different.LogicalOpUselessArg</span><span class="lang"> | ||
|  | (C)</span><div class="descr"> | ||
|  | The second operand of a <code>&&</code> operator has no impact on | ||
|  | expression result.</div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | void test(unsigned a) { | ||
|  |   if (a<7 && a<10) {}; // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | different.SameResLogicalExpr</span><span class="lang"> | ||
|  | (C)</span><div class="descr"> | ||
|  | An expression is always evaluated to true/false.</div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | void test() { | ||
|  |   int i = 0; | ||
|  |   if (i != 0) {}; // warn | ||
|  | } | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | void test(int i) { | ||
|  |   if (i == 0 && i == 1) {}; // warn | ||
|  | } | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | void test(int i) { | ||
|  |   if (i < 0 || i >= 0) {}; // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | different.OpPrecedenceAssignCmp</span><span class="lang"> | ||
|  | (C, C++)</span><div class="descr"> | ||
|  | Comparison operation has higher precedence then assignment. Boolean value is | ||
|  | assigned to a variable of other type. Parenthesis may bee required around an | ||
|  | assignment.</div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | int f(); | ||
|  | 
 | ||
|  | void test(int x, int y) { | ||
|  |   bool b; | ||
|  |   if((b = x != y)) {} // ok | ||
|  |   if((x = f() != y)) {} // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | different.OpPrecedenceIifShift</span><span class="lang"> | ||
|  | (C, C++)</span><div class="descr"> | ||
|  | <code>?:</code> has lower precedence then <code><<</code>. | ||
|  | <p>Source: Stephen C. Dewhurst "C++ Gotchas: Avoiding Common Problems in Coding | ||
|  | and Design", advise 15.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | #include <iostream> | ||
|  | 
 | ||
|  | void test(int a) { | ||
|  |   std::cout << a ? "a" : "b"; // warn | ||
|  | } | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | void test(int a) { | ||
|  |   a << a > 7 ? 1 : 2; // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | different.ObjectUnused</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | The object was created but is not being used.</div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | struct S { | ||
|  |   int x, y; | ||
|  |   S(int xx, int yy) : x(xx), y(yy) {} | ||
|  |   S(int xx) { | ||
|  |     S(xx, 0); // warn | ||
|  |   } | ||
|  | }; | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | #include <exception> | ||
|  | 
 | ||
|  | void test() { | ||
|  |   std::exception(); | ||
|  |     // warn (did you mean 'throw std::exception()'?) | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | different.StaticArrayPtrCompare</span><span class="lang"> | ||
|  | (C)</span><div class="descr"> | ||
|  | Pointer to static array is being compared to NULL. May the subscripting is | ||
|  | missing.</div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | void test() { | ||
|  |   int a[1][1]; | ||
|  |   if (a[0] == 0) {}; // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | different.ConversionToBool</span><span class="lang"> | ||
|  | (C, C++)</span><div class="descr"> | ||
|  | Odd implicit conversion to boolean. | ||
|  | <br>Note: possibly merge with <span class="name"> | ||
|  | alpha.core.BoolAssignment</span>.</div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | bool test() { | ||
|  |   return 1.; // warn | ||
|  | } | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | bool test() { | ||
|  |   return ""; // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | different.ArrayBound</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | Out-of-bound dynamic array access. | ||
|  | <br>Note: possibly an enhancement to <span class="name"> | ||
|  | alpha.security.ArrayBoundV2</span>.</div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | void test() { | ||
|  |   int *p = new int[1]; | ||
|  |   int i = 1; | ||
|  |   if(p[i]) {}; // warn | ||
|  |   delete[] p; | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | different.StrcpyInputSize</span><span class="lang"> | ||
|  | (C)</span><div class="descr"> | ||
|  | Buffer copy without checking the size of input. | ||
|  | <br>Note: possibly an enhancement to <span class="name"> | ||
|  | alpha.unix.cstring.OutOfBounds</span>.</div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | void test(char* string) { | ||
|  |   char buf[24]; | ||
|  |   strcpy(buf, string); // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | different.IntegerOverflow</span><span class="lang"> | ||
|  | (C)</span><div class="descr"> | ||
|  | Integer overflow. | ||
|  | <br>Note: partially handled by Clang core | ||
|  | (search for 'overflow in expression' warning in Clang tests). | ||
|  | <p>Source: <a href="http://cwe.mitre.org/data/definitions/190.html"> | ||
|  | CWE-190</a>.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | #include <limits.h> | ||
|  | 
 | ||
|  | int f(int x); | ||
|  | 
 | ||
|  | void test() { | ||
|  |   f(INT_MAX + 1); // warn | ||
|  | } | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | #include <limits.h> | ||
|  | 
 | ||
|  | int test() { | ||
|  |   int x = INT_MAX / 2 + 1; | ||
|  |   return x * 2; // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | different.SignExtension</span><span class="lang"> | ||
|  | (C)</span><div class="descr"> | ||
|  | Unexpected sign extension might take place. | ||
|  | <p>Source: <a href="http://cwe.mitre.org/data/definitions/194.html"> | ||
|  | CWE-194</a>.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | unsigned long long test(long long sll) { | ||
|  |   unsigned long long ull = sll; // warn | ||
|  |   return ull; | ||
|  | } | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | void f(unsigned int i); | ||
|  | 
 | ||
|  | void test(int si) { | ||
|  |   f(si); // warn | ||
|  | } | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | unsigned int test(int i) { | ||
|  |   return i; | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | different.NumericTruncation</span><span class="lang"> | ||
|  | (C)</span><div class="descr"> | ||
|  | Numeric truncation might take place. | ||
|  | <p>Source: <a href="http://cwe.mitre.org/data/definitions/197.html"> | ||
|  | CWE-197</a>.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | unsigned long test(unsigned long long ull) { | ||
|  |   unsigned long ul = ull; // warn | ||
|  |   return ul; | ||
|  | } | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | void f(int i); | ||
|  | 
 | ||
|  | void test(long long sll) { | ||
|  |   f(sll); // warn | ||
|  | } | ||
|  | </pre></div> | ||
|  | <div class="example"><pre> | ||
|  | int f(); | ||
|  | 
 | ||
|  | short test(long long sll) { | ||
|  |   short ss = f(); | ||
|  |   return ss; | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | different.MissingCopyCtorAssignOp</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | A class has dynamically allocated data members but do not define a copy | ||
|  | constructor/assignment operator. | ||
|  | <p>Source: Scott Meyers "Effective C++", item 11: Prevent exceptions from | ||
|  | leaving destructors.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | class C { | ||
|  |   int *p; // warn | ||
|  | public: | ||
|  |   C() { p = new int; } | ||
|  |   ~C() { delete p; } | ||
|  | }; | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | </table> | ||
|  | 
 | ||
|  | <!-- ============================ WinAPI =================================== --> | ||
|  | <h3>WinAPI</h3> | ||
|  | <table class="checkers"> | ||
|  | <col class="namedescr"><col class="example"><col class="progress"> | ||
|  | <thead><tr><td>Name, Description</td><td>Example</td><td>Progress</td></tr></thead> | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | WinAPI.CreateProcess</span><span class="lang"> | ||
|  | (C)</span><div class="descr"> | ||
|  | <code>CreateProcess()</code>: if the first parameter <code><i> | ||
|  | lpApplicationName</i></code> is NULL then the executable name must be in the | ||
|  | white space-delimited string pointed to by <code><i>lpCommandLine</code></i>. | ||
|  | If the executable or path name has a space in it, there is a risk that a | ||
|  | different executable could be run because of the way the function parses | ||
|  | spaces. | ||
|  | <p>Source: <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms682425%28v=vs.85%29.aspx"> | ||
|  | MSDN: CreateProcess function, Security Remarks</a>.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | #include <windows.h> | ||
|  | 
 | ||
|  | void test() { | ||
|  |   STARTUPINFO si; | ||
|  |   PROCESS_INFORMATION pi; | ||
|  |   CreateProcess(NULL, TEXT("C:\\Program Files\\App -L -S"), | ||
|  |                 NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi); | ||
|  |     // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | WinAPI.LoadLibrary</span><span class="lang"> | ||
|  | (C)</span><div class="descr"> | ||
|  | The <code>SearchPath()</code> function is used to retrieve a path to a DLL for | ||
|  | a subsequent <code>LoadLibrary()</code> call. | ||
|  | <p>Source: <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/ms684175%28v=vs.85%29.aspx"> | ||
|  | MSDN: LoadLibrary function, Security Remarks</a>.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | #include <windows.h> | ||
|  | 
 | ||
|  | HINSTANCE test() { | ||
|  |   char filePath[100]; | ||
|  |   SearchPath(NULL, "file.dll", NULL, 100, filePath, NULL); | ||
|  |   return LoadLibrary(filePath); // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | WinAPI.WideCharToMultiByte</span><span class="lang"> | ||
|  | (C)</span><div class="descr"> | ||
|  | Buffer overrun while calling <code>WideCharToMultiByte()</code>. The size of | ||
|  | the input buffer equals the number of characters in the Unicode string, while | ||
|  | the size of the output buffer equals the number of bytes. | ||
|  | <p>Source: <a href="http://msdn.microsoft.com/en-us/library/windows/desktop/dd374130%28v=vs.85%29.aspx"> | ||
|  | MSDN: WideCharToMultiByte function</a>.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | #include <windows.h> | ||
|  | 
 | ||
|  | void test() { | ||
|  |   wchar_t ws[] = L"abc"; | ||
|  |   char s[3]; | ||
|  |   WideCharToMultiByte(CP_UTF8, 0, ws, -1, s, | ||
|  |                       3, NULL, NULL); // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | </table> | ||
|  | 
 | ||
|  | <!-- =========================== optimization ============================== --> | ||
|  | <h3>optimization</h3> | ||
|  | <table class="checkers"> | ||
|  | <col class="namedescr"><col class="example"><col class="progress"> | ||
|  | <thead><tr><td>Name, Description</td><td>Example</td><td>Progress</td></tr></thead> | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | optimization.PassConstObjByValue</span><span class="lang"> | ||
|  | (C, C++)</span><div class="descr"> | ||
|  | Optimization: It is more effective to pass constant parameter by reference to | ||
|  | avoid unnecessary object copying.</div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | struct A {}; | ||
|  | 
 | ||
|  | void f(const struct A a); // warn | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | optimization.PostfixIncIter</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | Optimization: It is more effective to use prefix increment operator with | ||
|  | iterator. | ||
|  | <p>Source: Scott Meyers "More Effective C++", item 6: | ||
|  | Distinguish between prefix and postfix forms of increment and decrement | ||
|  | operators.</p></div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | #include <vector> | ||
|  | 
 | ||
|  | void test() { | ||
|  |   std::vector<int> v; | ||
|  |   std::vector<int>::const_iterator it; | ||
|  |   for(it = v.begin();  | ||
|  |       it != v.end(); it++) {}; // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | optimization.MultipleCallsStrlen</span><span class="lang"> | ||
|  | (C)</span><div class="descr"> | ||
|  | Optimization: multiple calls to <code>strlen()</code> for a string in an | ||
|  | expression. It is more effective to hold a value returned | ||
|  | from <code>strlen()</code> in a temporary variable.</div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | #include <string.h> | ||
|  | 
 | ||
|  | void test(const char* s) { | ||
|  |   if (strlen(s) > 0 && | ||
|  |       strlen(s) < 7) {}; // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | optimization.StrLengthCalculation</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | Optimization: it is more efficient to use <code>string::length()</code> to | ||
|  | calculate the length of an <code>std::string</code>.</div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | #include <string> | ||
|  | #include <string.h> | ||
|  | 
 | ||
|  | void test() { | ||
|  |   std::string s; | ||
|  |   if (strlen(s.c_str()) != 0) {}; // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | <tr><td><div class="namedescr expandable"><span class="name"> | ||
|  | optimization.EmptyContainerDetect</span><span class="lang"> | ||
|  | (C++)</span><div class="descr"> | ||
|  | Optimization: It is more efficient to use containers <code>empty()</code> | ||
|  | method to identify an empty container.</div></div></td> | ||
|  | <td><div class="exampleContainer expandable"> | ||
|  | <div class="example"><pre> | ||
|  | #include <list> | ||
|  | 
 | ||
|  | void test() { | ||
|  |   std::list<int> l; | ||
|  |   if (l.size() != 0) {}; // warn | ||
|  | } | ||
|  | </pre></div></div></td> | ||
|  | <td class="aligned"></td></tr> | ||
|  | 
 | ||
|  | 
 | ||
|  | </table> | ||
|  | 
 | ||
|  | <br> | ||
|  | </div> <!-- page --> | ||
|  | </div> <!-- content --> | ||
|  | </body> | ||
|  | </html> |