| Rule | Description | Example | KPI |
|---|---|---|---|
| core.CallAndMessage | Check for logical errors for function calls and Objective-C message expressions (e.g., uninitialized arguments, null function pointers) | struct S { int x; }; void f(struct S s); void test() { struct S s; f(s); // warn: passed-by-value arg contain uninitialized data } | Accuracy |
| osx.cocoa.MissingSuperCall | Warn about Objective-C methods that lack a necessary call to super | @interface Test : UIViewController @end @implementation test – (void)viewDidLoad {} // warn @end | Accuracy |
| osx.cocoa.NSError | Check usage of NSError** parameters | @interface A : NSObject – (void)foo:(NSError **)error; @end @implementation A – (void)foo:(NSError **)error { // warn: method accepting NSError** should have a non-void // return value } @end | Understandability |
| osx.cocoa.ObjCGenerics | Check for type errors when using Objective-C generics | NSMutableArray *names = [NSMutableArray array]; NSMutableArray *birthDates = names; // Warning: Conversion from value of type ‘NSDate *’ // to incompatible type ‘NSString *’ [birthDates addObject: [NSDate date]]; | Accuracy |
| alpha.clone.CloneChecker | Experimental: Reports similar pieces of code. | 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; } | Maintainability |
| alpha.core.BoolAssignment | Experimental: Warn about assigning non-{0,1} values to Boolean variables | void test() { BOOL b = -1; // warn } | Maintainability |
| alpha.core.Conversion | Experimental: Loss of sign/precision in implicit conversions | void test(unsigned U, signed S) { if (S > 10) { if (U < S) { } } if (S < -10) { if (U < S) { // warn (loss of sign) } } } | Accuracy |
| alpha.core.DynamicTypeChecker | Experimental: Check for cases where the dynamic and the static type of an object are unrelated. | id date = [NSDate date]; // Warning: Object has a dynamic type ‘NSDate *’ which is // incompatible with static type ‘NSNumber *'” NSNumber *number = date; [number doubleValue]; | Maintainability |
| alpha.core.TestAfterDivZero | Experimental: Check for division by variable that is later compared against 0. Either the comparison is useless or there is division by zero. | void test(int x) { var = 77 / x; if (x == 0) { } // warn } | Robustness |
| alpha.deadcode.UnreachableCode | Experimental: Check unreachable code | int test() { int x = 1; while(x); return x; // warn } | Maintainability |
| alpha.osx.cocoa.DirectIvarAssignment | Experimental: Check for direct assignments to instance variables | @interface MyClass : NSObject {} @property (readonly) id A; – (void) foo; @end @implementation MyClass – (void) foo { _A = 0; // warn } @end | Maintainability |
| alpha.osx.cocoa.DirectIvarAssignmentForAnnotatedFunctions | Experimental: Check for direct assignments to instance variables in the methods annotated with objc_no_direct_instance_variable_assignment | @interface MyClass : NSObject {} @property (readonly) id A; – (void) fAnnotated __attribute__(( annotate(“objc_no_direct_instance_variable_assignment”))); – (void) fNotAnnotated; @end @implementation MyClass – (void) fAnnotated { _A = 0; // warn } – (void | Maintainability |
| alpha.osx.cocoa.InstanceVariableInvalidation | Experimental: Check that the invalidatable instance variables are invalidated in the methods annotated with objc_instance_variable_invalidator | @protocol Invalidation – (void) invalidate __attribute__((annotate(“objc_instance_variable_invalidator”))); @end @interface InvalidationImpObj : NSObject @end @interface SubclassInvalidationImpObj : InvalidationImpObj { Invalidat | Maintainability |
| alpha.osx.cocoa.localizability.PluralMisuseChecker | Experimental: Warns against using one vs. many plural pattern in code when generating localized strings. | 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]; } | Maintainability |
| alpha.osx.cocoa.MissingInvalidationMethod | Experimental: Check that the invalidation methods are present in classes that contain invalidatable instance variables | @protocol Invalidation – (void)invalidate __attribute__((annotate(“objc_instance_variable_invalidator”))); @end @interface NeedInvalidation : NSObject @end @interface MissingInvalidationMethodDecl : NSObject { NeedInvalidation *V | Resource Utilization |
