Rule |
Description |
Example |
KPI |
core.DivideZero |
Check for division by zero |
void test(int z) { if (z == 0) int x = 1 / z; // warn } |
Robustness |
core.NonNullParamChecker |
Check for null pointers passed as arguments to a function whose arguments are references or marked with the ‘nonnull’ attribute |
int f(int *p) __attribute__((nonnull)); void test(int *p) { if (!p) f(p); // warn } |
Robustness |
core.NullDereference |
Check for dereferences of null pointers |
void test(int *p) { if (p) return; int x = p[0]; // warn } |
Robustness |
nullability.NullableDereferenced |
Warns when a nullable pointer is dereferenced. |
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; } |
Robustness |
nullability.NullablePassedToNonnull |
Warns when a nullable pointer is passed to a pointer which has a _Nonnull type. |
typedef struct Dummy { int val; } Dummy; Dummy *_Nullable returnsNullable(); void takesNonnull(Dummy *_Nonnull); void test() { Dummy *p = returnsNullable(); takesNonnull(p); // warn } |
Robustness |
nullability.NullableReturnedFromNonnull |
Warns when a nullable pointer is returned from a function that has _Nonnull return type. |
|
Robustness |
nullability.NullPassedToNonnull |
Warns when a null pointer is passed to a pointer which has a _Nonnull type. |
if (name != nil) return; // Warning: nil passed to a callee that requires a non-null 1st parameter NSString *greeting = [@”Hello ” stringByAppendingString:name]; |
Robustness |
nullability.NullReturnedFromNonnull |
Warns when a null pointer is returned from a function that has _Nonnull return type. |
– (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; } |
Robustness |
osx.cocoa.AtSync |
Check for nil pointers used as mutexes for @synchronized |
void test(id x) { if (!x) @synchronized(x) {} // warn: nil value used as mutex } |
Robustness |
osx.cocoa.Dealloc |
Warn about Objective-C classes that lack a correct implementation of -dealloc |
@interface MyObject : NSObject { id _myproperty; } @end @implementation MyObject // warn: lacks ‘dealloc’ |
Robustness |
osx.cocoa.IncompatibleMethodTypes |
Warn about Objective-C method signatures with type incompatibilities |
@interface MyClass1 : NSObject – (int)foo; @end @implementation MyClass1 – (int)foo { return 1; } @end @interface MyClass2 : MyClass1 – (float)foo; @end @implementation MyClass2 – (float)foo { return 1.0; } // warn @end |
Robustness |
osx.cocoa.NilArg |
Check for prohibited nil arguments to ObjC method calls |
NSComparisonResult test(NSString *s) { NSString *aString = nil; return [s caseInsensitiveCompare:aString]; // warn: argument to ‘NSString’ method // ‘caseInsensitiveCompare:’ cannot be nil } |
Robustness |
osx.cocoa.RetainCount |
Check for leaks and improper reference count management |
void test() { NSString *s = [[NSString alloc] init]; // warn } |
Resource Utilization |
osx.cocoa.SelfInit |
Check that ‘self’ is properly initialized inside an initializer method |
@interface MyObj : NSObject { id x; } – (id)init; @end @implementation MyObj – (id)init { [super init]; x = 0; // warn: instance variable used while ‘self’ is not // initialized return 0; } @end |
Robustness |
osx.cocoa.SuperDealloc |
Warn about improper use of ‘[super dealloc]’ in Objective-C |
@interface SuperDeallocThenReleaseIvarClass : NSObject { NSObject *_ivar; } @end @implementation SuperDeallocThenReleaseIvarClass – (void)dealloc { [super dealloc]; [_ivar release]; // warn } @end |
Resource Utilization |
osx.cocoa.VariadicMethodTypes |
Check for passing non-Objective-C types to variadic collection initialization methods that expect only Objective-C types |
void test() { [NSSet setWithObjects:@”Foo”, “Bar”, nil]; // warn: argument should be an ObjC pointer type, not ‘char *’ } |
Robustness |
osx.NumberObjectConversion |
Check for erroneous conversions of objects representing numbers into numbers |
NSNumber *photoCount = [albumDescriptor objectForKey:@”PhotoCount”]; // Warning: Comparing a pointer value of type ‘NSNumber *’ // to a scalar integer value if (photoCount > 0) { [self displayPhotos]; } |
Robustness |
unix.MismatchedDeallocator |
Check for mismatched deallocators. |
// C, C++ void test() { int *p = (int *)malloc(sizeof(int)); delete p; // warn } |
Robustness |