szdominik updated this revision to Diff 106184. szdominik marked 9 inline comments as done. szdominik added a comment.
Update with more idiomatic examples (from @dcoughlin). https://reviews.llvm.org/D33645 Files: www/analyzer/alpha_checks.html www/analyzer/available_checks.html www/analyzer/implicit_checks.html
Index: www/analyzer/implicit_checks.html =================================================================== --- www/analyzer/implicit_checks.html +++ www/analyzer/implicit_checks.html @@ -27,7 +27,7 @@ <li><a href="#osx_implicit_checkers">OS X Implicit Checkers</a></li> </ul> -<!------------------------------- core implicit -------------------------------> +<!-- =========================== core implicit =========================== --> <h3 id="core_implicit_checkers">Core Implicit Checkers</h3> <table class="checkers"> <colgroup><col class="namedescr"><col class="example"></colgroup> @@ -124,7 +124,7 @@ </tbody></table> -<!---------------------------- OS X implicit ----------------------------------> +<!-- =========================== OS X implicit =========================== --> <h3 id="osx_implicit_checkers">OS X Implicit Checkers</h3> <table class="checkers"> <colgroup><col class="namedescr"><col class="example"></colgroup> Index: www/analyzer/available_checks.html =================================================================== --- www/analyzer/available_checks.html +++ www/analyzer/available_checks.html @@ -38,12 +38,14 @@ <li><a href="#core_checkers">Core Checkers</a> model core language features and perform general-purpose checks such as division by zero, null pointer dereference, usage of uninitialized values, etc.</li> <li><a href="#cplusplus_checkers">C++ Checkers</a> perform C++-specific checks</li> <li><a href="#deadcode_checkers">Dead Code Checkers</a> check for unused code</li> +<li><a href="#nullability_checkers">Nullability Checkers</a> </li> +<li><a href="#optin_checkers">Optin Checkers</a> </li> <li><a href="#osx_checkers">OS X Checkers</a> perform Objective-C-specific checks and check the use of Apple's SDKs (OS X and iOS)</li> <li><a href="#security_checkers">Security Checkers</a> check for insecure API usage and perform checks based on the CERT Secure Coding Standards</li> <li><a href="#unix_checkers">Unix Checkers</a> check the use of Unix and POSIX APIs</li> </ul> -<!------------------------------------ core -----------------------------------> +<!-- =========================== core =========================== --> <h3 id="core_checkers">Core Checkers</h3> <table class="checkers"> <colgroup><col class="namedescr"><col class="example"></colgroup> @@ -360,7 +362,7 @@ </tbody></table> -<!------------------------------------ C++ ------------------------------------> +<!-- =========================== C++ =========================== --> <h3 id="cplusplus_checkers">C++ Checkers</h3> <table class="checkers"> <colgroup><col class="namedescr"><col class="example"></colgroup> @@ -421,9 +423,21 @@ } </pre></div></div></td></tr> +<tr><td><div class="namedescr expandable"><span class="name"> +cplusplus.NewDeleteLeaks</span><span class="lang"> +(C++)</span><div class="descr"> +Check for memory leaks. Traces memory managed by <code>new</code>/<code> +delete</code>.</div></div></td> +<td><div class="exampleContainer expandable"> +<div class="example"><pre> +void test() { + int *p = new int; +} // warn +</pre></div></div></td></tr> + </tbody></table> -<!--------------------------------- dead code ---------------------------------> +<!-- =========================== dead code =========================== --> <h3 id="deadcode_checkers">Dead Code Checkers</h3> <table class="checkers"> <colgroup><col class="namedescr"><col class="example"></colgroup> @@ -444,7 +458,161 @@ </tbody></table> -<!---------------------------------- OS X ------------------------------------> +<!-- =========================== nullability =========================== --> +<h3 id="nullability_checkers">Nullability Checkers</h3> +<table class="checkers"> +<colgroup><col class="namedescr"><col class="example"></colgroup> +<thead><tr><td>Name, Description</td><td>Example</td></tr></thead> + +<tbody> +<tr><td><div class="namedescr expandable"><span class="name"> +nullability.NullPassedToNonnull</span><span class="lang"> +(ObjC)</span><div class="descr"> +Warns when a null pointer is passed to a pointer which has a +_Nonnull type.</div></div></td> +<td><div class="exampleContainer expandable"> +<div class="example"><pre> +if (name != nil) + return; +// Warning: nil passed to a callee that requires a non-null 1st parameter +NSString *greeting = [@"Hello " stringByAppendingString:name]; +</pre></div></div></td></tr> + + +<tr><td><div class="namedescr expandable"><span class="name"> +nullability.NullReturnedFromNonnull</span><span class="lang"> +(ObjC)</span><div class="descr"> +Warns when a null pointer is returned from a function that has +_Nonnull return type.</div></div></td> +<td><div class="exampleContainer expandable"> +<div class="example"><pre> +- (nonnull id)firstChild { + id result = nil; + if ([_children count] > 0) + result = _children[0]; + + // Warning: nil returned from a method that is expected + // to return a non-null value + return result; +} +</pre></div></div></td></tr> + + +<tr><td><div class="namedescr expandable"><span class="name"> +nullability.NullableDereferenced</span><span class="lang"> +(ObjC)</span><div class="descr"> +Warns when a nullable pointer is dereferenced.</div></div></td> +<td><div class="exampleContainer expandable"> +<div class="example"><pre> +struct LinkedList { + int data; + struct LinkedList *next; +}; + +struct LinkedList * _Nullable getNext(struct LinkedList *l); + +void updateNextData(struct LinkedList *list, int newData) { + struct LinkedList *next = getNext(list); + // Warning: Nullable pointer is dereferenced + next->data = 7; +} +</pre></div></div></td></tr> + + +<tr><td><div class="namedescr expandable"><span class="name"> +nullability.NullablePassedToNonnull</span><span class="lang"> +(ObjC)</span><div class="descr"> +Warns when a nullable pointer is passed to a pointer which has a _Nonnull type.</div></div></td> +<td><div class="exampleContainer expandable"> +<div class="example"><pre> +typedef struct Dummy { int val; } Dummy; +Dummy *_Nullable returnsNullable(); +void takesNonnull(Dummy *_Nonnull); + +void test() { + Dummy *p = returnsNullable(); + takesNonnull(p); // warn +} +</pre></div></div></td></tr> + +</tbody></table> + +<!-- =========================== optin =========================== --> +<h3 id="optin_checkers">Optin Checkers</h3> +<table class="checkers"> +<colgroup><col class="namedescr"><col class="example"></colgroup> +<thead><tr><td>Name, Description</td><td>Example</td></tr></thead> + +<tbody> +<tr><td><div class="namedescr expandable"><span class="name"> +optin.mpi.MPI-Checker</span><span class="lang"> +(C)</span><div class="descr"> +Checks MPI code</div></div></td> +<td><div class="exampleContainer expandable"> +<div class="example"><pre> +void test() { + double buf = 0; + MPI_Request sendReq1; + MPI_Ireduce(MPI_IN_PLACE, &buf, 1, MPI_DOUBLE, MPI_SUM, + 0, MPI_COMM_WORLD, &sendReq1); +} // warn: request 'sendReq1' has no matching wait. +</pre></div><div class="separator"></div> +<div class="example"><pre> +void test() { + double buf = 0; + MPI_Request sendReq; + MPI_Isend(&buf, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &sendReq); + MPI_Irecv(&buf, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &sendReq); // warn + MPI_Isend(&buf, 1, MPI_DOUBLE, 0, 0, MPI_COMM_WORLD, &sendReq); // warn + MPI_Wait(&sendReq, MPI_STATUS_IGNORE); +} +</pre></div><div class="separator"></div> +<div class="example"><pre> +void missingNonBlocking() { + int rank = 0; + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Request sendReq1[10][10][10]; + MPI_Wait(&sendReq1[1][7][9], MPI_STATUS_IGNORE); // warn +} +</pre></div></div></td></tr> + + +<tr><td><div class="namedescr expandable"><span class="name"> +optin.osx.cocoa.localizability.EmptyLocalizationContextChecker</span><span class="lang"> +(ObjC)</span><div class="descr"> +Check that NSLocalizedString macros include a comment for context.</div></div></td> +<td><div class="exampleContainer expandable"> +<div class="example"><pre> +- (void)test { + NSString *string = NSLocalizedString(@"LocalizedString", nil); // warn + NSString *string2 = NSLocalizedString(@"LocalizedString", @" "); // warn + NSString *string3 = NSLocalizedStringWithDefaultValue( + @"LocalizedString", nil, [[NSBundle alloc] init], nil,@""); // warn +} +</pre></div></div></td></tr> + + +<tr><td><div class="namedescr expandable"><span class="name"> +optin.osx.cocoa.localizability.NonLocalizedStringChecker</span><span class="lang"> +(ObjC)</span><div class="descr"> +Warns about uses of non-localized NSStrings passed to UI methods +expecting localized NSStrings</div></div></td> +<td><div class="exampleContainer expandable"> +<div class="example"><pre> +NSString *alarmText = + NSLocalizedString(@"Enabled", @"Indicates alarm is turned on"); +if (!isEnabled) { + alarmText = @"Disabled"; +} +UILabel *alarmStateLabel = [[UILabel alloc] init]; + +// Warning: User-facing text should use localized string macro +[alarmStateLabel setText:alarmText]; +</pre></div></div></td></tr> + +</tbody></table> + +<!-- =========================== OS X =========================== --> <h3 id="osx_checkers">OS X Checkers</h3> <table class="checkers"> <colgroup><col class="namedescr"><col class="example"></colgroup> @@ -466,6 +634,22 @@ <tr><td><div class="namedescr expandable"><span class="name"> +osx.NumberObjectConversion</span><span class="lang"> +(C, C++, ObjC)</span><div class="descr"> +Check for erroneous conversions of objects representing numbers +into numbers</div></div></td> +<td><div class="exampleContainer expandable"> +<div class="example"><pre> +NSNumber *photoCount = [albumDescriptor objectForKey:@"PhotoCount"]; +// Warning: Comparing a pointer value of type 'NSNumber *' +// to a scalar integer value +if (photoCount > 0) { + [self displayPhotos]; +} +</pre></div></div></td></tr> + + +<tr><td><div class="namedescr expandable"><span class="name"> osx.SecKeychainAPI</span><span class="lang"> (C)</span><div class="descr"> Check for improper uses of the Security framework's Keychain APIs:<div class=functions> @@ -581,6 +765,66 @@ <tr><td><div class="namedescr expandable"><span class="name"> +osx.cocoa.Dealloc</span><span class="lang"> +(ObjC)</span><div class="descr"> +Warn about Objective-C classes that lack a correct implementation +of <code>-dealloc</code>. +</div></div></td> +<td><div class="exampleContainer expandable"> +<div class="example"><pre> +@interface MyObject : NSObject { + id _myproperty; +} +@end + +@implementation MyObject // warn: lacks 'dealloc' +@end +</pre></div><div class="separator"></div> +<div class="example"><pre> +@interface MyObject : NSObject {} +@property(assign) id myproperty; +@end + +@implementation MyObject // warn: does not send 'dealloc' to super +- (void)dealloc { + self.myproperty = 0; +} +@end +</pre></div><div class="separator"></div> +<div class="example"><pre> +@interface MyObject : NSObject { + id _myproperty; +} +@property(retain) id myproperty; +@end + +@implementation MyObject +@synthesize myproperty = _myproperty; + // warn: var was retained but wasn't released +- (void)dealloc { + [super dealloc]; +} +@end +</pre></div><div class="separator"></div> +<div class="example"><pre> +@interface MyObject : NSObject { + id _myproperty; +} +@property(assign) id myproperty; +@end + +@implementation MyObject +@synthesize myproperty = _myproperty; + // warn: var wasn't retained but was released +- (void)dealloc { + [_myproperty release]; + [super dealloc]; +} +@end +</pre></div></div></td></tr> + + +<tr><td><div class="namedescr expandable"><span class="name"> osx.cocoa.IncompatibleMethodTypes</span><span class="lang"> (ObjC)</span><div class="descr"> Check for an incompatible type signature when overriding an Objective-C method.</div></div></td> @@ -688,6 +932,21 @@ <tr><td><div class="namedescr expandable"><span class="name"> +osx.cocoa.ObjCGenerics</span><span class="lang"> +(ObjC)</span><div class="descr"> +Check for type errors when using Objective-C generics</div></div></td> +<td><div class="exampleContainer expandable"> +<div class="example"><pre> +NSMutableArray<NSString *> *names = [NSMutableArray array]; +NSMutableArray *birthDates = names; + +// Warning: Conversion from value of type 'NSDate *' +// to incompatible type 'NSString *' +[birthDates addObject: [NSDate date]]; +</pre></div></div></td></tr> + + +<tr><td><div class="namedescr expandable"><span class="name"> osx.cocoa.RetainCount</span><span class="lang"> (ObjC)</span><div class="descr"> Check for leaks and violations of the Cocoa Memory Management rules.</div></div></td> @@ -742,6 +1001,26 @@ <tr><td><div class="namedescr expandable"><span class="name"> +osx.cocoa.SuperDealloc</span><span class="lang"> +(ObjC)</span><div class="descr"> +Warn about improper use of '[super dealloc]' in Objective-C</div></div></td> +<td><div class="exampleContainer expandable"> +<div class="example"><pre> +@interface SuperDeallocThenReleaseIvarClass : NSObject { + NSObject *_ivar; +} +@end + +@implementation SuperDeallocThenReleaseIvarClass +- (void)dealloc { + [super dealloc]; + [_ivar release]; // warn +} +@end +</pre></div></div></td></tr> + + +<tr><td><div class="namedescr expandable"><span class="name"> osx.cocoa.UnusedIvars</span><span class="lang"> (ObjC)</span><div class="descr"> Warn about private ivars that are never used.</div></div></td> @@ -855,7 +1134,7 @@ </tbody></table> -<!------------------------------- security ------------------------------------> +<!-- =========================== security =========================== --> <h3 id="security_checkers">Security Checkers</h3> <table class="checkers"> <colgroup><col class="namedescr"><col class="example"></colgroup> @@ -995,7 +1274,7 @@ </tbody></table> -<!--------------------------------- unix --------------------------------------> +<!-- =========================== unix =========================== --> <h3 id="unix_checkers">Unix Checkers</h3> <table class="checkers"> <colgroup><col class="namedescr"><col class="example"></colgroup> @@ -1188,6 +1467,38 @@ <tr><td><div class="namedescr expandable"><span class="name"> +unix.Vfork</span><span class="lang"> +(C)</span><div class="descr"> +Check for proper usage of vfork</div></div></td> +<td><div class="exampleContainer expandable"> +<div class="example"><pre> +int test(int x) { + pid_t pid = vfork(); // warn + if (pid != 0) + return 0; + + switch (x) { + case 0: + pid = 1; + execl("", "", 0); + _exit(1); + break; + case 1: + x = 0; // warn: this assignment is prohibited + break; + case 2: + foo(); // warn: this function call is prohibited + break; + default: + return 0; // warn: return is prohibited + } + + while(1); +} +</pre></div></div></td></tr> + + +<tr><td><div class="namedescr expandable"><span class="name"> unix.cstring.BadSizeArg</span><span class="lang"> (C)</span><div class="descr"> Check the size argument passed to <code>strncat</code> for common erroneous Index: www/analyzer/alpha_checks.html =================================================================== --- www/analyzer/alpha_checks.html +++ www/analyzer/alpha_checks.html @@ -24,6 +24,7 @@ Bug reports are welcome but will likely not be investigated for some time. Patches welcome! <ul> +<li><a href="#clone_alpha_checkers">Clone Alpha Checkers</a></li> <li><a href="#core_alpha_checkers">Core Alpha Checkers</a></li> <li><a href="#cplusplus_alpha_checkers">C++ Alpha Checkers</a></li> <li><a href="#valist_alpha_checkers">Variable Argument Alpha Checkers</a></li> @@ -33,6 +34,38 @@ <li><a href="#unix_alpha_checkers">Unix Alpha Checkers</a></li> </ul> +<!-- ============================= clone alpha ============================= --> + +<h3 id="clone_alpha_checkers">Clone Alpha Checkers</h3> +<table class="checkers"> +<colgroup><col class="namedescr"><col class="example"></colgroup> +<thead><tr><td>Name, Description</td><td>Example</td></tr></thead> + +<tbody> +<tr><td><div class="namedescr expandable"><span class="name"> +alpha.clone.CloneChecker</span><span class="lang"> +(C, C++, ObjC)</span><div class="descr"> +Reports similar pieces of code.</div></div></td> +<td><div class="exampleContainer expandable"> +<div class="example"><pre> +void log(); + +int max(int a, int b) { // warn + log(); + if (a > b) + return a; + return b; +} + +int maxClone(int x, int y) { // similar code here + log(); + if (x > y) + return x; + return y; +} +</pre></div></div></td></tr> +</tbody></table> + <!-- ============================= core alpha ============================= --> <h3 id="core_alpha_checkers">Core Alpha Checkers</h3> <table class="checkers"> @@ -53,6 +86,28 @@ <tr><td><div class="namedescr expandable"><span class="name"> +alpha.core.CallAndMessageUnInitRefArg</span><span class="lang"> +(C, C++)</span><div class="descr"> +Check for uninitialized arguments in function calls and Objective-C +message expressions.</div></div></td> +<td><div class="exampleContainer expandable"> +<div class="example"><pre> +void test(void) { + int t; + int &p = t; + int &s = p; + int &q = s; + foo(q); // warn +} +</pre></div><div class="separator"></div> +<div class="example"><pre> +void test(void) { + int x; + foo(&x); // warn +} +</pre></div></div></td></tr> + +<tr><td><div class="namedescr expandable"><span class="name"> alpha.core.CastSize</span><span class="lang"> (C)</span><div class="descr"> Check when casting a malloc'ed type T, whether the size is a multiple of the @@ -91,6 +146,47 @@ <tr><td><div class="namedescr expandable"><span class="name"> +alpha.core.Conversion</span><span class="lang"> +(C, C++, ObjC)</span><div class="descr"> +Loss of sign or precision in implicit conversions</div></div></td> +<td><div class="exampleContainer expandable"> +<div class="example"><pre> +void test(unsigned U, signed S) { + if (S > 10) { + if (U < S) { + } + } + if (S < -10) { + if (U < S) { // warn (loss of sign) + } + } +} +</pre></div><div class="separator"></div> +<div class="example"><pre> +void test() { + long long A = 1LL << 60; + short X = A; // warn (loss of precision) +} +</pre></div></div></td></tr> + + +<tr><td><div class="namedescr expandable"><span class="name"> +alpha.core.DynamicTypeChecker</span><span class="lang"> +(ObjC)</span><div class="descr"> +Check for cases where the dynamic and the static type of an +object are unrelated.</div></div></td> +<td><div class="exampleContainer expandable"> +<div class="example"><pre> +id date = [NSDate date]; + +// Warning: Object has a dynamic type 'NSDate *' which is +// incompatible with static type 'NSNumber *'" +NSNumber *number = date; +[number doubleValue]; +</pre></div></div></td></tr> + + +<tr><td><div class="namedescr expandable"><span class="name"> alpha.core.FixedAddr</span><span class="lang"> (C)</span><div class="descr"> Check for assignment of a fixed address to a pointer.</div></div></td> @@ -178,6 +274,21 @@ } </pre></div></div></td></tr> + +<tr><td><div class="namedescr expandable"><span class="name"> +alpha.core.TestAfterDivZero</span><span class="lang"> +(C, C++, ObjC)</span><div class="descr"> +Check for division by variable that is later compared against 0. +Either the comparison is useless or there is division by zero. +</div></div></td> +<td><div class="exampleContainer expandable"> +<div class="example"><pre> +void test(int x) { + var = 77 / x; + if (x == 0) { } // warn +} +</pre></div></div></td></tr> + </tbody></table> <!-- =========================== cplusplus alpha =========================== --> @@ -188,19 +299,6 @@ <tbody> <tr><td><div class="namedescr expandable"><span class="name"> -alpha.cplusplus.NewDeleteLeaks</span><span class="lang"> -(C++)</span><div class="descr"> -Check for memory leaks. Traces memory managed by <code>new</code>/<code> -delete</code>.</div></div></td> -<td><div class="exampleContainer expandable"> -<div class="example"><pre> -void test() { - int *p = new int; -} // warn -</pre></div></div></td></tr> - - -<tr><td><div class="namedescr expandable"><span class="name"> alpha.cplusplus.VirtualCall</span><span class="lang"> (C++)</span><div class="descr"> Check virtual member function calls during construction or @@ -345,66 +443,6 @@ <tbody> <tr><td><div class="namedescr expandable"><span class="name"> -alpha.osx.cocoa.Dealloc</span><span class="lang"> -(ObjC)</span><div class="descr"> -Warn about Objective-C classes that lack a correct implementation -of <code>-dealloc</code>. -</div></div></td> -<td><div class="exampleContainer expandable"> -<div class="example"><pre> -@interface MyObject : NSObject { - id _myproperty; -} -@end - -@implementation MyObject // warn: lacks 'dealloc' -@end -</pre></div><div class="separator"></div> -<div class="example"><pre> -@interface MyObject : NSObject {} -@property(assign) id myproperty; -@end - -@implementation MyObject // warn: does not send 'dealloc' to super -- (void)dealloc { - self.myproperty = 0; -} -@end -</pre></div><div class="separator"></div> -<div class="example"><pre> -@interface MyObject : NSObject { - id _myproperty; -} -@property(retain) id myproperty; -@end - -@implementation MyObject -@synthesize myproperty = _myproperty; - // warn: var was retained but wasn't released -- (void)dealloc { - [super dealloc]; -} -@end -</pre></div><div class="separator"></div> -<div class="example"><pre> -@interface MyObject : NSObject { - id _myproperty; -} -@property(assign) id myproperty; -@end - -@implementation MyObject -@synthesize myproperty = _myproperty; - // warn: var wasn't retained but was released -- (void)dealloc { - [_myproperty release]; - [super dealloc]; -} -@end -</pre></div></div></td></tr> - - -<tr><td><div class="namedescr expandable"><span class="name"> alpha.osx.cocoa.DirectIvarAssignment</span><span class="lang"> (ObjC)</span><div class="descr"> Check that Objective C properties follow the following rule: the property @@ -501,6 +539,32 @@ @end </pre></div></div></td></tr> + +<tr><td><div class="namedescr expandable"><span class="name"> +alpha.osx.cocoa.localizability.PluralMisuseChecker</span><span class="lang"> +(ObjC)</span><div class="descr"> +Warns against using one vs. many plural pattern in code +when generating localized strings. +</div></div></td> +<td><div class="exampleContainer expandable"> +<div class="example"><pre> +NSString *reminderText = + NSLocalizedString(@"None", @"Indicates no reminders"); +if (reminderCount == 1) { + // Warning: Plural cases are not supported accross all languages. + // Use a .stringsdict file instead + reminderText = + NSLocalizedString(@"1 Reminder", @"Indicates single reminder"); +} else if (reminderCount >= 2) { + // Warning: Plural cases are not supported accross all languages. + // Use a .stringsdict file instead + reminderText = + [NSString stringWithFormat: + NSLocalizedString(@"%@ Reminders", @"Indicates multiple reminders"), + reminderCount]; +} +</pre></div></div></td></tr> + </tbody></table> <!-- =========================== security alpha =========================== --> @@ -675,52 +739,6 @@ } </pre></div></div></td></tr> - -<tr><td><div class="namedescr expandable"><span class="name"> -alpha.unix.MallocWithAnnotations</span><span class="lang"> -(C)</span><div class="descr"> -Check for memory leaks, double free, and use-after-free problems. Assumes that -all user-defined functions which might free a pointer are -annotated.</div></div></td> -<td><div class="exampleContainer expandable"> -<div class="example"><pre> -void __attribute((ownership_returns(malloc))) *my_malloc(size_t); - -void test() { - int *p = my_malloc(1); -} // warn: potential leak -</pre></div><div class="separator"></div> -<div class="example"><pre> -void __attribute((ownership_returns(malloc))) *my_malloc(size_t); -void __attribute((ownership_takes(malloc, 1))) my_free(void *); - -void test() { - int *p = my_malloc(1); - my_free(p); - my_free(p); // warn: attempt to free released -} -</pre></div><div class="separator"></div> -<div class="example"><pre> -void __attribute((ownership_returns(malloc))) *my_malloc(size_t); -void __attribute((ownership_holds(malloc, 1))) my_hold(void *); - -void test() { - int *p = my_malloc(1); - my_hold(p); - free(p); // warn: attempt to free non-owned memory -} -</pre></div><div class="separator"></div> -<div class="example"><pre> -void __attribute((ownership_takes(malloc, 1))) my_free(void *); - -void test() { - int *p = malloc(1); - my_free(p); - *p = 1; // warn: use after free -} -</pre></div></div></td></tr> - - <tr><td><div class="namedescr expandable"><span class="name"> alpha.unix.PthreadLock</span><span class="lang"> (C)</span><div class="descr"> @@ -910,30 +928,6 @@ } </pre></div></div></td></tr> - -<tr><td><div class="namedescr expandable"><span class="name"> -alpha.unix.cstring.BlockInCriticalSection</span><span class="lang"> -(C)</span><div class="descr"> -Check for calls to blocking functions inside a critical section; applies -to:<div class=functions> -lock, unlock<br> -sleep<br> -getc<br> -fgets<br> -read<br> -recv<br> -pthread_mutex_lock, pthread_mutex_trylock, pthread_mutex_unlock<br> -mtx_lock, mtx_timedlock, mtx_trylock, mtx_unlock<br> -</div></div></div></td> -<td><div class="exampleContainer expandable"> -<div class="example"><pre> -void testBlockInCriticalSection() { - std::mutex m; - m.lock(); - sleep(3); // warn - m.unlock(); -} -</pre></div></div></td></tr> </tbody></table> </div> <!-- page -->
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits