ValuesCode<[{
const char *Values =
#define GET_CHECKERS
- #define CHECKER(FULLNAME, CLASS, HT) FULLNAME ","
+ #define CHECKER(FULLNAME, CLASS, HT, DOC_URI) FULLNAME ","
#include "clang/StaticAnalyzer/Checkers/Checkers.inc"
#undef GET_CHECKERS
#define GET_PACKAGES
class CheckerRegistry;
#define GET_CHECKERS
-#define CHECKER(FULLNAME, CLASS, HELPTEXT) \
+#define CHECKER(FULLNAME, CLASS, HELPTEXT, DOC_URI) \
void register##CLASS(CheckerManager &mgr);
#include "clang/StaticAnalyzer/Checkers/Checkers.inc"
#undef CHECKER
/// a '-help'-like command line option.
class HelpText<string text> { string HelpText = text; }
+/// Describes what kind of documentation exists for the checker.
+class DocumentationEnum<bits<2> val> {
+ bits<2> Documentation = val;
+}
+def NotDocumented : DocumentationEnum<0>;
+def HasDocumentation : DocumentationEnum<1>;
+def HasAlphaDocumentation : DocumentationEnum<2>;
+
+class Documentation<DocumentationEnum val> {
+ bits<2> Documentation = val.Documentation;
+}
+
/// Describes a checker. Every builtin checker has to be registered with the use
/// of this class (out-of-trunk checkers loaded from plugins obviously don't).
/// Note that a checker has a name (e.g.: 'NullDereference'), and a fullname,
class Checker<string name = ""> {
string CheckerName = name;
string HelpText;
+ bits<2> Documentation;
Package ParentPackage;
}
let ParentPackage = Core in {
def DereferenceChecker : Checker<"NullDereference">,
- HelpText<"Check for dereferences of null pointers">;
+ HelpText<"Check for dereferences of null pointers">,
+ Documentation<HasDocumentation>;
def CallAndMessageChecker : Checker<"CallAndMessage">,
HelpText<"Check for logical errors for function calls and Objective-C "
"message expressions (e.g., uninitialized arguments, null function "
- "pointers)">;
+ "pointers)">,
+ Documentation<HasDocumentation>;
def NonNullParamChecker : Checker<"NonNullParamChecker">,
HelpText<"Check for null pointers passed as arguments to a function whose "
- "arguments are references or marked with the 'nonnull' attribute">;
+ "arguments are references or marked with the 'nonnull' attribute">,
+ Documentation<HasDocumentation>;
def VLASizeChecker : Checker<"VLASize">,
- HelpText<"Check for declarations of VLA of undefined or zero size">;
+ HelpText<"Check for declarations of VLA of undefined or zero size">,
+ Documentation<HasDocumentation>;
def DivZeroChecker : Checker<"DivideZero">,
- HelpText<"Check for division by zero">;
+ HelpText<"Check for division by zero">,
+ Documentation<HasDocumentation>;
def UndefResultChecker : Checker<"UndefinedBinaryOperatorResult">,
- HelpText<"Check for undefined results of binary operators">;
+ HelpText<"Check for undefined results of binary operators">,
+ Documentation<HasDocumentation>;
def StackAddrEscapeChecker : Checker<"StackAddressEscape">,
- HelpText<"Check that addresses to stack memory do not escape the function">;
+ HelpText<"Check that addresses to stack memory do not escape the function">,
+ Documentation<HasDocumentation>;
def DynamicTypePropagation : Checker<"DynamicTypePropagation">,
- HelpText<"Generate dynamic type information">;
+ HelpText<"Generate dynamic type information">,
+ Documentation<NotDocumented>;
def NonnullGlobalConstantsChecker: Checker<"NonnilStringConstants">,
- HelpText<"Assume that const string-like globals are non-null">;
+ HelpText<"Assume that const string-like globals are non-null">,
+ Documentation<NotDocumented>;
} // end "core"
let ParentPackage = CoreAlpha in {
def BoolAssignmentChecker : Checker<"BoolAssignment">,
- HelpText<"Warn about assigning non-{0,1} values to Boolean variables">;
+ HelpText<"Warn about assigning non-{0,1} values to Boolean variables">,
+ Documentation<HasAlphaDocumentation>;
def CastSizeChecker : Checker<"CastSize">,
HelpText<"Check when casting a malloc'ed type T, whether the size is a "
- "multiple of the size of T">;
+ "multiple of the size of T">,
+ Documentation<HasAlphaDocumentation>;
def CastToStructChecker : Checker<"CastToStruct">,
- HelpText<"Check for cast from non-struct pointer to struct pointer">;
+ HelpText<"Check for cast from non-struct pointer to struct pointer">,
+ Documentation<HasAlphaDocumentation>;
def ConversionChecker : Checker<"Conversion">,
- HelpText<"Loss of sign/precision in implicit conversions">;
+ HelpText<"Loss of sign/precision in implicit conversions">,
+ Documentation<HasAlphaDocumentation>;
def IdenticalExprChecker : Checker<"IdenticalExpr">,
- HelpText<"Warn about unintended use of identical expressions in operators">;
+ HelpText<"Warn about unintended use of identical expressions in operators">,
+ Documentation<HasAlphaDocumentation>;
def FixedAddressChecker : Checker<"FixedAddr">,
- HelpText<"Check for assignment of a fixed address to a pointer">;
+ HelpText<"Check for assignment of a fixed address to a pointer">,
+ Documentation<HasAlphaDocumentation>;
def PointerArithChecker : Checker<"PointerArithm">,
HelpText<"Check for pointer arithmetic on locations other than array "
- "elements">;
+ "elements">,
+ Documentation<HasAlphaDocumentation>;
def PointerSubChecker : Checker<"PointerSub">,
HelpText<"Check for pointer subtractions on two pointers pointing to "
- "different memory chunks">;
+ "different memory chunks">,
+ Documentation<HasAlphaDocumentation>;
def SizeofPointerChecker : Checker<"SizeofPtr">,
- HelpText<"Warn about unintended use of sizeof() on pointer expressions">;
+ HelpText<"Warn about unintended use of sizeof() on pointer expressions">,
+ Documentation<HasAlphaDocumentation>;
def CallAndMessageUnInitRefArg : Checker<"CallAndMessageUnInitRefArg">,
HelpText<"Check for logical errors for function calls and Objective-C "
"message expressions (e.g., uninitialized arguments, null function "
- "pointers, and pointer to undefined variables)">;
+ "pointers, and pointer to undefined variables)">,
+ Documentation<HasAlphaDocumentation>;
def TestAfterDivZeroChecker : Checker<"TestAfterDivZero">,
HelpText<"Check for division by variable that is later compared against 0. "
- "Either the comparison is useless or there is division by zero.">;
+ "Either the comparison is useless or there is division by zero.">,
+ Documentation<HasAlphaDocumentation>;
def DynamicTypeChecker : Checker<"DynamicTypeChecker">,
HelpText<"Check for cases where the dynamic and the static type of an object "
- "are unrelated.">;
+ "are unrelated.">,
+ Documentation<HasAlphaDocumentation>;
def StackAddrAsyncEscapeChecker : Checker<"StackAddressAsyncEscape">,
- HelpText<"Check that addresses to stack memory do not escape the function">;
+ HelpText<"Check that addresses to stack memory do not escape the function">,
+ Documentation<HasAlphaDocumentation>;
} // end "alpha.core"
def NullPassedToNonnullChecker : Checker<"NullPassedToNonnull">,
HelpText<"Warns when a null pointer is passed to a pointer which has a "
- "_Nonnull type.">;
+ "_Nonnull type.">,
+ Documentation<HasDocumentation>;
def NullReturnedFromNonnullChecker : Checker<"NullReturnedFromNonnull">,
HelpText<"Warns when a null pointer is returned from a function that has "
- "_Nonnull return type.">;
+ "_Nonnull return type.">,
+ Documentation<HasDocumentation>;
def NullableDereferencedChecker : Checker<"NullableDereferenced">,
- HelpText<"Warns when a nullable pointer is dereferenced.">;
+ HelpText<"Warns when a nullable pointer is dereferenced.">,
+ Documentation<HasDocumentation>;
def NullablePassedToNonnullChecker : Checker<"NullablePassedToNonnull">,
HelpText<"Warns when a nullable pointer is passed to a pointer which has a "
- "_Nonnull type.">;
+ "_Nonnull type.">,
+ Documentation<HasDocumentation>;
def NullableReturnedFromNonnullChecker : Checker<"NullableReturnedFromNonnull">,
HelpText<"Warns when a nullable pointer is returned from a function that has "
- "_Nonnull return type.">;
+ "_Nonnull return type.">,
+ Documentation<NotDocumented>;
} // end "nullability"
let ParentPackage = APIModeling in {
def StdCLibraryFunctionsChecker : Checker<"StdCLibraryFunctions">,
- HelpText<"Improve modeling of the C standard library functions">;
+ HelpText<"Improve modeling of the C standard library functions">,
+ Documentation<NotDocumented>;
def TrustNonnullChecker : Checker<"TrustNonnull">,
HelpText<"Trust that returns from framework methods annotated with _Nonnull "
- "are not null">;
+ "are not null">,
+ Documentation<NotDocumented>;
} // end "apiModeling"
def NoReturnFunctionChecker : Checker<"NoReturnFunctions">,
HelpText<"Evaluate \"panic\" functions that are known to not return to the "
- "caller">;
+ "caller">,
+ Documentation<NotDocumented>;
def BuiltinFunctionChecker : Checker<"BuiltinFunctions">,
- HelpText<"Evaluate compiler builtin functions (e.g., alloca())">;
+ HelpText<"Evaluate compiler builtin functions (e.g., alloca())">,
+ Documentation<NotDocumented>;
} // end "core.builtin"
let ParentPackage = CoreUninitialized in {
def UndefinedArraySubscriptChecker : Checker<"ArraySubscript">,
- HelpText<"Check for uninitialized values used as array subscripts">;
+ HelpText<"Check for uninitialized values used as array subscripts">,
+ Documentation<HasDocumentation>;
def UndefinedAssignmentChecker : Checker<"Assign">,
- HelpText<"Check for assigning uninitialized values">;
+ HelpText<"Check for assigning uninitialized values">,
+ Documentation<HasDocumentation>;
def UndefBranchChecker : Checker<"Branch">,
- HelpText<"Check for uninitialized values used as branch conditions">;
+ HelpText<"Check for uninitialized values used as branch conditions">,
+ Documentation<HasDocumentation>;
def UndefCapturedBlockVarChecker : Checker<"CapturedBlockVariable">,
- HelpText<"Check for blocks that capture uninitialized values">;
+ HelpText<"Check for blocks that capture uninitialized values">,
+ Documentation<NotDocumented>;
def ReturnUndefChecker : Checker<"UndefReturn">,
- HelpText<"Check for uninitialized values being returned to the caller">;
+ HelpText<"Check for uninitialized values being returned to the caller">,
+ Documentation<HasDocumentation>;
} // end "core.uninitialized"
def InnerPointerChecker : Checker<"InnerPointer">,
HelpText<"Check for inner pointers of C++ containers used after "
- "re/deallocation">;
+ "re/deallocation">,
+ Documentation<NotDocumented>;
def NewDeleteChecker : Checker<"NewDelete">,
HelpText<"Check for double-free and use-after-free problems. Traces memory "
- "managed by new/delete.">;
+ "managed by new/delete.">,
+ Documentation<HasDocumentation>;
def NewDeleteLeaksChecker : Checker<"NewDeleteLeaks">,
- HelpText<"Check for memory leaks. Traces memory managed by new/delete.">;
+ HelpText<"Check for memory leaks. Traces memory managed by new/delete.">,
+ Documentation<HasDocumentation>;
def CXXSelfAssignmentChecker : Checker<"SelfAssignment">,
- HelpText<"Checks C++ copy and move assignment operators for self assignment">;
+ HelpText<"Checks C++ copy and move assignment operators for self assignment">,
+ Documentation<NotDocumented>;
def MoveChecker: Checker<"Move">,
- HelpText<"Find use-after-move bugs in C++">;
+ HelpText<"Find use-after-move bugs in C++">,
+ Documentation<HasDocumentation>;
} // end: "cplusplus"
let ParentPackage = CplusplusOptIn in {
def VirtualCallChecker : Checker<"VirtualCall">,
- HelpText<"Check virtual function calls during construction or destruction">;
+ HelpText<"Check virtual function calls during construction or destruction">,
+ Documentation<HasDocumentation>;
} // end: "optin.cplusplus"
def DeleteWithNonVirtualDtorChecker : Checker<"DeleteWithNonVirtualDtor">,
HelpText<"Reports destructions of polymorphic objects with a non-virtual "
- "destructor in their base class">;
+ "destructor in their base class">,
+ Documentation<HasAlphaDocumentation>;
def EnumCastOutOfRangeChecker : Checker<"EnumCastOutOfRange">,
- HelpText<"Check integer to enumeration casts for out of range values">;
+ HelpText<"Check integer to enumeration casts for out of range values">,
+ Documentation<HasAlphaDocumentation>;
def InvalidatedIteratorChecker : Checker<"InvalidatedIterator">,
- HelpText<"Check for use of invalidated iterators">;
+ HelpText<"Check for use of invalidated iterators">,
+ Documentation<HasAlphaDocumentation>;
def IteratorRangeChecker : Checker<"IteratorRange">,
- HelpText<"Check for iterators used outside their valid ranges">;
+ HelpText<"Check for iterators used outside their valid ranges">,
+ Documentation<HasAlphaDocumentation>;
def MismatchedIteratorChecker : Checker<"MismatchedIterator">,
HelpText<"Check for use of iterators of different containers where iterators "
- "of the same container are expected">;
+ "of the same container are expected">,
+ Documentation<HasAlphaDocumentation>;
def UninitializedObjectChecker: Checker<"UninitializedObject">,
- HelpText<"Reports uninitialized fields after object construction">;
+ HelpText<"Reports uninitialized fields after object construction">,
+ Documentation<HasAlphaDocumentation>;
} // end: "alpha.cplusplus"
let ParentPackage = Valist in {
def UninitializedChecker : Checker<"Uninitialized">,
- HelpText<"Check for usages of uninitialized (or already released) va_lists.">;
+ HelpText<"Check for usages of uninitialized (or already released) va_lists.">,
+ Documentation<NotDocumented>;
def UnterminatedChecker : Checker<"Unterminated">,
- HelpText<"Check for va_lists which are not released by a va_end call.">;
+ HelpText<"Check for va_lists which are not released by a va_end call.">,
+ Documentation<NotDocumented>;
def CopyToSelfChecker : Checker<"CopyToSelf">,
- HelpText<"Check for va_lists which are copied onto itself.">;
+ HelpText<"Check for va_lists which are copied onto itself.">,
+ Documentation<NotDocumented>;
} // end : "valist"
def DeadStoresChecker : Checker<"DeadStores">,
HelpText<"Check for values stored to variables that are never read "
- "afterwards">;
+ "afterwards">,
+ Documentation<HasDocumentation>;
} // end DeadCode
let ParentPackage = DeadCodeAlpha in {
def UnreachableCodeChecker : Checker<"UnreachableCode">,
- HelpText<"Check unreachable code">;
+ HelpText<"Check unreachable code">,
+ Documentation<HasAlphaDocumentation>;
} // end "alpha.deadcode"
let ParentPackage = Performance in {
def PaddingChecker : Checker<"Padding">,
- HelpText<"Check for excessively padded structs.">;
+ HelpText<"Check for excessively padded structs.">,
+ Documentation<NotDocumented>;
} // end: "padding"
let ParentPackage = InsecureAPI in {
def bcmp : Checker<"bcmp">,
- HelpText<"Warn on uses of the 'bcmp' function">;
+ HelpText<"Warn on uses of the 'bcmp' function">,
+ Documentation<HasDocumentation>;
def bcopy : Checker<"bcopy">,
- HelpText<"Warn on uses of the 'bcopy' function">;
+ HelpText<"Warn on uses of the 'bcopy' function">,
+ Documentation<HasDocumentation>;
def bzero : Checker<"bzero">,
- HelpText<"Warn on uses of the 'bzero' function">;
+ HelpText<"Warn on uses of the 'bzero' function">,
+ Documentation<HasDocumentation>;
def gets : Checker<"gets">,
- HelpText<"Warn on uses of the 'gets' function">;
+ HelpText<"Warn on uses of the 'gets' function">,
+ Documentation<HasDocumentation>;
def getpw : Checker<"getpw">,
- HelpText<"Warn on uses of the 'getpw' function">;
+ HelpText<"Warn on uses of the 'getpw' function">,
+ Documentation<HasDocumentation>;
def mktemp : Checker<"mktemp">,
- HelpText<"Warn on uses of the 'mktemp' function">;
+ HelpText<"Warn on uses of the 'mktemp' function">,
+ Documentation<HasDocumentation>;
def mkstemp : Checker<"mkstemp">,
HelpText<"Warn when 'mkstemp' is passed fewer than 6 X's in the format "
- "string">;
+ "string">,
+ Documentation<HasDocumentation>;
def rand : Checker<"rand">,
- HelpText<"Warn on uses of the 'rand', 'random', and related functions">;
+ HelpText<"Warn on uses of the 'rand', 'random', and related functions">,
+ Documentation<HasDocumentation>;
def strcpy : Checker<"strcpy">,
- HelpText<"Warn on uses of the 'strcpy' and 'strcat' functions">;
+ HelpText<"Warn on uses of the 'strcpy' and 'strcat' functions">,
+ Documentation<HasDocumentation>;
def vfork : Checker<"vfork">,
- HelpText<"Warn on uses of the 'vfork' function">;
+ HelpText<"Warn on uses of the 'vfork' function">,
+ Documentation<HasDocumentation>;
def UncheckedReturn : Checker<"UncheckedReturn">,
HelpText<"Warn on uses of functions whose return values must be always "
- "checked">;
+ "checked">,
+ Documentation<HasDocumentation>;
} // end "security.insecureAPI"
def FloatLoopCounter : Checker<"FloatLoopCounter">,
HelpText<"Warn on using a floating point value as a loop counter (CERT: "
- "FLP30-C, FLP30-CPP)">;
+ "FLP30-C, FLP30-CPP)">,
+ Documentation<HasDocumentation>;
} // end "security"
let ParentPackage = SecurityAlpha in {
def ArrayBoundChecker : Checker<"ArrayBound">,
- HelpText<"Warn about buffer overflows (older checker)">;
+ HelpText<"Warn about buffer overflows (older checker)">,
+ Documentation<HasAlphaDocumentation>;
def ArrayBoundCheckerV2 : Checker<"ArrayBoundV2">,
- HelpText<"Warn about buffer overflows (newer checker)">;
+ HelpText<"Warn about buffer overflows (newer checker)">,
+ Documentation<HasAlphaDocumentation>;
def ReturnPointerRangeChecker : Checker<"ReturnPtrRange">,
- HelpText<"Check for an out-of-bound pointer being returned to callers">;
+ HelpText<"Check for an out-of-bound pointer being returned to callers">,
+ Documentation<HasAlphaDocumentation>;
def MallocOverflowSecurityChecker : Checker<"MallocOverflow">,
- HelpText<"Check for overflows in the arguments to malloc()">;
+ HelpText<"Check for overflows in the arguments to malloc()">,
+ Documentation<HasAlphaDocumentation>;
// Operating systems specific PROT_READ/PROT_WRITE values is not implemented,
// the defaults are correct for several common operating systems though,
// but may need to be overridden via the related analyzer-config flags.
def MmapWriteExecChecker : Checker<"MmapWriteExec">,
- HelpText<"Warn on mmap() calls that are both writable and executable">;
+ HelpText<"Warn on mmap() calls that are both writable and executable">,
+ Documentation<HasAlphaDocumentation>;
} // end "alpha.security"
let ParentPackage = Taint in {
def GenericTaintChecker : Checker<"TaintPropagation">,
- HelpText<"Generate taint information used by other checkers">;
+ HelpText<"Generate taint information used by other checkers">,
+ Documentation<HasAlphaDocumentation>;
} // end "alpha.security.taint"
let ParentPackage = Unix in {
def UnixAPIMisuseChecker : Checker<"API">,
- HelpText<"Check calls to various UNIX/Posix functions">;
+ HelpText<"Check calls to various UNIX/Posix functions">,
+ Documentation<HasDocumentation>;
def MallocChecker: Checker<"Malloc">,
HelpText<"Check for memory leaks, double free, and use-after-free problems. "
- "Traces memory managed by malloc()/free().">;
+ "Traces memory managed by malloc()/free().">,
+ Documentation<HasDocumentation>;
def MallocSizeofChecker : Checker<"MallocSizeof">,
- HelpText<"Check for dubious malloc arguments involving sizeof">;
+ HelpText<"Check for dubious malloc arguments involving sizeof">,
+ Documentation<HasDocumentation>;
def MismatchedDeallocatorChecker : Checker<"MismatchedDeallocator">,
- HelpText<"Check for mismatched deallocators.">;
+ HelpText<"Check for mismatched deallocators.">,
+ Documentation<HasDocumentation>;
def VforkChecker : Checker<"Vfork">,
- HelpText<"Check for proper usage of vfork">;
+ HelpText<"Check for proper usage of vfork">,
+ Documentation<HasDocumentation>;
} // end "unix"
let ParentPackage = UnixAlpha in {
def ChrootChecker : Checker<"Chroot">,
- HelpText<"Check improper use of chroot">;
+ HelpText<"Check improper use of chroot">,
+ Documentation<HasAlphaDocumentation>;
def PthreadLockChecker : Checker<"PthreadLock">,
- HelpText<"Simple lock -> unlock checker">;
+ HelpText<"Simple lock -> unlock checker">,
+ Documentation<HasAlphaDocumentation>;
def StreamChecker : Checker<"Stream">,
- HelpText<"Check stream handling functions">;
+ HelpText<"Check stream handling functions">,
+ Documentation<HasAlphaDocumentation>;
def SimpleStreamChecker : Checker<"SimpleStream">,
- HelpText<"Check for misuses of stream APIs">;
+ HelpText<"Check for misuses of stream APIs">,
+ Documentation<HasAlphaDocumentation>;
def BlockInCriticalSectionChecker : Checker<"BlockInCriticalSection">,
- HelpText<"Check for calls to blocking functions inside a critical section">;
+ HelpText<"Check for calls to blocking functions inside a critical section">,
+ Documentation<HasAlphaDocumentation>;
} // end "alpha.unix"
def CStringNullArg : Checker<"NullArg">,
HelpText<"Check for null pointers being passed as arguments to C string "
- "functions">;
+ "functions">,
+ Documentation<HasDocumentation>;
def CStringSyntaxChecker : Checker<"BadSizeArg">,
HelpText<"Check the size argument passed into C string functions for common "
- "erroneous patterns">;
+ "erroneous patterns">,
+ Documentation<HasDocumentation>;
} // end "unix.cstring"
let ParentPackage = CStringAlpha in {
def CStringOutOfBounds : Checker<"OutOfBounds">,
- HelpText<"Check for out-of-bounds access in string functions">;
+ HelpText<"Check for out-of-bounds access in string functions">,
+ Documentation<HasAlphaDocumentation>;
def CStringBufferOverlap : Checker<"BufferOverlap">,
- HelpText<"Checks for overlap in two buffer arguments">;
+ HelpText<"Checks for overlap in two buffer arguments">,
+ Documentation<HasAlphaDocumentation>;
def CStringNotNullTerm : Checker<"NotNullTerminated">,
- HelpText<"Check for arguments which are not null-terminating strings">;
+ HelpText<"Check for arguments which are not null-terminating strings">,
+ Documentation<HasAlphaDocumentation>;
} // end "alpha.unix.cstring"
def NumberObjectConversionChecker : Checker<"NumberObjectConversion">,
HelpText<"Check for erroneous conversions of objects representing numbers "
- "into numbers">;
+ "into numbers">,
+ Documentation<NotDocumented>;
def MacOSXAPIChecker : Checker<"API">,
- HelpText<"Check for proper uses of various Apple APIs">;
+ HelpText<"Check for proper uses of various Apple APIs">,
+ Documentation<HasDocumentation>;
def MacOSKeychainAPIChecker : Checker<"SecKeychainAPI">,
- HelpText<"Check for proper uses of Secure Keychain APIs">;
+ HelpText<"Check for proper uses of Secure Keychain APIs">,
+ Documentation<HasDocumentation>;
def ObjCPropertyChecker : Checker<"ObjCProperty">,
- HelpText<"Check for proper uses of Objective-C properties">;
+ HelpText<"Check for proper uses of Objective-C properties">,
+ Documentation<NotDocumented>;
def OSObjectRetainCountChecker : Checker<"OSObjectRetainCount">,
- HelpText<"Check for leaks and improper reference count management for OSObject">;
+ HelpText<"Check for leaks and improper reference count management for OSObject">,
+ Documentation<NotDocumented>;
} // end "osx"
def RunLoopAutoreleaseLeakChecker : Checker<"RunLoopAutoreleaseLeak">,
HelpText<"Check for leaked memory in autorelease pools that will never be "
- "drained">;
+ "drained">,
+ Documentation<NotDocumented>;
def ObjCAtSyncChecker : Checker<"AtSync">,
- HelpText<"Check for nil pointers used as mutexes for @synchronized">;
+ HelpText<"Check for nil pointers used as mutexes for @synchronized">,
+ Documentation<HasDocumentation>;
def NilArgChecker : Checker<"NilArg">,
- HelpText<"Check for prohibited nil arguments to ObjC method calls">;
+ HelpText<"Check for prohibited nil arguments to ObjC method calls">,
+ Documentation<HasDocumentation>;
def ClassReleaseChecker : Checker<"ClassRelease">,
HelpText<"Check for sending 'retain', 'release', or 'autorelease' directly "
- "to a Class">;
+ "to a Class">,
+ Documentation<HasDocumentation>;
def VariadicMethodTypeChecker : Checker<"VariadicMethodTypes">,
HelpText<"Check for passing non-Objective-C types to variadic collection "
- "initialization methods that expect only Objective-C types">;
+ "initialization methods that expect only Objective-C types">,
+ Documentation<HasDocumentation>;
def NSAutoreleasePoolChecker : Checker<"NSAutoreleasePool">,
HelpText<"Warn for suboptimal uses of NSAutoreleasePool in Objective-C GC "
- "mode">;
+ "mode">,
+ Documentation<HasDocumentation>;
def ObjCMethSigsChecker : Checker<"IncompatibleMethodTypes">,
HelpText<"Warn about Objective-C method signatures with type "
- "incompatibilities">;
+ "incompatibilities">,
+ Documentation<HasDocumentation>;
def ObjCUnusedIvarsChecker : Checker<"UnusedIvars">,
- HelpText<"Warn about private ivars that are never used">;
+ HelpText<"Warn about private ivars that are never used">,
+ Documentation<HasDocumentation>;
def ObjCSelfInitChecker : Checker<"SelfInit">,
HelpText<"Check that 'self' is properly initialized inside an initializer "
- "method">;
+ "method">,
+ Documentation<HasDocumentation>;
def ObjCLoopChecker : Checker<"Loops">,
- HelpText<"Improved modeling of loops using Cocoa collection types">;
+ HelpText<"Improved modeling of loops using Cocoa collection types">,
+ Documentation<NotDocumented>;
def ObjCNonNilReturnValueChecker : Checker<"NonNilReturnValue">,
- HelpText<"Model the APIs that are guaranteed to return a non-nil value">;
+ HelpText<"Model the APIs that are guaranteed to return a non-nil value">,
+ Documentation<NotDocumented>;
def ObjCSuperCallChecker : Checker<"MissingSuperCall">,
HelpText<"Warn about Objective-C methods that lack a necessary call to "
- "super">;
+ "super">,
+ Documentation<NotDocumented>;
def NSErrorChecker : Checker<"NSError">,
- HelpText<"Check usage of NSError** parameters">;
+ HelpText<"Check usage of NSError** parameters">,
+ Documentation<HasDocumentation>;
def RetainCountChecker : Checker<"RetainCount">,
- HelpText<"Check for leaks and improper reference count management">;
+ HelpText<"Check for leaks and improper reference count management">,
+ Documentation<HasDocumentation>;
def ObjCGenericsChecker : Checker<"ObjCGenerics">,
- HelpText<"Check for type errors when using Objective-C generics">;
+ HelpText<"Check for type errors when using Objective-C generics">,
+ Documentation<HasDocumentation>;
def ObjCDeallocChecker : Checker<"Dealloc">,
HelpText<"Warn about Objective-C classes that lack a correct implementation "
- "of -dealloc">;
+ "of -dealloc">,
+ Documentation<HasDocumentation>;
def ObjCSuperDeallocChecker : Checker<"SuperDealloc">,
- HelpText<"Warn about improper use of '[super dealloc]' in Objective-C">;
+ HelpText<"Warn about improper use of '[super dealloc]' in Objective-C">,
+ Documentation<HasDocumentation>;
def AutoreleaseWriteChecker : Checker<"AutoreleaseWrite">,
HelpText<"Warn about potentially crashing writes to autoreleasing objects "
- "from different autoreleasing pools in Objective-C">;
+ "from different autoreleasing pools in Objective-C">,
+ Documentation<NotDocumented>;
} // end "osx.cocoa"
def GCDAntipattern : Checker<"GCDAntipattern">,
HelpText<"Check for performance anti-patterns when using Grand Central "
- "Dispatch">;
+ "Dispatch">,
+ Documentation<NotDocumented>;
} // end "optin.performance"
let ParentPackage = CocoaAlpha in {
def InstanceVariableInvalidation : Checker<"InstanceVariableInvalidation">,
HelpText<"Check that the invalidatable instance variables are invalidated in "
- "the methods annotated with objc_instance_variable_invalidator">;
+ "the methods annotated with objc_instance_variable_invalidator">,
+ Documentation<HasAlphaDocumentation>;
def MissingInvalidationMethod : Checker<"MissingInvalidationMethod">,
HelpText<"Check that the invalidation methods are present in classes that "
- "contain invalidatable instance variables">;
+ "contain invalidatable instance variables">,
+ Documentation<HasAlphaDocumentation>;
def DirectIvarAssignment : Checker<"DirectIvarAssignment">,
- HelpText<"Check for direct assignments to instance variables">;
+ HelpText<"Check for direct assignments to instance variables">,
+ Documentation<HasAlphaDocumentation>;
def DirectIvarAssignmentForAnnotatedFunctions :
Checker<"DirectIvarAssignmentForAnnotatedFunctions">,
HelpText<"Check for direct assignments to instance variables in the methods "
- "annotated with objc_no_direct_instance_variable_assignment">;
+ "annotated with objc_no_direct_instance_variable_assignment">,
+ Documentation<HasAlphaDocumentation>;
} // end "alpha.osx.cocoa"
let ParentPackage = CoreFoundation in {
def CFNumberChecker : Checker<"CFNumber">,
- HelpText<"Check for proper uses of CFNumber APIs">;
+ HelpText<"Check for proper uses of CFNumber APIs">,
+ Documentation<HasDocumentation>;
def CFRetainReleaseChecker : Checker<"CFRetainRelease">,
- HelpText<"Check for null arguments to CFRetain/CFRelease/CFMakeCollectable">;
+ HelpText<"Check for null arguments to CFRetain/CFRelease/CFMakeCollectable">,
+ Documentation<HasDocumentation>;
def CFErrorChecker : Checker<"CFError">,
- HelpText<"Check usage of CFErrorRef* parameters">;
+ HelpText<"Check usage of CFErrorRef* parameters">,
+ Documentation<HasDocumentation>;
} // end "osx.coreFoundation"
def ObjCContainersASTChecker : Checker<"PointerSizedValues">,
HelpText<"Warns if 'CFArray', 'CFDictionary', 'CFSet' are created with "
- "non-pointer-size values">;
+ "non-pointer-size values">,
+ Documentation<HasDocumentation>;
def ObjCContainersChecker : Checker<"OutOfBounds">,
- HelpText<"Checks for index out-of-bounds when using 'CFArray' API">;
+ HelpText<"Checks for index out-of-bounds when using 'CFArray' API">,
+ Documentation<HasDocumentation>;
} // end "osx.coreFoundation.containers"
def NonLocalizedStringChecker : Checker<"NonLocalizedStringChecker">,
HelpText<"Warns about uses of non-localized NSStrings passed to UI methods "
- "expecting localized NSStrings">;
+ "expecting localized NSStrings">,
+ Documentation<HasDocumentation>;
def EmptyLocalizationContextChecker :
Checker<"EmptyLocalizationContextChecker">,
- HelpText<"Check that NSLocalizedString macros include a comment for context">;
+ HelpText<"Check that NSLocalizedString macros include a comment for context">,
+ Documentation<HasDocumentation>;
} // end "optin.osx.cocoa.localizability"
def PluralMisuseChecker : Checker<"PluralMisuseChecker">,
HelpText<"Warns against using one vs. many plural pattern in code when "
- "generating localized strings.">;
+ "generating localized strings.">,
+ Documentation<HasAlphaDocumentation>;
} // end "alpha.osx.cocoa.localizability"
let ParentPackage = MPI in {
def MPIChecker : Checker<"MPI-Checker">,
- HelpText<"Checks MPI code">;
+ HelpText<"Checks MPI code">,
+ Documentation<HasDocumentation>;
} // end "optin.mpi"
let ParentPackage = LLVMAlpha in {
def LLVMConventionsChecker : Checker<"Conventions">,
- HelpText<"Check code for LLVM codebase conventions">;
+ HelpText<"Check code for LLVM codebase conventions">,
+ Documentation<HasAlphaDocumentation>;
} // end "llvm"
let ParentPackage = GoogleAPIModeling in {
def GTestChecker : Checker<"GTest">,
- HelpText<"Model gtest assertion APIs">;
+ HelpText<"Model gtest assertion APIs">,
+ Documentation<NotDocumented>;
} // end "apiModeling.google"
let ParentPackage = Debug in {
def AnalysisOrderChecker : Checker<"AnalysisOrder">,
- HelpText<"Print callbacks that are called during analysis in order">;
+ HelpText<"Print callbacks that are called during analysis in order">,
+ Documentation<NotDocumented>;
def DominatorsTreeDumper : Checker<"DumpDominators">,
- HelpText<"Print the dominance tree for a given CFG">;
+ HelpText<"Print the dominance tree for a given CFG">,
+ Documentation<NotDocumented>;
def LiveVariablesDumper : Checker<"DumpLiveVars">,
- HelpText<"Print results of live variable analysis">;
+ HelpText<"Print results of live variable analysis">,
+ Documentation<NotDocumented>;
def LiveStatementsDumper : Checker<"DumpLiveStmts">,
- HelpText<"Print results of live statement analysis">;
+ HelpText<"Print results of live statement analysis">,
+ Documentation<NotDocumented>;
def CFGViewer : Checker<"ViewCFG">,
- HelpText<"View Control-Flow Graphs using GraphViz">;
+ HelpText<"View Control-Flow Graphs using GraphViz">,
+ Documentation<NotDocumented>;
def CFGDumper : Checker<"DumpCFG">,
- HelpText<"Display Control-Flow Graphs">;
+ HelpText<"Display Control-Flow Graphs">,
+ Documentation<NotDocumented>;
def CallGraphViewer : Checker<"ViewCallGraph">,
- HelpText<"View Call Graph using GraphViz">;
+ HelpText<"View Call Graph using GraphViz">,
+ Documentation<NotDocumented>;
def CallGraphDumper : Checker<"DumpCallGraph">,
- HelpText<"Display Call Graph">;
+ HelpText<"Display Call Graph">,
+ Documentation<NotDocumented>;
def ConfigDumper : Checker<"ConfigDumper">,
- HelpText<"Dump config table">;
+ HelpText<"Dump config table">,
+ Documentation<NotDocumented>;
def TraversalDumper : Checker<"DumpTraversal">,
- HelpText<"Print branch conditions as they are traversed by the engine">;
+ HelpText<"Print branch conditions as they are traversed by the engine">,
+ Documentation<NotDocumented>;
def CallDumper : Checker<"DumpCalls">,
- HelpText<"Print calls as they are traversed by the engine">;
+ HelpText<"Print calls as they are traversed by the engine">,
+ Documentation<NotDocumented>;
def AnalyzerStatsChecker : Checker<"Stats">,
- HelpText<"Emit warnings with analyzer statistics">;
+ HelpText<"Emit warnings with analyzer statistics">,
+ Documentation<NotDocumented>;
def TaintTesterChecker : Checker<"TaintTest">,
- HelpText<"Mark tainted symbols as such.">;
+ HelpText<"Mark tainted symbols as such.">,
+ Documentation<NotDocumented>;
def ExprInspectionChecker : Checker<"ExprInspection">,
- HelpText<"Check the analyzer's understanding of expressions">;
+ HelpText<"Check the analyzer's understanding of expressions">,
+ Documentation<NotDocumented>;
def ExplodedGraphViewer : Checker<"ViewExplodedGraph">,
- HelpText<"View Exploded Graphs using GraphViz">;
+ HelpText<"View Exploded Graphs using GraphViz">,
+ Documentation<NotDocumented>;
} // end "debug"
let ParentPackage = CloneDetectionAlpha in {
def CloneChecker : Checker<"CloneChecker">,
- HelpText<"Reports similar pieces of code.">;
+ HelpText<"Reports similar pieces of code.">,
+ Documentation<HasAlphaDocumentation>;
} // end "clone"
let ParentPackage = PortabilityOptIn in {
def UnixAPIPortabilityChecker : Checker<"UnixAPI">,
- HelpText<"Finds implementation-defined behavior in UNIX/Posix functions">;
+ HelpText<"Finds implementation-defined behavior in UNIX/Posix functions">,
+ Documentation<NotDocumented>;
} // end optin.portability
InitializationFunction Initialize;
StringRef FullName;
StringRef Desc;
+ StringRef DocumentationUri;
- CheckerInfo(InitializationFunction fn, StringRef name, StringRef desc)
- : Initialize(fn), FullName(name), Desc(desc) {}
+ CheckerInfo(InitializationFunction Fn, StringRef Name, StringRef Desc,
+ StringRef DocsUri)
+ : Initialize(Fn), FullName(Name), Desc(Desc),
+ DocumentationUri(DocsUri) {}
};
using CheckerInfoList = std::vector<CheckerInfo>;
public:
/// Adds a checker to the registry. Use this non-templated overload when your
/// checker requires custom initialization.
- void addChecker(InitializationFunction fn, StringRef fullName,
- StringRef desc);
+ void addChecker(InitializationFunction Fn, StringRef FullName, StringRef Desc,
+ StringRef DocsUri);
/// Adds a checker to the registry. Use this templated overload when your
/// checker does not require any custom initialization.
template <class T>
- void addChecker(StringRef fullName, StringRef desc) {
+ void addChecker(StringRef FullName, StringRef Desc, StringRef DocsUri) {
// Avoid MSVC's Compiler Error C2276:
// http://msdn.microsoft.com/en-us/library/850cstw1(v=VS.80).aspx
- addChecker(&CheckerRegistry::initializeManager<T>, fullName, desc);
+ addChecker(&CheckerRegistry::initializeManager<T>, FullName, Desc, DocsUri);
}
/// Initializes a CheckerManager by calling the initialization functions for
AnalyzerOptions::getRegisteredCheckers(bool IncludeExperimental /* = false */) {
static const StringRef StaticAnalyzerChecks[] = {
#define GET_CHECKERS
-#define CHECKER(FULLNAME, CLASS, HELPTEXT) \
+#define CHECKER(FULLNAME, CLASS, HELPTEXT, DOC_URI) \
FULLNAME,
#include "clang/StaticAnalyzer/Checkers/Checkers.inc"
#undef CHECKER
static StringRef getRuleDescription(StringRef CheckName) {
return llvm::StringSwitch<StringRef>(CheckName)
#define GET_CHECKERS
-#define CHECKER(FULLNAME, CLASS, HELPTEXT) \
+#define CHECKER(FULLNAME, CLASS, HELPTEXT, DOC_URI) \
.Case(FULLNAME, HELPTEXT)
#include "clang/StaticAnalyzer/Checkers/Checkers.inc"
#undef CHECKER
;
}
+static StringRef getRuleHelpURIStr(StringRef CheckName) {
+ return llvm::StringSwitch<StringRef>(CheckName)
+#define GET_CHECKERS
+#define CHECKER(FULLNAME, CLASS, HELPTEXT, DOC_URI) \
+ .Case(FULLNAME, DOC_URI)
+#include "clang/StaticAnalyzer/Checkers/Checkers.inc"
+#undef CHECKER
+#undef GET_CHECKERS
+ ;
+}
+
static json::Object createRule(const PathDiagnostic &Diag) {
StringRef CheckName = Diag.getCheckName();
- return json::Object{
+ json::Object Ret{
{"fullDescription", createMessage(getRuleDescription(CheckName))},
{"name", createMessage(CheckName)},
{"id", CheckName}};
+
+ std::string RuleURI = getRuleHelpURIStr(CheckName);
+ if (!RuleURI.empty())
+ Ret["helpURI"] = RuleURI;
+
+ return Ret;
}
static json::Array createRules(std::vector<const PathDiagnostic *> &Diags,
CheckerRegistry::CheckerRegistry(ArrayRef<std::string> plugins,
DiagnosticsEngine &diags) : Diags(diags) {
#define GET_CHECKERS
-#define CHECKER(FULLNAME, CLASS, HELPTEXT) \
- addChecker(register##CLASS, FULLNAME, HELPTEXT);
+#define CHECKER(FULLNAME, CLASS, HELPTEXT, DOC_URI) \
+ addChecker(register##CLASS, FULLNAME, HELPTEXT, DOC_URI);
#include "clang/StaticAnalyzer/Checkers/Checkers.inc"
#undef CHECKER
#undef GET_CHECKERS
for (const std::pair<std::string, bool> &opt : Opts.CheckersControlList) {
// Use a binary search to find the possible start of the package.
- CheckerRegistry::CheckerInfo packageInfo(nullptr, opt.first, "");
+ CheckerRegistry::CheckerInfo packageInfo(nullptr, opt.first, "", "");
auto firstRelatedChecker =
std::lower_bound(Checkers.cbegin(), end, packageInfo, checkerNameLT);
return enabledCheckers;
}
-void CheckerRegistry::addChecker(InitializationFunction fn, StringRef name,
- StringRef desc) {
- Checkers.push_back(CheckerInfo(fn, name, desc));
+void CheckerRegistry::addChecker(InitializationFunction Fn, StringRef Name,
+ StringRef Desc, StringRef DocsUri) {
+ Checkers.emplace_back(Fn, Name, Desc, DocsUri);
// Record the presence of the checker in its packages.
StringRef packageName, leafName;
- std::tie(packageName, leafName) = name.rsplit(PackageSeparator);
+ std::tie(packageName, leafName) = Name.rsplit(PackageSeparator);
while (!leafName.empty()) {
Packages[packageName] += 1;
std::tie(packageName, leafName) = packageName.rsplit(PackageSeparator);
"fullDescription": {
"text": "Check for logical errors for function calls and Objective-C message expressions (e.g., uninitialized arguments, null function pointers)"
},
+ "helpURI": "https://clang-analyzer.llvm.org/available_checks.html#core.CallAndMessage",
"id": "core.CallAndMessage",
"name": {
"text": "core.CallAndMessage"
"fullDescription": {
"text": "Check for division by zero"
},
+ "helpURI": "https://clang-analyzer.llvm.org/available_checks.html#core.DivideZero",
"id": "core.DivideZero",
"name": {
"text": "core.DivideZero"
return std::string();
}
+// Calculates the integer value representing the BitsInit object
+static inline uint64_t getValueFromBitsInit(const BitsInit *B) {
+ assert(B->getNumBits() <= sizeof(uint64_t) * 8 && "BitInits' too long!");
+
+ uint64_t Value = 0;
+ for (unsigned i = 0, e = B->getNumBits(); i != e; ++i) {
+ const auto *Bit = cast<BitInit>(B->getBit(i));
+ Value |= uint64_t(Bit->getValue()) << i;
+ }
+ return Value;
+}
+
+static std::string getCheckerDocs(const Record &R) {
+ StringRef LandingPage;
+ if (BitsInit *BI = R.getValueAsBitsInit("Documentation")) {
+ uint64_t V = getValueFromBitsInit(BI);
+ if (V == 1)
+ LandingPage = "available_checks.html";
+ else if (V == 2)
+ LandingPage = "alpha_checks.html";
+ }
+
+ if (LandingPage.empty())
+ return "";
+
+ return (llvm::Twine("https://clang-analyzer.llvm.org/") + LandingPage + "#" +
+ getCheckerFullName(&R))
+ .str();
+}
+
namespace clang {
void EmitClangSACheckers(RecordKeeper &Records, raw_ostream &OS) {
std::vector<Record*> checkers = Records.getAllDerivedDefinitions("Checker");
using SortedRecords = llvm::StringMap<const Record *>;
+ OS << "// This file is automatically generated. Do not edit this file by "
+ "hand.\n";
+
OS << "\n#ifdef GET_PACKAGES\n";
{
SortedRecords sortedPackages;
OS.write_escaped(getCheckerFullName(&R)) << "\", ";
OS << R.getName() << ", ";
OS << "\"";
- OS.write_escaped(getStringValue(R, "HelpText")) << '\"';
+ OS.write_escaped(getStringValue(R, "HelpText")) << "\", ";
+ OS << "\"";
+ OS.write_escaped(getCheckerDocs(R));
+ OS << "\"";
OS << ")\n";
}
OS << "#endif // GET_CHECKERS\n\n";
<thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
<tbody>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.clone.CloneChecker"><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>
+Reports similar pieces of code.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void log();
<thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
<tbody>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.core.BoolAssignment"><div class="namedescr expandable"><span class="name">
alpha.core.BoolAssignment</span><span class="lang">
(ObjC)</span><div class="descr">
-Warn about assigning non-{0,1} values to boolean variables.</div></div></td>
+Warn about assigning non-{0,1} values to boolean variables.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.core.CallAndMessageUnInitRefArg"><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>
+Check for uninitialized arguments in function calls and Objective-C
+message expressions.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test(void) {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.core.CastSize"><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
+Check when casting a malloc'ed type T, whether the size is a multiple of the
size of T (Works only with <span class="name">unix.Malloc</span>
-or <span class="name">alpha.unix.MallocWithAnnotations</span>
-checks enabled).</div></div></td>
+or <span class="name">alpha.unix.MallocWithAnnotations</span>
+checks enabled).</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.core.CastToStruct"><div class="namedescr expandable"><span class="name">
alpha.core.CastToStruct</span><span class="lang">
(C, C++)</span><div class="descr">
-Check for cast from non-struct pointer to struct pointer.</div></div></td>
+Check for cast from non-struct pointer to struct pointer.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
// C
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.core.Conversion"><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>
+Loss of sign or precision in implicit conversions</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test(unsigned U, signed S) {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.core.DynamicTypeChecker"><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>
+Check for cases where the dynamic and the static type of an
+object are unrelated.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
id date = [NSDate date];
-// Warning: Object has a dynamic type 'NSDate *' which is
+// 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">
+<tr><td><a id="alpha.core.FixedAddr"><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>
+Check for assignment of a fixed address to a pointer.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.core.IdenticalExpr"><div class="namedescr expandable"><span class="name">
alpha.core.IdenticalExpr</span><span class="lang">
(C, C++)</span><div class="descr">
-Warn about suspicious uses of identical expressions.</div></div></td>
+Warn about suspicious uses of identical expressions.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
// C
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.core.PointerArithm"><div class="namedescr expandable"><span class="name">
alpha.core.PointerArithm</span><span class="lang">
(C)</span><div class="descr">
-Check for pointer arithmetic on locations other than array
-elements.</div></div></td>
+Check for pointer arithmetic on locations other than array
+elements.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.core.PointerSub"><div class="namedescr expandable"><span class="name">
alpha.core.PointerSub</span><span class="lang">
(C)</span><div class="descr">
-Check for pointer subtractions on two pointers pointing to different memory
-chunks.</div></div></td>
+Check for pointer subtractions on two pointers pointing to different memory
+chunks.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.core.SizeofPtr"><div class="namedescr expandable"><span class="name">
alpha.core.SizeofPtr</span><span class="lang">
(C)</span><div class="descr">
-Warn about unintended use of <code>sizeof()</code> on pointer
-expressions.</div></div></td>
+Warn about unintended use of <code>sizeof()</code> on pointer
+expressions.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
struct s {};
int test(struct s *p) {
- return sizeof(p);
+ return sizeof(p);
// warn: sizeof(ptr) can produce an unexpected result
}
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.core.StackAddressAsyncEscape"><div class="namedescr expandable"><span class="name">
alpha.core.StackAddressAsyncEscape</span><span class="lang">
(C)</span><div class="descr">
Check that addresses to stack memory do not escape the function that involves
<code>dispatch_after</code> or <code>dispatch_async</code>. This checker is
a part of core.StackAddressEscape, but is
<a href=https://reviews.llvm.org/D41042>temporarily disabled</a> until some
-false positives are fixed.</div></div></td>
+false positives are fixed.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
dispatch_block_t test_block_inside_block_async_leak() {
int x = 123;
void (^inner)(void) = ^void(void) {
int y = x;
- ++y;
+ ++y;
};
void (^outer)(void) = ^void(void) {
int z = x;
++z;
- inner();
- };
+ inner();
+ };
return outer; // warn: address of stack-allocated block is captured by a
// returned block
}
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.core.TestAfterDivZero"><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.
+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>
+</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test(int x) {
var = 77 / x;
- if (x == 0) { } // warn
+ if (x == 0) { } // warn
}
</pre></div></div></td></tr>
<tbody>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.cplusplus.DeleteWithNonVirtualDtor"><div class="namedescr expandable"><span class="name">
alpha.cplusplus.DeleteWithNonVirtualDtor</span><span class="lang">
(C++)</span><div class="descr">
Reports destructions of polymorphic objects with a non-virtual destructor in
their base class
-</div></div></td>
+</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
NonVirtual *create() {
}
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.cplusplus.EnumCastOutOfRange"><div class="namedescr expandable"><span class="name">
alpha.cplusplus.EnumCastOutOfRange</span><span class="lang">
(C++)</span><div class="descr">
Check for integer to enumeration casts that could result in undefined values.
-</div></div></td>
+</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
enum TestEnum {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.cplusplus.InvalidatedIterator"><div class="namedescr expandable"><span class="name">
alpha.cplusplus.InvalidatedIterator</span><span class="lang">
(C++)</span><div class="descr">
Check for use of invalidated iterators.
-</div></div></td>
+</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void bad_copy_assign_operator_list1(std::list<int> &L1,
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.cplusplus.IteratorRange"><div class="namedescr expandable"><span class="name">
alpha.cplusplus.IteratorRange</span><span class="lang">
(C++)</span><div class="descr">
Check for iterators used outside their valid ranges.
-</div></div></td>
+</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void simple_bad_end(const std::vector<int> &v) {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.cplusplus.MismatchedIterator"><div class="namedescr expandable"><span class="name">
alpha.cplusplus.MismatchedIterator</span><span class="lang">
(C++)</span><div class="descr">
Check for use of iterators of different containers where iterators of the same
container are expected.
-</div></div></td>
+</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void bad_insert3(std::vector<int> &v1, std::vector<int> &v2) {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
-alpha.cplusplus.MisusedMovedObject</span><span class="lang">
+<tr><td><a id="alpha.cplusplus.Move"><div class="namedescr expandable"><span class="name">
+alpha.cplusplus.Move</span><span class="lang">
(C++)</span><div class="descr">
Method calls on a moved-from object and copying a moved-from object will be
reported.
-</div></div></td>
+</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
struct A {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.cplusplus.UninitializedObject"><div class="namedescr expandable"><span class="name">
alpha.cplusplus.UninitializedObject</span><span class="lang">
(C++)</span><div class="descr">
This checker reports uninitialized fields in objects created after a constructor
<code>-analyzer-config alpha.cplusplus.UninitializedObject:IgnoreRecordsWithField="[Tt]ag|[Kk]ind"</code>.
</li>
-</ul></div></div></td>
+</ul></div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
// With Pedantic and CheckPointeeInitialization set to true
<thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
<tbody>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.deadcode.UnreachableCode"><div class="namedescr expandable"><span class="name">
alpha.deadcode.UnreachableCode</span><span class="lang">
(C, C++, ObjC)</span><div class="descr">
-Check unreachable code.</div></div></td>
+Check unreachable code.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
// C
<thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
<tbody>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.llvm.Conventions"><div class="namedescr expandable"><span class="name">
alpha.llvm.Conventions</span><span class="lang">
(C)</span><div class="descr">
Check code for LLVM codebase conventions:
whose lifetime is shorter than the <code>StringRef</code>'s.</li>
<li>Clang AST nodes should not have fields that can allocate memory.</li>
</ul>
-</div></div></td>
+</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
<!-- TODO: Add examples, as currently it's hard to get this checker working. -->
<thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
<tbody>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.osx.cocoa.DirectIvarAssignment"><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
-should be set with the setter, not though a direct assignment.</div></div></td>
+Check that Objective C properties follow the following rule: the property
+should be set with the setter, not though a direct assignment.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
@interface MyClass : NSObject {}
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.osx.cocoa.DirectIvarAssignmentForAnnotatedFunctions"><div class="namedescr expandable"><span class="name">
alpha.osx.cocoa.DirectIvarAssignmentForAnnotatedFunctions</span><span class="lang">
(ObjC)</span><div class="descr">
-Check for direct assignments to instance variables in the methods annotated
-with <code>objc_no_direct_instance_variable_assignment</code>.</div></div></td>
+Check for direct assignments to instance variables in the methods annotated
+with <code>objc_no_direct_instance_variable_assignment</code>.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
@interface MyClass : NSObject {}
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.osx.cocoa.InstanceVariableInvalidation"><div class="namedescr expandable"><span class="name">
alpha.osx.cocoa.InstanceVariableInvalidation</span><span class="lang">
(ObjC)</span><div class="descr">
Check that the invalidatable instance variables are invalidated in the methods
-annotated with <code>objc_instance_variable_invalidator</code>.</div></div></td>
+annotated with <code>objc_instance_variable_invalidator</code>.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
@protocol Invalidation <NSObject>
-- (void) invalidate
+- (void) invalidate
__attribute__((annotate("objc_instance_variable_invalidator")));
-@end
+@end
@interface InvalidationImpObj : NSObject <Invalidation>
@end
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.osx.cocoa.MissingInvalidationMethod"><div class="namedescr expandable"><span class="name">
alpha.osx.cocoa.MissingInvalidationMethod</span><span class="lang">
(ObjC)</span><div class="descr">
-Check that the invalidation methods are present in classes that contain
-invalidatable instance variables.</div></div></td>
+Check that the invalidation methods are present in classes that contain
+invalidatable instance variables.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
@protocol Invalidation <NSObject>
-- (void)invalidate
+- (void)invalidate
__attribute__((annotate("objc_instance_variable_invalidator")));
@end
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.osx.cocoa.localizability.PluralMisuseChecker"><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
+Warns against using one vs. many plural pattern in code
when generating localized strings.
-</div></div></td>
+</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
-NSString *reminderText =
+NSString *reminderText =
NSLocalizedString(@"None", @"Indicates no reminders");
if (reminderCount == 1) {
// Warning: Plural cases are not supported across all languages.
// Use a .stringsdict file instead
- reminderText =
+ reminderText =
NSLocalizedString(@"1 Reminder", @"Indicates single reminder");
} else if (reminderCount >= 2) {
// Warning: Plural cases are not supported across all languages.
// Use a .stringsdict file instead
- reminderText =
+ reminderText =
[NSString stringWithFormat:
NSLocalizedString(@"%@ Reminders", @"Indicates multiple reminders"),
reminderCount];
<thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
<tbody>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.security.ArrayBound"><div class="namedescr expandable"><span class="name">
alpha.security.ArrayBound</span><span class="lang">
(C)</span><div class="descr">
-Warn about buffer overflows (older checker).</div></div></td>
+Warn about buffer overflows (older checker).</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
}
</pre></div><div class="separator"></div>
<div class="example"><pre>
-// note: requires unix.Malloc or
+// note: requires unix.Malloc or
// alpha.unix.MallocWithAnnotations checks enabled.
void test() {
int *p = malloc(12);
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.security.ArrayBoundV2"><div class="namedescr expandable"><span class="name">
alpha.security.ArrayBoundV2</span><span class="lang">
(C)</span><div class="descr">
-Warn about buffer overflows (newer checker).</div></div></td>
+Warn about buffer overflows (newer checker).</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.security.MallocOverflow"><div class="namedescr expandable"><span class="name">
alpha.security.MallocOverflow</span><span class="lang">
(C)</span><div class="descr">
-Check for overflows in the arguments to <code>malloc()</code>.</div></div></td>
+Check for overflows in the arguments to <code>malloc()</code>.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test(int n) {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.security.MmapWriteExec"><div class="namedescr expandable"><span class="name">
alpha.security.MmapWriteExec</span><span class="lang">
(C)</span><div class="descr">
Warn on <code>mmap()<code> calls that are both writable and executable.
-</div></div></td>
+</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test(int n) {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.security.ReturnPtrRange"><div class="namedescr expandable"><span class="name">
alpha.security.ReturnPtrRange</span><span class="lang">
(C)</span><div class="descr">
-Check for an out-of-bound pointer being returned to callers.</div></div></td>
+Check for an out-of-bound pointer being returned to callers.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
static int A[10];
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.security.taint.TaintPropagation"><div class="namedescr expandable"><span class="name">
alpha.security.taint.TaintPropagation</span><span class="lang">
(C)</span><div class="descr">
-Generate taint information used by other checkers.</div></div></td>
+Generate taint information used by other checkers.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div><div class="separator"></div>
<div class="example"><pre>
// note: compiler internally checks if the second param to
-// sprintf is a string literal or not.
+// sprintf is a string literal or not.
// Use -Wno-format-security to suppress compiler warning.
void test() {
char s[10], buf[10];
void test() {
size_t ts;
scanf("%zd", &ts); // 'ts' marked as tainted
- int *p = (int *)malloc(ts * sizeof(int));
+ int *p = (int *)malloc(ts * sizeof(int));
// warn: untrusted data as buffer size
}
</pre></div></div></td></tr>
<tbody>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.unix.BlockInCriticalSection"><div class="namedescr expandable"><span class="name">
alpha.unix.BlockInCriticalSection</span><span class="lang">
(C)</span><div class="descr">
Check for calls to blocking functions inside a critical section. Applies to:
mtx_unlock<br>
lock_guard<br>
unique_lock</div>
-</div></div></td>
+</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.unix.Chroot"><div class="namedescr expandable"><span class="name">
alpha.unix.Chroot</span><span class="lang">
(C)</span><div class="descr">
-Check improper use of <code>chroot</code>.</div></div></td>
+Check improper use of <code>chroot</code>.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void f();
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.unix.PthreadLock"><div class="namedescr expandable"><span class="name">
alpha.unix.PthreadLock</span><span class="lang">
(C)</span><div class="descr">
Simple lock -> unlock checker; applies to:<div class=functions>
pthread_mutex_unlock<br>
pthread_rwlock_unlock<br>
lck_mtx_unlock<br>
-lck_rw_done</div></div></div></td>
+lck_rw_done</div></div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
pthread_mutex_t mtx;
void test() {
pthread_mutex_lock(&mtx);
- pthread_mutex_lock(&mtx);
+ pthread_mutex_lock(&mtx);
// warn: this lock has already been acquired
}
</pre></div><div class="separator"></div>
void test() {
lck_mtx_lock(&lck1);
lck_mtx_lock(&lck2);
- lck_mtx_unlock(&lck1);
+ lck_mtx_unlock(&lck1);
// warn: this was not the most recently acquired lock
}
</pre></div><div class="separator"></div>
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.unix.SimpleStream"><div class="namedescr expandable"><span class="name">
alpha.unix.SimpleStream</span><span class="lang">
(C)</span><div class="descr">
Check for misuses of stream APIs:<div class=functions>
(<a href="http://llvm.org/devmtg/2012-11/Zaks-Rose-Checker24Hours.pdf">Slides</a>
,<a href="https://youtu.be/kdxlsP5QVPw">Video</a>)
by Anna Zaks and Jordan Rose presented at the <a href="http://llvm.org/devmtg/2012-11/">
-2012 LLVM Developers' Meeting).</a></div></div></td>
+2012 LLVM Developers' Meeting).</a></div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.unix.Stream"><div class="namedescr expandable"><span class="name">
alpha.unix.Stream</span><span class="lang">
(C)</span><div class="descr">
Check stream handling functions:<div class=functions>fopen<br>
clearerr<br>
feof<br>
ferror<br>
-fileno</div></div></div></td>
+fileno</div></div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
void test() {
FILE *p = fopen("foo", "r");
fseek(p, 1, SEEK_SET); // warn: stream pointer might be NULL
- fclose(p);
+ fclose(p);
}
</pre></div><div class="separator"></div>
<div class="example"><pre>
fseek(p, 1, 3);
// warn: third arg should be SEEK_SET, SEEK_END, or SEEK_CUR
- fclose(p);
+ fclose(p);
}
</pre></div><div class="separator"></div>
<div class="example"><pre>
void test() {
FILE *p = fopen("foo", "r");
- fclose(p);
+ fclose(p);
fclose(p); // warn: already closed
}
</pre></div><div class="separator"></div>
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.unix.cstring.BufferOverlap"><div class="namedescr expandable"><span class="name">
alpha.unix.cstring.BufferOverlap</span><span class="lang">
(C)</span><div class="descr">
Checks for overlap in two buffer arguments; applies to:<div class=functions>
memcpy<br>
-mempcpy</div></div></div></td>
+mempcpy</div></div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.unix.cstring.NotNullTerminated"><div class="namedescr expandable"><span class="name">
alpha.unix.cstring.NotNullTerminated</span><span class="lang">
(C)</span><div class="descr">
Check for arguments which are not null-terminated strings; applies
void test() {
int y = strlen((char *)&test); // warn
}
-</pre></div></div></td></tr>
+</pre></div></div></a></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="alpha.unix.cstring.OutOfBounds"><div class="namedescr expandable"><span class="name">
alpha.unix.cstring.OutOfBounds</span><span class="lang">
(C)</span><div class="descr">
Check for out-of-bounds access in string functions; applies
to:<div class=functions>
strncopy<br>
-strncat</div></div></div></td>
+strncat</div></div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test(char *y) {
<thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
<tbody>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="core.CallAndMessage"><div class="namedescr expandable"><span class="name">
core.CallAndMessage</span><span class="lang">
(C, C++, ObjC)</span><div class="descr">
Check for logical errors for function calls and Objective-C message expressions
-(e.g., uninitialized arguments, null function pointers).</div></div></td>
+(e.g., uninitialized arguments, null function pointers).</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
// C
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="core.DivideZero"><div class="namedescr expandable"><span class="name">
core.DivideZero</span><span class="lang">
(C, C++, ObjC)</span><div class="descr">
-Check for division by zero.</div></div></td>
+Check for division by zero.</div></div></a>co</td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test(int z) {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="core.NonNullParamChecker"><div class="namedescr expandable"><span class="name">
core.NonNullParamChecker</span><span class="lang">
(C, C++, ObjC)</span><div class="descr">
Check for null pointers passed as arguments to a function whose arguments are
-marked with the <code>nonnull</code> attribute.</div></div></td>
+marked with the <code>nonnull</code> attribute.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
int f(int *p) __attribute__((nonnull));
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="core.NullDereference"><div class="namedescr expandable"><span class="name">
core.NullDereference</span><span class="lang">
(C, C++, ObjC)</span><div class="descr">
-Check for dereferences of null pointers.</div></div></td>
+Check for dereferences of null pointers.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
// C
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="core.StackAddressEscape"><div class="namedescr expandable"><span class="name">
core.StackAddressEscape</span><span class="lang">
(C)</span><div class="descr">
-Check that addresses of stack memory do not escape the function.</div></div></td>
+Check that addresses of stack memory do not escape the function.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
char const *p;
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="core.UndefinedBinaryOperatorResult"><div class="namedescr expandable"><span class="name">
core.UndefinedBinaryOperatorResult</span><span class="lang">
(C)</span><div class="descr">
-Check for undefined results of binary operators.</div></div></td>
+Check for undefined results of binary operators.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="core.VLASize"><div class="namedescr expandable"><span class="name">
core.VLASize</span><span class="lang">
(C)</span><div class="descr">
-Check for declarations of VLA of undefined or zero size.</div></div></td>
+Check for declarations of VLA of undefined or zero size.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="core.uninitialized.ArraySubscript"><div class="namedescr expandable"><span class="name">
core.uninitialized.ArraySubscript</span><span class="lang">
(C)</span><div class="descr">
-Check for uninitialized values used as array subscripts.</div></div></td>
+Check for uninitialized values used as array subscripts.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="core.uninitialized.Assign"><div class="namedescr expandable"><span class="name">
core.uninitialized.Assign</span><span class="lang">
(C)</span><div class="descr">
-Check for assigning uninitialized values.</div></div></td>
+Check for assigning uninitialized values.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="core.uninitialized.Branch"><div class="namedescr expandable"><span class="name">
core.uninitialized.Branch</span><span class="lang">
(C)</span><div class="descr">
-Check for uninitialized values used as branch conditions.</div></div></td>
+Check for uninitialized values used as branch conditions.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="core.uninitialized.CapturedBlockVariable"><div class="namedescr expandable"><span class="name">
core.uninitialized.CapturedBlockVariable</span><span class="lang">
(C)</span><div class="descr">
-Check for blocks that capture uninitialized values.</div></div></td>
+Check for blocks that capture uninitialized values.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="core.uninitialized.UndefReturn"><div class="namedescr expandable"><span class="name">
core.uninitialized.UndefReturn</span><span class="lang">
(C)</span><div class="descr">
-Check for uninitialized values being returned to the caller.</div></div></td>
+Check for uninitialized values being returned to the caller.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
int test() {
<thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
<tbody>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="cplusplus.NewDelete"><div class="namedescr expandable"><span class="name">
cplusplus.NewDelete</span><span class="lang">
(C++)</span><div class="descr">
Check for double-free, use-after-free and offset problems involving C++ <code>
-delete</code>.</div></div></td>
+delete</code>.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void f(int *p);
}
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="cplusplus.NewDeleteLeaks"><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>
+delete</code>.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
<thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
<tbody>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="deadcode.DeadStores"><div class="namedescr expandable"><span class="name">
deadcode.DeadStores</span><span class="lang">
(C)</span><div class="descr">
-Check for values stored to variables that are never read afterwards.</div></div></td>
+Check for values stored to variables that are never read afterwards.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
<thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
<tbody>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="nullability.NullPassedToNonnull"><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>
+Warns when a null pointer is passed to a pointer which has a
+_Nonnull type.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
if (name != nil)
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="nullability.NullReturnedFromNonnull"><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>
+Warns when a null pointer is returned from a function that has
+_Nonnull return type.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
- (nonnull id)firstChild {
if ([_children count] > 0)
result = _children[0];
- // Warning: nil returned from a method that is expected
+ // 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">
+<tr><td><a id="nullability.NullableDereferenced"><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>
+Warns when a nullable pointer is dereferenced.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
struct LinkedList {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="nullability.NullablePassedToNonnull"><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>
+Warns when a nullable pointer is passed to a pointer which has a _Nonnull type.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
typedef struct Dummy { int val; } Dummy;
<tbody>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="optin.cplusplus.VirtualCall"><div class="namedescr expandable"><span class="name">
optin.cplusplus.VirtualCall</span><span class="lang">
(C++)</span><div class="descr">
-Check virtual member function calls during construction or
-destruction.</div></div></td>
+Check virtual member function calls during construction or
+destruction.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
class A {
public:
- A() {
+ A() {
f(); // warn
}
virtual void f();
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="optin.mpi.MPI-Checker"><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>
+Checks MPI code</div></div></a></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,
+ 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>
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="optin.osx.cocoa.localizability.EmptyLocalizationContextChecker"><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>
+Check that NSLocalizedString macros include a comment for context.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
- (void)test {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="optin.osx.cocoa.localizability.NonLocalizedStringChecker"><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>
+Warns about uses of non-localized NSStrings passed to UI methods
+expecting localized NSStrings</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
-NSString *alarmText =
+NSString *alarmText =
NSLocalizedString(@"Enabled", @"Indicates alarm is turned on");
if (!isEnabled) {
alarmText = @"Disabled";
<thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
<tbody>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="osx.API"><div class="namedescr expandable"><span class="name">
osx.API</span><span class="lang">
(C)</span><div class="descr">
Check for proper uses of various Apple APIs:<div class=functions>
-dispatch_once</div></div></div></td>
+dispatch_once</div></div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="osx.NumberObjectConversion"><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>
+Check for erroneous conversions of objects representing numbers
+into numbers</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
NSNumber *photoCount = [albumDescriptor objectForKey:@"PhotoCount"];
-// Warning: Comparing a pointer value of type 'NSNumber *'
+// 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">
+<tr><td><a id="osx.SecKeychainAPI"><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>
SecKeychainFindInternetPassword<br>
SecKeychainItemFreeContent<br>
SecKeychainItemCopyAttributesAndData<br>
-SecKeychainItemFreeAttributesAndData</div></div></div></td>
+SecKeychainItemFreeAttributesAndData</div></div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="osx.cocoa.AtSync"><div class="namedescr expandable"><span class="name">
osx.cocoa.AtSync</span><span class="lang">
(ObjC)</span><div class="descr">
-Check for nil pointers used as mutexes for <code>@synchronized</code>.</div></div></td>
+Check for nil pointers used as mutexes for <code>@synchronized</code>.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test(id x) {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="osx.cocoa.ClassRelease"><div class="namedescr expandable"><span class="name">
osx.cocoa.ClassRelease</span><span class="lang">
(ObjC)</span><div class="descr">
Check for sending <code>retain</code>, <code>release</code>, or <code>
-autorelease</code> directly to a class.</div></div></td>
+autorelease</code> directly to a class.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
@interface MyClass : NSObject
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="osx.cocoa.Dealloc"><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
+Warn about Objective-C classes that lack a correct implementation
of <code>-dealloc</code>.
-</div></div></td>
+</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
@interface MyObject : NSObject {
- id _myproperty;
+ id _myproperty;
}
@end
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="osx.cocoa.IncompatibleMethodTypes"><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>
+Check for an incompatible type signature when overriding an Objective-C method.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
@interface MyClass1 : NSObject
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
-alpha.osx.cocoa.MissingSuperCall</span><span class="lang">
+<tr><td><a id="osx.cocoa.MissingSuperCall"><div class="namedescr expandable"><span class="name">
+osx.cocoa.MissingSuperCall</span><span class="lang">
(ObjC)</span><div class="descr">
Warn about Objective-C methods that lack a necessary call to super. (Note: The
compiler now has a warning for methods annotated with <code>objc_requires_super</code>
attribute. The checker exists to check methods in the Cocoa frameworks
-that haven't yet adopted this attribute.)</div></div></td>
+that haven't yet adopted this attribute.)</div></div></a></td>
<td><div class="example"><pre>
@interface Test : UIViewController
@end
</pre></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="osx.cocoa.NSAutoreleasePool"><div class="namedescr expandable"><span class="name">
osx.cocoa.NSAutoreleasePool</span><span class="lang">
(ObjC)</span><div class="descr">
Warn for suboptimal uses of NSAutoreleasePool in Objective-C
-GC mode (<code>-fobjc-gc</code> compiler option).</div></div></td>
+GC mode (<code>-fobjc-gc</code> compiler option).</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="osx.cocoa.NSError"><div class="namedescr expandable"><span class="name">
osx.cocoa.NSError</span><span class="lang">
(ObjC)</span><div class="descr">
-Check usage of <code>NSError**</code> parameters.</div></div></td>
+Check usage of <code>NSError**</code> parameters.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
@interface A : NSObject
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="osx.cocoa.NilArg"><div class="namedescr expandable"><span class="name">
osx.cocoa.NilArg</span><span class="lang">
(ObjC)</span><div class="descr">
Check for prohibited nil arguments in specific Objective-C method calls:<div class=functions>
- compare:options:range:<br>
- compare:options:range:locale:<br>
- componentsSeparatedByCharactersInSet:<br>
-- initWithFormat:</div></div></div></td>
+- initWithFormat:</div></div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
NSComparisonResult test(NSString *s) {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="osx.cocoa.ObjCGenerics"><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>
+Check for type errors when using Objective-C generics</div></div></a></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 *'
+// 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">
+<tr><td><a id="osx.cocoa.RetainCount"><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>
+Check for leaks and violations of the Cocoa Memory Management rules.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="osx.cocoa.SelfInit"><div class="namedescr expandable"><span class="name">
osx.cocoa.SelfInit</span><span class="lang">
(ObjC)</span><div class="descr">
Check that <code>self</code> is properly initialized inside an initializer
-method.</div></div></td>
+method.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
@interface MyObj : NSObject {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="osx.cocoa.SuperDealloc"><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>
+Warn about improper use of '[super dealloc]' in Objective-C</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
@interface SuperDeallocThenReleaseIvarClass : NSObject {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="osx.cocoa.UnusedIvars"><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>
+Warn about private ivars that are never used.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
@interface MyObj : NSObject {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="osx.cocoa.VariadicMethodTypes"><div class="namedescr expandable"><span class="name">
osx.cocoa.VariadicMethodTypes</span><span class="lang">
(ObjC)</span><div class="descr">
Check for passing non-Objective-C types to variadic collection initialization
-methods that expect only Objective-C types.</div></div></td>
+methods that expect only Objective-C types.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="osx.coreFoundation.CFError"><div class="namedescr expandable"><span class="name">
osx.coreFoundation.CFError</span><span class="lang">
(C)</span><div class="descr">
-Check usage of <code>CFErrorRef*</code> parameters.</div></div></td>
+Check usage of <code>CFErrorRef*</code> parameters.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test(CFErrorRef *error) {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="osx.coreFoundation.CFNumber"><div class="namedescr expandable"><span class="name">
osx.coreFoundation.CFNumber</span><span class="lang">
(C)</span><div class="descr">
-Check for improper uses of <code>CFNumberCreate</code>.</div></div></td>
+Check for improper uses of <code>CFNumberCreate</code>.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
CFNumberRef test(unsigned char x) {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="osx.coreFoundation.CFRetainRelease"><div class="namedescr expandable"><span class="name">
osx.coreFoundation.CFRetainRelease</span><span class="lang">
(C)</span><div class="descr">
Check for null arguments to <code>CFRetain</code>, <code>CFRelease</code>,
-<code>CFMakeCollectable</code>.</div></div></td>
+<code>CFMakeCollectable</code>.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test(CFTypeRef p) {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="osx.coreFoundation.containers.OutOfBounds"><div class="namedescr expandable"><span class="name">
osx.coreFoundation.containers.OutOfBounds</span><span class="lang">
(C)</span><div class="descr">
-Checks for index out-of-bounds when using <code>CFArray</code> API.</div></div></td>
+Checks for index out-of-bounds when using <code>CFArray</code> API.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="osx.coreFoundation.containers.PointerSizedValues"><div class="namedescr expandable"><span class="name">
osx.coreFoundation.containers.PointerSizedValues</span><span class="lang">
(C)</span><div class="descr">
Warns if <code>CFArray</code>, <code>CFDictionary</code>, <code>CFSet</code> are
-created with non-pointer-size values.</div></div></td>
+created with non-pointer-size values.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
<thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
<tbody>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="security.FloatLoopCounter"><div class="namedescr expandable"><span class="name">
security.FloatLoopCounter</span><span class="lang">
(C)</span><div class="descr">
Warn on using a floating point value as a loop counter (CERT: FLP30-C,
-FLP30-CPP).</div></div></td>
+FLP30-CPP).</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="security.insecureAPI.UncheckedReturn"><div class="namedescr expandable"><span class="name">
security.insecureAPI.UncheckedReturn</span><span class="lang">
(C)</span><div class="descr">
Warn on uses of functions whose return values must be always checked:<div class=functions>
seteuid<br>
setegid<br>
setreuid<br>
-setregid</div></div></div></td>
+setregid</div></div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="security.insecureAPI.bcmp"><div class="namedescr expandable"><span class="name">
security.insecureAPI.bcmp</span><span class="lang">
(C)</span><div class="descr">
-Warn on uses of the <code>bcmp</code> function.</div></div></td>
+Warn on uses of the <code>bcmp</code> function.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
}
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="security.insecureAPI.bcopy"><div class="namedescr expandable"><span class="name">
security.insecureAPI.bcopy</span><span class="lang">
(C)</span><div class="descr">
-Warn on uses of the <code>bcopy</code> function.</div></div></td>
+Warn on uses of the <code>bcopy</code> function.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
}
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="security.insecureAPI.bzero"><div class="namedescr expandable"><span class="name">
security.insecureAPI.bzero</span><span class="lang">
(C)</span><div class="descr">
-Warn on uses of the <code>bzero</code> function.</div></div></td>
+Warn on uses of the <code>bzero</code> function.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="security.insecureAPI.getpw"><div class="namedescr expandable"><span class="name">
security.insecureAPI.getpw</span><span class="lang">
(C)</span><div class="descr">
-Warn on uses of the <code>getpw</code> function.</div></div></td>
+Warn on uses of the <code>getpw</code> function.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="security.insecureAPI.gets"><div class="namedescr expandable"><span class="name">
security.insecureAPI.gets</span><span class="lang">
(C)</span><div class="descr">
-Warn on uses of the <code>gets</code> function.</div></div></td>
+Warn on uses of the <code>gets</code> function.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="security.insecureAPI.mkstemp"><div class="namedescr expandable"><span class="name">
security.insecureAPI.mkstemp</span><span class="lang">
(C)</span><div class="descr">
Warn when <code>mktemp</code>, <code>mkstemp</code>, <code>mkstemps</code> or
<code>mkdtemp</code> is passed fewer than 6
-X's in the format string.</div></div></td>
+X's in the format string.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="security.insecureAPI.mktemp"><div class="namedescr expandable"><span class="name">
security.insecureAPI.mktemp</span><span class="lang">
(C)</span><div class="descr">
-Warn on uses of the <code>mktemp</code> function.</div></div></td>
+Warn on uses of the <code>mktemp</code> function.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="security.insecureAPI.rand"><div class="namedescr expandable"><span class="name">
security.insecureAPI.rand</span><span class="lang">
(C)</span><div class="descr">
Warn on uses of inferior random number generating functions (only if <code>arc4random</code>
mrand48<br>
nrand48<br>
random<br>
-rand_r</div></div></div></td>
+rand_r</div></div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="security.insecureAPI.strcpy"><div class="namedescr expandable"><span class="name">
security.insecureAPI.strcpy</span><span class="lang">
(C)</span><div class="descr">
-Warn on uses of the <code>strcpy</code> and <code>strcat</code> functions.</div></div></td>
+Warn on uses of the <code>strcpy</code> and <code>strcat</code> functions.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="security.insecureAPI.vfork"><div class="namedescr expandable"><span class="name">
security.insecureAPI.vfork</span><span class="lang">
(C)</span><div class="descr">
-Warn on uses of the <code>vfork</code> function.</div></div></td>
+Warn on uses of the <code>vfork</code> function.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
<thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
<tbody>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="unix.API"><div class="namedescr expandable"><span class="name">
unix.API</span><span class="lang">
(C)</span><div class="descr">
Check calls to various UNIX/POSIX functions:<div class=functions>
calloc<br>
malloc<br>
realloc<br>
-alloca<br>
+alloca<br></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
// Currently the check is performed for apple targets only.
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="unix.Malloc"><div class="namedescr expandable"><span class="name">
unix.Malloc</span><span class="lang">
(C)</span><div class="descr">
Check for memory leaks, double free, and use-after-free and offset problems
-involving <code>malloc</code>.</div></div></td>
+involving <code>malloc</code>.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="unix.MallocSizeof"><div class="namedescr expandable"><span class="name">
unix.MallocSizeof</span><span class="lang">
(C)</span><div class="descr">
Check for dubious <code>malloc</code>, <code>calloc</code> or
-<code>realloc</code> arguments involving <code>sizeof</code>.</div></div></td>
+<code>realloc</code> arguments involving <code>sizeof</code>.</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="unix.MismatchedDeallocator"><div class="namedescr expandable"><span class="name">
unix.MismatchedDeallocator</span><span class="lang">
(C, C++, ObjC)</span><div class="descr">
Check for mismatched deallocators (e.g. passing a pointer allocating
-with <code>new</code> to <code>free()</code>).</div></div></td>
+with <code>new</code> to <code>free()</code>).</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
// C, C++
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="unix.Vfork"><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>
+Check for proper usage of vfork</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
int test(int x) {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="unix.cstring.BadSizeArg"><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
patterns. Use <code>-Wno-strncat-size</code> compiler option to mute other
<code>strncat</code>-related compiler warnings.
-</div></div></td>
+</div></div></a></td>
<td><div class="exampleContainer expandable">
<div class="example"><pre>
void test() {
</pre></div></div></td></tr>
-<tr><td><div class="namedescr expandable"><span class="name">
+<tr><td><a id="unix.cstring.NullArg"><div class="namedescr expandable"><span class="name">
unix.cstring.NullArg</span><span class="lang">
(C)</span><div class="descr">
Check for null pointers being passed as arguments to C string functions:<div class=functions>
strcmp<br>
strncmp<br>
strcasecmp<br>
-strncasecmp</div></div></div></td>
+strncasecmp</div></div></div></a></td>
<td><div class="example"><pre>
int test() {
return strlen(0); // warn