Explorar o código

Allow direct navigation to static analysis checker documentation through SARIF exports.

This adds anchors to all of the documented checks so that you can directly link to a check by a stable name. This is useful because the SARIF file format has a field for specifying a URI to documentation for a rule and some viewers, like CodeSonar, make use of this information. These links are then exposed through the SARIF exporter.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@349812 91177308-0d34-0410-b5e6-96231b3b80d8
Aaron Ballman %!s(int64=6) %!d(string=hai) anos
pai
achega
26ec99a284

+ 1 - 1
include/clang/Driver/CC1Options.td

@@ -108,7 +108,7 @@ def analyzer_checker : Separate<["-"], "analyzer-checker">,
   ValuesCode<[{
   ValuesCode<[{
     const char *Values =
     const char *Values =
     #define GET_CHECKERS
     #define GET_CHECKERS
-    #define CHECKER(FULLNAME, CLASS, HT)  FULLNAME ","
+    #define CHECKER(FULLNAME, CLASS, HT, DOC_URI)  FULLNAME ","
     #include "clang/StaticAnalyzer/Checkers/Checkers.inc"
     #include "clang/StaticAnalyzer/Checkers/Checkers.inc"
     #undef GET_CHECKERS
     #undef GET_CHECKERS
     #define GET_PACKAGES
     #define GET_PACKAGES

+ 1 - 1
include/clang/StaticAnalyzer/Checkers/BuiltinCheckerRegistration.h

@@ -24,7 +24,7 @@ class CheckerManager;
 class CheckerRegistry;
 class CheckerRegistry;
 
 
 #define GET_CHECKERS
 #define GET_CHECKERS
-#define CHECKER(FULLNAME, CLASS, HELPTEXT)                                     \
+#define CHECKER(FULLNAME, CLASS, HELPTEXT, DOC_URI)                            \
   void register##CLASS(CheckerManager &mgr);
   void register##CLASS(CheckerManager &mgr);
 #include "clang/StaticAnalyzer/Checkers/Checkers.inc"
 #include "clang/StaticAnalyzer/Checkers/Checkers.inc"
 #undef CHECKER
 #undef CHECKER

+ 13 - 0
include/clang/StaticAnalyzer/Checkers/CheckerBase.td

@@ -32,6 +32,18 @@ class ParentPackage<Package P> { Package ParentPackage = P; }
 /// a '-help'-like command line option.
 /// a '-help'-like command line option.
 class HelpText<string text> { string HelpText = text; }
 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
 /// 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).
 /// 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,
 /// Note that a checker has a name (e.g.: 'NullDereference'), and a fullname,
@@ -40,5 +52,6 @@ class HelpText<string text> { string HelpText = text; }
 class Checker<string name = ""> {
 class Checker<string name = ""> {
   string      CheckerName = name;
   string      CheckerName = name;
   string      HelpText;
   string      HelpText;
+  bits<2>     Documentation;
   Package ParentPackage;
   Package ParentPackage;
 }
 }

+ 286 - 143
include/clang/StaticAnalyzer/Checkers/Checkers.td

@@ -102,84 +102,106 @@ def CloneDetectionAlpha : Package<"clone">, ParentPackage<Alpha>;
 let ParentPackage = Core in {
 let ParentPackage = Core in {
 
 
 def DereferenceChecker : Checker<"NullDereference">,
 def DereferenceChecker : Checker<"NullDereference">,
-  HelpText<"Check for dereferences of null pointers">;
+  HelpText<"Check for dereferences of null pointers">,
+  Documentation<HasDocumentation>;
 
 
 def CallAndMessageChecker : Checker<"CallAndMessage">,
 def CallAndMessageChecker : Checker<"CallAndMessage">,
   HelpText<"Check for logical errors for function calls and Objective-C "
   HelpText<"Check for logical errors for function calls and Objective-C "
            "message expressions (e.g., uninitialized arguments, null function "
            "message expressions (e.g., uninitialized arguments, null function "
-           "pointers)">;
+           "pointers)">,
+  Documentation<HasDocumentation>;
 
 
 def NonNullParamChecker : Checker<"NonNullParamChecker">,
 def NonNullParamChecker : Checker<"NonNullParamChecker">,
   HelpText<"Check for null pointers passed as arguments to a function whose "
   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">,
 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">,
 def DivZeroChecker : Checker<"DivideZero">,
-  HelpText<"Check for division by zero">;
+  HelpText<"Check for division by zero">,
+  Documentation<HasDocumentation>;
 
 
 def UndefResultChecker : Checker<"UndefinedBinaryOperatorResult">,
 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">,
 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">,
 def DynamicTypePropagation : Checker<"DynamicTypePropagation">,
-  HelpText<"Generate dynamic type information">;
+  HelpText<"Generate dynamic type information">,
+  Documentation<NotDocumented>;
 
 
 def NonnullGlobalConstantsChecker: Checker<"NonnilStringConstants">,
 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"
 } // end "core"
 
 
 let ParentPackage = CoreAlpha in {
 let ParentPackage = CoreAlpha in {
 
 
 def BoolAssignmentChecker : Checker<"BoolAssignment">,
 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">,
 def CastSizeChecker : Checker<"CastSize">,
   HelpText<"Check when casting a malloc'ed type T, whether the size is a "
   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">,
 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">,
 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">,
 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">,
 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">,
 def PointerArithChecker : Checker<"PointerArithm">,
   HelpText<"Check for pointer arithmetic on locations other than array "
   HelpText<"Check for pointer arithmetic on locations other than array "
-           "elements">;
+           "elements">,
+  Documentation<HasAlphaDocumentation>;
 
 
 def PointerSubChecker : Checker<"PointerSub">,
 def PointerSubChecker : Checker<"PointerSub">,
   HelpText<"Check for pointer subtractions on two pointers pointing to "
   HelpText<"Check for pointer subtractions on two pointers pointing to "
-           "different memory chunks">;
+           "different memory chunks">,
+  Documentation<HasAlphaDocumentation>;
 
 
 def SizeofPointerChecker : Checker<"SizeofPtr">,
 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">,
 def CallAndMessageUnInitRefArg : Checker<"CallAndMessageUnInitRefArg">,
   HelpText<"Check for logical errors for function calls and Objective-C "
   HelpText<"Check for logical errors for function calls and Objective-C "
            "message expressions (e.g., uninitialized arguments, null function "
            "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">,
 def TestAfterDivZeroChecker : Checker<"TestAfterDivZero">,
   HelpText<"Check for division by variable that is later compared against 0. "
   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">,
 def DynamicTypeChecker : Checker<"DynamicTypeChecker">,
   HelpText<"Check for cases where the dynamic and the static type of an object "
   HelpText<"Check for cases where the dynamic and the static type of an object "
-           "are unrelated.">;
+           "are unrelated.">,
+  Documentation<HasAlphaDocumentation>;
 
 
 def StackAddrAsyncEscapeChecker : Checker<"StackAddressAsyncEscape">,
 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"
 } // end "alpha.core"
 
 
@@ -187,33 +209,40 @@ let ParentPackage = Nullability in {
 
 
 def NullPassedToNonnullChecker : Checker<"NullPassedToNonnull">,
 def NullPassedToNonnullChecker : Checker<"NullPassedToNonnull">,
   HelpText<"Warns when a null pointer is passed to a pointer which has a "
   HelpText<"Warns when a null pointer is passed to a pointer which has a "
-           "_Nonnull type.">;
+           "_Nonnull type.">,
+  Documentation<HasDocumentation>;
 
 
 def NullReturnedFromNonnullChecker : Checker<"NullReturnedFromNonnull">,
 def NullReturnedFromNonnullChecker : Checker<"NullReturnedFromNonnull">,
   HelpText<"Warns when a null pointer is returned from a function that has "
   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">,
 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">,
 def NullablePassedToNonnullChecker : Checker<"NullablePassedToNonnull">,
   HelpText<"Warns when a nullable pointer is passed to a pointer which has a "
   HelpText<"Warns when a nullable pointer is passed to a pointer which has a "
-           "_Nonnull type.">;
+           "_Nonnull type.">,
+  Documentation<HasDocumentation>;
 
 
 def NullableReturnedFromNonnullChecker : Checker<"NullableReturnedFromNonnull">,
 def NullableReturnedFromNonnullChecker : Checker<"NullableReturnedFromNonnull">,
   HelpText<"Warns when a nullable pointer is returned from a function that has "
   HelpText<"Warns when a nullable pointer is returned from a function that has "
-           "_Nonnull return type.">;
+           "_Nonnull return type.">,
+  Documentation<NotDocumented>;
 
 
 } // end "nullability"
 } // end "nullability"
 
 
 let ParentPackage = APIModeling in {
 let ParentPackage = APIModeling in {
 
 
 def StdCLibraryFunctionsChecker : Checker<"StdCLibraryFunctions">,
 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">,
 def TrustNonnullChecker : Checker<"TrustNonnull">,
   HelpText<"Trust that returns from framework methods annotated with _Nonnull "
   HelpText<"Trust that returns from framework methods annotated with _Nonnull "
-           "are not null">;
+           "are not null">,
+  Documentation<NotDocumented>;
 
 
 } // end "apiModeling"
 } // end "apiModeling"
 
 
@@ -225,10 +254,12 @@ let ParentPackage = CoreBuiltin in {
 
 
 def NoReturnFunctionChecker : Checker<"NoReturnFunctions">,
 def NoReturnFunctionChecker : Checker<"NoReturnFunctions">,
   HelpText<"Evaluate \"panic\" functions that are known to not return to the "
   HelpText<"Evaluate \"panic\" functions that are known to not return to the "
-           "caller">;
+           "caller">,
+  Documentation<NotDocumented>;
 
 
 def BuiltinFunctionChecker : Checker<"BuiltinFunctions">,
 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"
 } // end "core.builtin"
 
 
@@ -239,19 +270,24 @@ def BuiltinFunctionChecker : Checker<"BuiltinFunctions">,
 let ParentPackage = CoreUninitialized in {
 let ParentPackage = CoreUninitialized in {
 
 
 def UndefinedArraySubscriptChecker : Checker<"ArraySubscript">,
 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">,
 def UndefinedAssignmentChecker : Checker<"Assign">,
-  HelpText<"Check for assigning uninitialized values">;
+  HelpText<"Check for assigning uninitialized values">,
+  Documentation<HasDocumentation>;
 
 
 def UndefBranchChecker : Checker<"Branch">,
 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">,
 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">,
 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"
 } // end "core.uninitialized"
 
 
@@ -263,27 +299,33 @@ let ParentPackage = Cplusplus in {
 
 
 def InnerPointerChecker : Checker<"InnerPointer">,
 def InnerPointerChecker : Checker<"InnerPointer">,
   HelpText<"Check for inner pointers of C++ containers used after "
   HelpText<"Check for inner pointers of C++ containers used after "
-           "re/deallocation">;
+           "re/deallocation">,
+  Documentation<NotDocumented>;
 
 
 def NewDeleteChecker : Checker<"NewDelete">,
 def NewDeleteChecker : Checker<"NewDelete">,
   HelpText<"Check for double-free and use-after-free problems. Traces memory "
   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">,
 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">,
 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">,
 def MoveChecker: Checker<"Move">,
-   HelpText<"Find use-after-move bugs in C++">;
+   HelpText<"Find use-after-move bugs in C++">,
+  Documentation<HasDocumentation>;
 
 
 } // end: "cplusplus"
 } // end: "cplusplus"
 
 
 let ParentPackage = CplusplusOptIn in {
 let ParentPackage = CplusplusOptIn in {
 
 
 def VirtualCallChecker : Checker<"VirtualCall">,
 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"
 } // end: "optin.cplusplus"
 
 
@@ -291,23 +333,29 @@ let ParentPackage = CplusplusAlpha in {
 
 
 def DeleteWithNonVirtualDtorChecker : Checker<"DeleteWithNonVirtualDtor">,
 def DeleteWithNonVirtualDtorChecker : Checker<"DeleteWithNonVirtualDtor">,
   HelpText<"Reports destructions of polymorphic objects with a non-virtual "
   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">,
 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">,
 def InvalidatedIteratorChecker : Checker<"InvalidatedIterator">,
-  HelpText<"Check for use of invalidated iterators">;
+  HelpText<"Check for use of invalidated iterators">,
+  Documentation<HasAlphaDocumentation>;
 
 
 def IteratorRangeChecker : Checker<"IteratorRange">,
 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">,
 def MismatchedIteratorChecker : Checker<"MismatchedIterator">,
   HelpText<"Check for use of iterators of different containers where iterators "
   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">,
 def UninitializedObjectChecker: Checker<"UninitializedObject">,
-     HelpText<"Reports uninitialized fields after object construction">;
+     HelpText<"Reports uninitialized fields after object construction">,
+  Documentation<HasAlphaDocumentation>;
 
 
 } // end: "alpha.cplusplus"
 } // end: "alpha.cplusplus"
 
 
@@ -319,13 +367,16 @@ def UninitializedObjectChecker: Checker<"UninitializedObject">,
 let ParentPackage = Valist in {
 let ParentPackage = Valist in {
 
 
 def UninitializedChecker : Checker<"Uninitialized">,
 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">,
 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">,
 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"
 } // end : "valist"
 
 
@@ -337,14 +388,16 @@ let ParentPackage = DeadCode in {
 
 
 def DeadStoresChecker : Checker<"DeadStores">,
 def DeadStoresChecker : Checker<"DeadStores">,
   HelpText<"Check for values stored to variables that are never read "
   HelpText<"Check for values stored to variables that are never read "
-           "afterwards">;
+           "afterwards">,
+  Documentation<HasDocumentation>;
 
 
 } // end DeadCode
 } // end DeadCode
 
 
 let ParentPackage = DeadCodeAlpha in {
 let ParentPackage = DeadCodeAlpha in {
 
 
 def UnreachableCodeChecker : Checker<"UnreachableCode">,
 def UnreachableCodeChecker : Checker<"UnreachableCode">,
-  HelpText<"Check unreachable code">;
+  HelpText<"Check unreachable code">,
+  Documentation<HasAlphaDocumentation>;
 
 
 } // end "alpha.deadcode"
 } // end "alpha.deadcode"
 
 
@@ -355,7 +408,8 @@ def UnreachableCodeChecker : Checker<"UnreachableCode">,
 let ParentPackage = Performance in {
 let ParentPackage = Performance in {
 
 
 def PaddingChecker : Checker<"Padding">,
 def PaddingChecker : Checker<"Padding">,
-  HelpText<"Check for excessively padded structs.">;
+  HelpText<"Check for excessively padded structs.">,
+  Documentation<NotDocumented>;
 
 
 } // end: "padding"
 } // end: "padding"
 
 
@@ -366,29 +420,40 @@ def PaddingChecker : Checker<"Padding">,
 let ParentPackage = InsecureAPI in {
 let ParentPackage = InsecureAPI in {
 
 
 def bcmp : Checker<"bcmp">,
 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">,
 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">,
 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">,
 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">,
 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">,
 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">,
 def mkstemp : Checker<"mkstemp">,
   HelpText<"Warn when 'mkstemp' is passed fewer than 6 X's in the format "
   HelpText<"Warn when 'mkstemp' is passed fewer than 6 X's in the format "
-           "string">;
+           "string">,
+  Documentation<HasDocumentation>;
 def rand : Checker<"rand">,
 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">,
 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">,
 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">,
 def UncheckedReturn : Checker<"UncheckedReturn">,
   HelpText<"Warn on uses of functions whose return values must be always "
   HelpText<"Warn on uses of functions whose return values must be always "
-           "checked">;
+           "checked">,
+  Documentation<HasDocumentation>;
 
 
 } // end "security.insecureAPI"
 } // end "security.insecureAPI"
 
 
@@ -396,29 +461,35 @@ let ParentPackage = Security in {
 
 
 def FloatLoopCounter : Checker<"FloatLoopCounter">,
 def FloatLoopCounter : Checker<"FloatLoopCounter">,
   HelpText<"Warn on using a floating point value as a loop counter (CERT: "
   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"
 } // end "security"
 
 
 let ParentPackage = SecurityAlpha in {
 let ParentPackage = SecurityAlpha in {
 
 
 def ArrayBoundChecker : Checker<"ArrayBound">,
 def ArrayBoundChecker : Checker<"ArrayBound">,
-  HelpText<"Warn about buffer overflows (older checker)">;
+  HelpText<"Warn about buffer overflows (older checker)">,
+  Documentation<HasAlphaDocumentation>;
 
 
 def ArrayBoundCheckerV2 : Checker<"ArrayBoundV2">,
 def ArrayBoundCheckerV2 : Checker<"ArrayBoundV2">,
-  HelpText<"Warn about buffer overflows (newer checker)">;
+  HelpText<"Warn about buffer overflows (newer checker)">,
+  Documentation<HasAlphaDocumentation>;
 
 
 def ReturnPointerRangeChecker : Checker<"ReturnPtrRange">,
 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">,
 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,
 // Operating systems specific PROT_READ/PROT_WRITE values is not implemented,
 // the defaults are correct for several common operating systems though,
 // the defaults are correct for several common operating systems though,
 // but may need to be overridden via the related analyzer-config flags.
 // but may need to be overridden via the related analyzer-config flags.
 def MmapWriteExecChecker : Checker<"MmapWriteExec">,
 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"
 } // end "alpha.security"
 
 
@@ -429,7 +500,8 @@ def MmapWriteExecChecker : Checker<"MmapWriteExec">,
 let ParentPackage = Taint in {
 let ParentPackage = Taint in {
 
 
 def GenericTaintChecker : Checker<"TaintPropagation">,
 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"
 } // end "alpha.security.taint"
 
 
@@ -440,39 +512,49 @@ def GenericTaintChecker : Checker<"TaintPropagation">,
 let ParentPackage = Unix in {
 let ParentPackage = Unix in {
 
 
 def UnixAPIMisuseChecker : Checker<"API">,
 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">,
 def MallocChecker: Checker<"Malloc">,
   HelpText<"Check for memory leaks, double free, and use-after-free problems. "
   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">,
 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">,
 def MismatchedDeallocatorChecker : Checker<"MismatchedDeallocator">,
-  HelpText<"Check for mismatched deallocators.">;
+  HelpText<"Check for mismatched deallocators.">,
+  Documentation<HasDocumentation>;
 
 
 def VforkChecker : Checker<"Vfork">,
 def VforkChecker : Checker<"Vfork">,
-  HelpText<"Check for proper usage of vfork">;
+  HelpText<"Check for proper usage of vfork">,
+  Documentation<HasDocumentation>;
 
 
 } // end "unix"
 } // end "unix"
 
 
 let ParentPackage = UnixAlpha in {
 let ParentPackage = UnixAlpha in {
 
 
 def ChrootChecker : Checker<"Chroot">,
 def ChrootChecker : Checker<"Chroot">,
-  HelpText<"Check improper use of chroot">;
+  HelpText<"Check improper use of chroot">,
+  Documentation<HasAlphaDocumentation>;
 
 
 def PthreadLockChecker : Checker<"PthreadLock">,
 def PthreadLockChecker : Checker<"PthreadLock">,
-  HelpText<"Simple lock -> unlock checker">;
+  HelpText<"Simple lock -> unlock checker">,
+  Documentation<HasAlphaDocumentation>;
 
 
 def StreamChecker : Checker<"Stream">,
 def StreamChecker : Checker<"Stream">,
-  HelpText<"Check stream handling functions">;
+  HelpText<"Check stream handling functions">,
+  Documentation<HasAlphaDocumentation>;
 
 
 def SimpleStreamChecker : Checker<"SimpleStream">,
 def SimpleStreamChecker : Checker<"SimpleStream">,
-  HelpText<"Check for misuses of stream APIs">;
+  HelpText<"Check for misuses of stream APIs">,
+  Documentation<HasAlphaDocumentation>;
 
 
 def BlockInCriticalSectionChecker : Checker<"BlockInCriticalSection">,
 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"
 } // end "alpha.unix"
 
 
@@ -480,24 +562,29 @@ let ParentPackage = CString in {
 
 
 def CStringNullArg : Checker<"NullArg">,
 def CStringNullArg : Checker<"NullArg">,
   HelpText<"Check for null pointers being passed as arguments to C string "
   HelpText<"Check for null pointers being passed as arguments to C string "
-           "functions">;
+           "functions">,
+  Documentation<HasDocumentation>;
 
 
 def CStringSyntaxChecker : Checker<"BadSizeArg">,
 def CStringSyntaxChecker : Checker<"BadSizeArg">,
   HelpText<"Check the size argument passed into C string functions for common "
   HelpText<"Check the size argument passed into C string functions for common "
-           "erroneous patterns">;
+           "erroneous patterns">,
+  Documentation<HasDocumentation>;
 
 
 } // end "unix.cstring"
 } // end "unix.cstring"
 
 
 let ParentPackage = CStringAlpha in {
 let ParentPackage = CStringAlpha in {
 
 
 def CStringOutOfBounds : Checker<"OutOfBounds">,
 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">,
 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">,
 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"
 } // end "alpha.unix.cstring"
 
 
@@ -509,19 +596,24 @@ let ParentPackage = OSX in {
 
 
 def NumberObjectConversionChecker : Checker<"NumberObjectConversion">,
 def NumberObjectConversionChecker : Checker<"NumberObjectConversion">,
   HelpText<"Check for erroneous conversions of objects representing numbers "
   HelpText<"Check for erroneous conversions of objects representing numbers "
-           "into numbers">;
+           "into numbers">,
+  Documentation<NotDocumented>;
 
 
 def MacOSXAPIChecker : Checker<"API">,
 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">,
 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">,
 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">,
 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"
 } // end "osx"
 
 
@@ -529,66 +621,84 @@ let ParentPackage = Cocoa in {
 
 
 def RunLoopAutoreleaseLeakChecker : Checker<"RunLoopAutoreleaseLeak">,
 def RunLoopAutoreleaseLeakChecker : Checker<"RunLoopAutoreleaseLeak">,
   HelpText<"Check for leaked memory in autorelease pools that will never be "
   HelpText<"Check for leaked memory in autorelease pools that will never be "
-           "drained">;
+           "drained">,
+  Documentation<NotDocumented>;
 
 
 def ObjCAtSyncChecker : Checker<"AtSync">,
 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">,
 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">,
 def ClassReleaseChecker : Checker<"ClassRelease">,
   HelpText<"Check for sending 'retain', 'release', or 'autorelease' directly "
   HelpText<"Check for sending 'retain', 'release', or 'autorelease' directly "
-           "to a Class">;
+           "to a Class">,
+  Documentation<HasDocumentation>;
 
 
 def VariadicMethodTypeChecker : Checker<"VariadicMethodTypes">,
 def VariadicMethodTypeChecker : Checker<"VariadicMethodTypes">,
   HelpText<"Check for passing non-Objective-C types to variadic collection "
   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">,
 def NSAutoreleasePoolChecker : Checker<"NSAutoreleasePool">,
   HelpText<"Warn for suboptimal uses of NSAutoreleasePool in Objective-C GC "
   HelpText<"Warn for suboptimal uses of NSAutoreleasePool in Objective-C GC "
-           "mode">;
+           "mode">,
+  Documentation<HasDocumentation>;
 
 
 def ObjCMethSigsChecker : Checker<"IncompatibleMethodTypes">,
 def ObjCMethSigsChecker : Checker<"IncompatibleMethodTypes">,
   HelpText<"Warn about Objective-C method signatures with type "
   HelpText<"Warn about Objective-C method signatures with type "
-           "incompatibilities">;
+           "incompatibilities">,
+  Documentation<HasDocumentation>;
 
 
 def ObjCUnusedIvarsChecker : Checker<"UnusedIvars">,
 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">,
 def ObjCSelfInitChecker : Checker<"SelfInit">,
   HelpText<"Check that 'self' is properly initialized inside an initializer "
   HelpText<"Check that 'self' is properly initialized inside an initializer "
-           "method">;
+           "method">,
+  Documentation<HasDocumentation>;
 
 
 def ObjCLoopChecker : Checker<"Loops">,
 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">,
 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">,
 def ObjCSuperCallChecker : Checker<"MissingSuperCall">,
   HelpText<"Warn about Objective-C methods that lack a necessary call to "
   HelpText<"Warn about Objective-C methods that lack a necessary call to "
-           "super">;
+           "super">,
+  Documentation<NotDocumented>;
 
 
 def NSErrorChecker : Checker<"NSError">,
 def NSErrorChecker : Checker<"NSError">,
-  HelpText<"Check usage of NSError** parameters">;
+  HelpText<"Check usage of NSError** parameters">,
+  Documentation<HasDocumentation>;
 
 
 def RetainCountChecker : Checker<"RetainCount">,
 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">,
 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">,
 def ObjCDeallocChecker : Checker<"Dealloc">,
   HelpText<"Warn about Objective-C classes that lack a correct implementation "
   HelpText<"Warn about Objective-C classes that lack a correct implementation "
-           "of -dealloc">;
+           "of -dealloc">,
+  Documentation<HasDocumentation>;
 
 
 def ObjCSuperDeallocChecker : Checker<"SuperDealloc">,
 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">,
 def AutoreleaseWriteChecker : Checker<"AutoreleaseWrite">,
   HelpText<"Warn about potentially crashing writes to autoreleasing objects "
   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"
 } // end "osx.cocoa"
 
 
@@ -596,39 +706,47 @@ let ParentPackage = Performance in {
 
 
 def GCDAntipattern : Checker<"GCDAntipattern">,
 def GCDAntipattern : Checker<"GCDAntipattern">,
   HelpText<"Check for performance anti-patterns when using Grand Central "
   HelpText<"Check for performance anti-patterns when using Grand Central "
-           "Dispatch">;
+           "Dispatch">,
+  Documentation<NotDocumented>;
 } // end "optin.performance"
 } // end "optin.performance"
 
 
 let ParentPackage = CocoaAlpha in {
 let ParentPackage = CocoaAlpha in {
 
 
 def InstanceVariableInvalidation : Checker<"InstanceVariableInvalidation">,
 def InstanceVariableInvalidation : Checker<"InstanceVariableInvalidation">,
   HelpText<"Check that the invalidatable instance variables are invalidated in "
   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">,
 def MissingInvalidationMethod : Checker<"MissingInvalidationMethod">,
   HelpText<"Check that the invalidation methods are present in classes that "
   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">,
 def DirectIvarAssignment : Checker<"DirectIvarAssignment">,
-  HelpText<"Check for direct assignments to instance variables">;
+  HelpText<"Check for direct assignments to instance variables">,
+  Documentation<HasAlphaDocumentation>;
 
 
 def DirectIvarAssignmentForAnnotatedFunctions :
 def DirectIvarAssignmentForAnnotatedFunctions :
   Checker<"DirectIvarAssignmentForAnnotatedFunctions">,
   Checker<"DirectIvarAssignmentForAnnotatedFunctions">,
   HelpText<"Check for direct assignments to instance variables in the methods "
   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"
 } // end "alpha.osx.cocoa"
 
 
 let ParentPackage = CoreFoundation in {
 let ParentPackage = CoreFoundation in {
 
 
 def CFNumberChecker : Checker<"CFNumber">,
 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">,
 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">,
 def CFErrorChecker : Checker<"CFError">,
-  HelpText<"Check usage of CFErrorRef* parameters">;
+  HelpText<"Check usage of CFErrorRef* parameters">,
+  Documentation<HasDocumentation>;
 
 
 } // end "osx.coreFoundation"
 } // end "osx.coreFoundation"
 
 
@@ -636,10 +754,12 @@ let ParentPackage = Containers in {
 
 
 def ObjCContainersASTChecker : Checker<"PointerSizedValues">,
 def ObjCContainersASTChecker : Checker<"PointerSizedValues">,
   HelpText<"Warns if 'CFArray', 'CFDictionary', 'CFSet' are created with "
   HelpText<"Warns if 'CFArray', 'CFDictionary', 'CFSet' are created with "
-           "non-pointer-size values">;
+           "non-pointer-size values">,
+  Documentation<HasDocumentation>;
 
 
 def ObjCContainersChecker : Checker<"OutOfBounds">,
 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"
 } // end "osx.coreFoundation.containers"
 
 
@@ -647,11 +767,13 @@ let ParentPackage = LocalizabilityOptIn in {
 
 
 def NonLocalizedStringChecker : Checker<"NonLocalizedStringChecker">,
 def NonLocalizedStringChecker : Checker<"NonLocalizedStringChecker">,
   HelpText<"Warns about uses of non-localized NSStrings passed to UI methods "
   HelpText<"Warns about uses of non-localized NSStrings passed to UI methods "
-           "expecting localized NSStrings">;
+           "expecting localized NSStrings">,
+  Documentation<HasDocumentation>;
 
 
 def EmptyLocalizationContextChecker :
 def EmptyLocalizationContextChecker :
   Checker<"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"
 } // end "optin.osx.cocoa.localizability"
 
 
@@ -659,14 +781,16 @@ let ParentPackage = LocalizabilityAlpha in {
 
 
 def PluralMisuseChecker : Checker<"PluralMisuseChecker">,
 def PluralMisuseChecker : Checker<"PluralMisuseChecker">,
   HelpText<"Warns against using one vs. many plural pattern in code when "
   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"
 } // end "alpha.osx.cocoa.localizability"
 
 
 let ParentPackage = MPI in {
 let ParentPackage = MPI in {
 
 
 def MPIChecker : Checker<"MPI-Checker">,
 def MPIChecker : Checker<"MPI-Checker">,
-  HelpText<"Checks MPI code">;
+  HelpText<"Checks MPI code">,
+  Documentation<HasDocumentation>;
 
 
 } // end "optin.mpi"
 } // end "optin.mpi"
 
 
@@ -677,7 +801,8 @@ def MPIChecker : Checker<"MPI-Checker">,
 let ParentPackage = LLVMAlpha in {
 let ParentPackage = LLVMAlpha in {
 
 
 def LLVMConventionsChecker : Checker<"Conventions">,
 def LLVMConventionsChecker : Checker<"Conventions">,
-  HelpText<"Check code for LLVM codebase conventions">;
+  HelpText<"Check code for LLVM codebase conventions">,
+  Documentation<HasAlphaDocumentation>;
 
 
 } // end "llvm"
 } // end "llvm"
 
 
@@ -688,7 +813,8 @@ def LLVMConventionsChecker : Checker<"Conventions">,
 let ParentPackage = GoogleAPIModeling in {
 let ParentPackage = GoogleAPIModeling in {
 
 
 def GTestChecker : Checker<"GTest">,
 def GTestChecker : Checker<"GTest">,
-  HelpText<"Model gtest assertion APIs">;
+  HelpText<"Model gtest assertion APIs">,
+  Documentation<NotDocumented>;
 
 
 } // end "apiModeling.google"
 } // end "apiModeling.google"
 
 
@@ -699,49 +825,64 @@ def GTestChecker : Checker<"GTest">,
 let ParentPackage = Debug in {
 let ParentPackage = Debug in {
 
 
 def AnalysisOrderChecker : Checker<"AnalysisOrder">,
 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">,
 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">,
 def LiveVariablesDumper : Checker<"DumpLiveVars">,
-  HelpText<"Print results of live variable analysis">;
+  HelpText<"Print results of live variable analysis">,
+  Documentation<NotDocumented>;
 
 
 def LiveStatementsDumper : Checker<"DumpLiveStmts">,
 def LiveStatementsDumper : Checker<"DumpLiveStmts">,
-  HelpText<"Print results of live statement analysis">;
+  HelpText<"Print results of live statement analysis">,
+  Documentation<NotDocumented>;
 
 
 def CFGViewer : Checker<"ViewCFG">,
 def CFGViewer : Checker<"ViewCFG">,
-  HelpText<"View Control-Flow Graphs using GraphViz">;
+  HelpText<"View Control-Flow Graphs using GraphViz">,
+  Documentation<NotDocumented>;
 
 
 def CFGDumper : Checker<"DumpCFG">,
 def CFGDumper : Checker<"DumpCFG">,
-  HelpText<"Display Control-Flow Graphs">;
+  HelpText<"Display Control-Flow Graphs">,
+  Documentation<NotDocumented>;
 
 
 def CallGraphViewer : Checker<"ViewCallGraph">,
 def CallGraphViewer : Checker<"ViewCallGraph">,
-  HelpText<"View Call Graph using GraphViz">;
+  HelpText<"View Call Graph using GraphViz">,
+  Documentation<NotDocumented>;
 
 
 def CallGraphDumper : Checker<"DumpCallGraph">,
 def CallGraphDumper : Checker<"DumpCallGraph">,
-  HelpText<"Display Call Graph">;
+  HelpText<"Display Call Graph">,
+  Documentation<NotDocumented>;
 
 
 def ConfigDumper : Checker<"ConfigDumper">,
 def ConfigDumper : Checker<"ConfigDumper">,
-  HelpText<"Dump config table">;
+  HelpText<"Dump config table">,
+  Documentation<NotDocumented>;
 
 
 def TraversalDumper : Checker<"DumpTraversal">,
 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">,
 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">,
 def AnalyzerStatsChecker : Checker<"Stats">,
-  HelpText<"Emit warnings with analyzer statistics">;
+  HelpText<"Emit warnings with analyzer statistics">,
+  Documentation<NotDocumented>;
 
 
 def TaintTesterChecker : Checker<"TaintTest">,
 def TaintTesterChecker : Checker<"TaintTest">,
-  HelpText<"Mark tainted symbols as such.">;
+  HelpText<"Mark tainted symbols as such.">,
+  Documentation<NotDocumented>;
 
 
 def ExprInspectionChecker : Checker<"ExprInspection">,
 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">,
 def ExplodedGraphViewer : Checker<"ViewExplodedGraph">,
-  HelpText<"View Exploded Graphs using GraphViz">;
+  HelpText<"View Exploded Graphs using GraphViz">,
+  Documentation<NotDocumented>;
 
 
 } // end "debug"
 } // end "debug"
 
 
@@ -753,7 +894,8 @@ def ExplodedGraphViewer : Checker<"ViewExplodedGraph">,
 let ParentPackage = CloneDetectionAlpha in {
 let ParentPackage = CloneDetectionAlpha in {
 
 
 def CloneChecker : Checker<"CloneChecker">,
 def CloneChecker : Checker<"CloneChecker">,
-  HelpText<"Reports similar pieces of code.">;
+  HelpText<"Reports similar pieces of code.">,
+  Documentation<HasAlphaDocumentation>;
 
 
 } // end "clone"
 } // end "clone"
 
 
@@ -764,6 +906,7 @@ def CloneChecker : Checker<"CloneChecker">,
 let ParentPackage = PortabilityOptIn in {
 let ParentPackage = PortabilityOptIn in {
 
 
 def UnixAPIPortabilityChecker : Checker<"UnixAPI">,
 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
 } // end optin.portability

+ 9 - 6
include/clang/StaticAnalyzer/Frontend/CheckerRegistry.h

@@ -91,9 +91,12 @@ public:
     InitializationFunction Initialize;
     InitializationFunction Initialize;
     StringRef FullName;
     StringRef FullName;
     StringRef Desc;
     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>;
   using CheckerInfoList = std::vector<CheckerInfo>;
@@ -108,16 +111,16 @@ private:
 public:
 public:
   /// Adds a checker to the registry. Use this non-templated overload when your
   /// Adds a checker to the registry. Use this non-templated overload when your
   /// checker requires custom initialization.
   /// 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
   /// Adds a checker to the registry. Use this templated overload when your
   /// checker does not require any custom initialization.
   /// checker does not require any custom initialization.
   template <class T>
   template <class T>
-  void addChecker(StringRef fullName, StringRef desc) {
+  void addChecker(StringRef FullName, StringRef Desc, StringRef DocsUri) {
     // Avoid MSVC's Compiler Error C2276:
     // Avoid MSVC's Compiler Error C2276:
     // http://msdn.microsoft.com/en-us/library/850cstw1(v=VS.80).aspx
     // 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
   /// Initializes a CheckerManager by calling the initialization functions for

+ 1 - 1
lib/StaticAnalyzer/Core/AnalyzerOptions.cpp

@@ -34,7 +34,7 @@ std::vector<StringRef>
 AnalyzerOptions::getRegisteredCheckers(bool IncludeExperimental /* = false */) {
 AnalyzerOptions::getRegisteredCheckers(bool IncludeExperimental /* = false */) {
   static const StringRef StaticAnalyzerChecks[] = {
   static const StringRef StaticAnalyzerChecks[] = {
 #define GET_CHECKERS
 #define GET_CHECKERS
-#define CHECKER(FULLNAME, CLASS, HELPTEXT)                                     \
+#define CHECKER(FULLNAME, CLASS, HELPTEXT, DOC_URI)                            \
   FULLNAME,
   FULLNAME,
 #include "clang/StaticAnalyzer/Checkers/Checkers.inc"
 #include "clang/StaticAnalyzer/Checkers/Checkers.inc"
 #undef CHECKER
 #undef CHECKER

+ 19 - 2
lib/StaticAnalyzer/Core/SarifDiagnostics.cpp

@@ -257,7 +257,7 @@ static json::Object createResult(const PathDiagnostic &Diag, json::Array &Files,
 static StringRef getRuleDescription(StringRef CheckName) {
 static StringRef getRuleDescription(StringRef CheckName) {
   return llvm::StringSwitch<StringRef>(CheckName)
   return llvm::StringSwitch<StringRef>(CheckName)
 #define GET_CHECKERS
 #define GET_CHECKERS
-#define CHECKER(FULLNAME, CLASS, HELPTEXT)                                     \
+#define CHECKER(FULLNAME, CLASS, HELPTEXT, DOC_URI)                            \
   .Case(FULLNAME, HELPTEXT)
   .Case(FULLNAME, HELPTEXT)
 #include "clang/StaticAnalyzer/Checkers/Checkers.inc"
 #include "clang/StaticAnalyzer/Checkers/Checkers.inc"
 #undef CHECKER
 #undef CHECKER
@@ -265,12 +265,29 @@ static StringRef getRuleDescription(StringRef CheckName) {
       ;
       ;
 }
 }
 
 
+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) {
 static json::Object createRule(const PathDiagnostic &Diag) {
   StringRef CheckName = Diag.getCheckName();
   StringRef CheckName = Diag.getCheckName();
-  return json::Object{
+  json::Object Ret{
       {"fullDescription", createMessage(getRuleDescription(CheckName))},
       {"fullDescription", createMessage(getRuleDescription(CheckName))},
       {"name", createMessage(CheckName)},
       {"name", createMessage(CheckName)},
       {"id", 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,
 static json::Array createRules(std::vector<const PathDiagnostic *> &Diags,

+ 7 - 7
lib/StaticAnalyzer/Frontend/CheckerRegistry.cpp

@@ -42,8 +42,8 @@ static bool isCompatibleAPIVersion(const char *versionString) {
 CheckerRegistry::CheckerRegistry(ArrayRef<std::string> plugins,
 CheckerRegistry::CheckerRegistry(ArrayRef<std::string> plugins,
                                  DiagnosticsEngine &diags) : Diags(diags) {
                                  DiagnosticsEngine &diags) : Diags(diags) {
 #define GET_CHECKERS
 #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"
 #include "clang/StaticAnalyzer/Checkers/Checkers.inc"
 #undef CHECKER
 #undef CHECKER
 #undef GET_CHECKERS
 #undef GET_CHECKERS
@@ -115,7 +115,7 @@ CheckerRegistry::CheckerInfoSet CheckerRegistry::getEnabledCheckers(
 
 
   for (const std::pair<std::string, bool> &opt : Opts.CheckersControlList) {
   for (const std::pair<std::string, bool> &opt : Opts.CheckersControlList) {
     // Use a binary search to find the possible start of the package.
     // 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 =
     auto firstRelatedChecker =
       std::lower_bound(Checkers.cbegin(), end, packageInfo, checkerNameLT);
       std::lower_bound(Checkers.cbegin(), end, packageInfo, checkerNameLT);
 
 
@@ -147,13 +147,13 @@ CheckerRegistry::CheckerInfoSet CheckerRegistry::getEnabledCheckers(
   return enabledCheckers;
   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.
   // Record the presence of the checker in its packages.
   StringRef packageName, leafName;
   StringRef packageName, leafName;
-  std::tie(packageName, leafName) = name.rsplit(PackageSeparator);
+  std::tie(packageName, leafName) = Name.rsplit(PackageSeparator);
   while (!leafName.empty()) {
   while (!leafName.empty()) {
     Packages[packageName] += 1;
     Packages[packageName] += 1;
     std::tie(packageName, leafName) = packageName.rsplit(PackageSeparator);
     std::tie(packageName, leafName) = packageName.rsplit(PackageSeparator);

+ 2 - 0
test/Analysis/diagnostics/Inputs/expected-sarif/sarif-multi-diagnostic-test.c.sarif

@@ -29,6 +29,7 @@
             "fullDescription": {
             "fullDescription": {
               "text": "Check for logical errors for function calls and Objective-C message expressions (e.g., uninitialized arguments, null function pointers)"
               "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",
             "id": "core.CallAndMessage",
             "name": {
             "name": {
               "text": "core.CallAndMessage"
               "text": "core.CallAndMessage"
@@ -38,6 +39,7 @@
             "fullDescription": {
             "fullDescription": {
               "text": "Check for division by zero"
               "text": "Check for division by zero"
             },
             },
+            "helpURI": "https://clang-analyzer.llvm.org/available_checks.html#core.DivideZero",
             "id": "core.DivideZero",
             "id": "core.DivideZero",
             "name": {
             "name": {
               "text": "core.DivideZero"
               "text": "core.DivideZero"

+ 37 - 1
utils/TableGen/ClangSACheckersEmitter.cpp

@@ -57,6 +57,36 @@ static std::string getStringValue(const Record &R, StringRef field) {
   return std::string();
   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 {
 namespace clang {
 void EmitClangSACheckers(RecordKeeper &Records, raw_ostream &OS) {
 void EmitClangSACheckers(RecordKeeper &Records, raw_ostream &OS) {
   std::vector<Record*> checkers = Records.getAllDerivedDefinitions("Checker");
   std::vector<Record*> checkers = Records.getAllDerivedDefinitions("Checker");
@@ -64,6 +94,9 @@ void EmitClangSACheckers(RecordKeeper &Records, raw_ostream &OS) {
 
 
   using SortedRecords = llvm::StringMap<const Record *>;
   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";
   OS << "\n#ifdef GET_PACKAGES\n";
   {
   {
     SortedRecords sortedPackages;
     SortedRecords sortedPackages;
@@ -89,7 +122,10 @@ void EmitClangSACheckers(RecordKeeper &Records, raw_ostream &OS) {
     OS.write_escaped(getCheckerFullName(&R)) << "\", ";
     OS.write_escaped(getCheckerFullName(&R)) << "\", ";
     OS << R.getName() << ", ";
     OS << R.getName() << ", ";
     OS << "\"";
     OS << "\"";
-    OS.write_escaped(getStringValue(R, "HelpText")) << '\"';
+    OS.write_escaped(getStringValue(R, "HelpText")) << "\", ";
+    OS << "\"";
+    OS.write_escaped(getCheckerDocs(R));
+    OS << "\"";
     OS << ")\n";
     OS << ")\n";
   }
   }
   OS << "#endif // GET_CHECKERS\n\n";
   OS << "#endif // GET_CHECKERS\n\n";

+ 117 - 117
www/analyzer/alpha_checks.html

@@ -43,10 +43,10 @@ Patches welcome!
 <thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
 <thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
 
 
 <tbody>
 <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">
 alpha.clone.CloneChecker</span><span class="lang">
 (C, C++, ObjC)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void log();
 void log();
@@ -74,10 +74,10 @@ int maxClone(int x, int y) { // similar code here
 <thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
 <thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
 
 
 <tbody>
 <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">
 alpha.core.BoolAssignment</span><span class="lang">
 (ObjC)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -86,11 +86,11 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 alpha.core.CallAndMessageUnInitRefArg</span><span class="lang">
 (C, C++)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test(void) {
 void test(void) {
@@ -109,13 +109,13 @@ void test(void) {
 </pre></div></div></td></tr>
 </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">
 alpha.core.CastSize</span><span class="lang">
 (C)</span><div class="descr">
 (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>
 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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -124,10 +124,10 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 alpha.core.CastToStruct</span><span class="lang">
 (C, C++)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 // C
 // C
@@ -147,10 +147,10 @@ void test(int *p) {
 </pre></div></div></td></tr>
 </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">
 alpha.core.Conversion</span><span class="lang">
 (C, C++, ObjC)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test(unsigned U, signed S) {
 void test(unsigned U, signed S) {
@@ -172,26 +172,26 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 alpha.core.DynamicTypeChecker</span><span class="lang">
 (ObjC)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 id date = [NSDate date];
 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 *'"
 // incompatible with static type 'NSNumber *'"
 NSNumber *number = date;
 NSNumber *number = date;
 [number doubleValue];
 [number doubleValue];
 </pre></div></div></td></tr>
 </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">
 alpha.core.FixedAddr</span><span class="lang">
 (C)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -201,10 +201,10 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 alpha.core.IdenticalExpr</span><span class="lang">
 (C, C++)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 // C
 // C
@@ -232,11 +232,11 @@ void test(bool b) {
 </pre></div></div></td></tr>
 </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">
 alpha.core.PointerArithm</span><span class="lang">
 (C)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -247,11 +247,11 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 alpha.core.PointerSub</span><span class="lang">
 (C)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -261,60 +261,60 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 alpha.core.SizeofPtr</span><span class="lang">
 (C)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 struct s {};
 struct s {};
 
 
 int test(struct s *p) {
 int test(struct s *p) {
-  return sizeof(p); 
+  return sizeof(p);
     // warn: sizeof(ptr) can produce an unexpected result
     // warn: sizeof(ptr) can produce an unexpected result
 }
 }
 </pre></div></div></td></tr>
 </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">
 alpha.core.StackAddressAsyncEscape</span><span class="lang">
 (C)</span><div class="descr">
 (C)</span><div class="descr">
 Check that addresses to stack memory do not escape the function that involves
 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
 <code>dispatch_after</code> or <code>dispatch_async</code>. This checker is
 a part of core.StackAddressEscape, but is
 a part of core.StackAddressEscape, but is
 <a href=https://reviews.llvm.org/D41042>temporarily disabled</a> until some
 <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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 dispatch_block_t test_block_inside_block_async_leak() {
 dispatch_block_t test_block_inside_block_async_leak() {
   int x = 123;
   int x = 123;
   void (^inner)(void) = ^void(void) {
   void (^inner)(void) = ^void(void) {
     int y = x;
     int y = x;
-    ++y; 
+    ++y;
   };
   };
   void (^outer)(void) = ^void(void) {
   void (^outer)(void) = ^void(void) {
     int z = x;
     int z = x;
     ++z;
     ++z;
-    inner(); 
-  }; 
+    inner();
+  };
   return outer; // warn: address of stack-allocated block is captured by a
   return outer; // warn: address of stack-allocated block is captured by a
                 //       returned block
                 //       returned block
 }
 }
 </pre></div></div></td></tr>
 </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">
 alpha.core.TestAfterDivZero</span><span class="lang">
 (C, C++, ObjC)</span><div class="descr">
 (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.
 Either the comparison is useless or there is division by zero.
-</div></div></td>
+</div></div></a></td>
 <td><div class="exampleContainer expandable">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test(int x) {
 void test(int x) {
   var = 77 / x;
   var = 77 / x;
-  if (x == 0) { } // warn 
+  if (x == 0) { } // warn
 }
 }
 </pre></div></div></td></tr>
 </pre></div></div></td></tr>
 
 
@@ -329,12 +329,12 @@ void test(int x) {
 <tbody>
 <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">
 alpha.cplusplus.DeleteWithNonVirtualDtor</span><span class="lang">
 (C++)</span><div class="descr">
 (C++)</span><div class="descr">
 Reports destructions of polymorphic objects with a non-virtual destructor in
 Reports destructions of polymorphic objects with a non-virtual destructor in
 their base class
 their base class
-</div></div></td>
+</div></div></a></td>
 <td><div class="exampleContainer expandable">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 NonVirtual *create() {
 NonVirtual *create() {
@@ -349,11 +349,11 @@ void sink(NonVirtual *x) {
 }
 }
 </pre></div></div></td></tr>
 </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">
 alpha.cplusplus.EnumCastOutOfRange</span><span class="lang">
 (C++)</span><div class="descr">
 (C++)</span><div class="descr">
   Check for integer to enumeration casts that could result in undefined values.
   Check for integer to enumeration casts that could result in undefined values.
-</div></div></td>
+</div></div></a></td>
   <td><div class="exampleContainer expandable">
   <td><div class="exampleContainer expandable">
     <div class="example"><pre>
     <div class="example"><pre>
 enum TestEnum {
 enum TestEnum {
@@ -368,11 +368,11 @@ void foo() {
 </pre></div></div></td></tr>
 </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">
 alpha.cplusplus.InvalidatedIterator</span><span class="lang">
 (C++)</span><div class="descr">
 (C++)</span><div class="descr">
 Check for use of invalidated iterators.
 Check for use of invalidated iterators.
-</div></div></td>
+</div></div></a></td>
 <td><div class="exampleContainer expandable">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void bad_copy_assign_operator_list1(std::list<int> &L1,
 void bad_copy_assign_operator_list1(std::list<int> &L1,
@@ -384,11 +384,11 @@ void bad_copy_assign_operator_list1(std::list<int> &L1,
 </pre></div></div></td></tr>
 </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">
 alpha.cplusplus.IteratorRange</span><span class="lang">
 (C++)</span><div class="descr">
 (C++)</span><div class="descr">
 Check for iterators used outside their valid ranges.
 Check for iterators used outside their valid ranges.
-</div></div></td>
+</div></div></a></td>
 <td><div class="exampleContainer expandable">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void simple_bad_end(const std::vector<int> &v) {
 void simple_bad_end(const std::vector<int> &v) {
@@ -398,12 +398,12 @@ void simple_bad_end(const std::vector<int> &v) {
 </pre></div></div></td></tr>
 </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">
 alpha.cplusplus.MismatchedIterator</span><span class="lang">
 (C++)</span><div class="descr">
 (C++)</span><div class="descr">
 Check for use of iterators of different containers where iterators of the same
 Check for use of iterators of different containers where iterators of the same
 container are expected.
 container are expected.
-</div></div></td>
+</div></div></a></td>
 <td><div class="exampleContainer expandable">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void bad_insert3(std::vector<int> &v1, std::vector<int> &v2) {
 void bad_insert3(std::vector<int> &v1, std::vector<int> &v2) {
@@ -424,12 +424,12 @@ void bad_insert3(std::vector<int> &v1, std::vector<int> &v2) {
 </pre></div></div></td></tr>
 </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">
 (C++)</span><div class="descr">
 Method calls on a moved-from object and copying a moved-from object will be
 Method calls on a moved-from object and copying a moved-from object will be
 reported.
 reported.
-</div></div></td>
+</div></div></a></td>
 <td><div class="exampleContainer expandable">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 struct A {
 struct A {
@@ -444,7 +444,7 @@ void f() {
 </pre></div></div></td></tr>
 </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">
 alpha.cplusplus.UninitializedObject</span><span class="lang">
 (C++)</span><div class="descr">
 (C++)</span><div class="descr">
 This checker reports uninitialized fields in objects created after a constructor
 This checker reports uninitialized fields in objects created after a constructor
@@ -481,7 +481,7 @@ It has several options:
 
 
     <code>-analyzer-config alpha.cplusplus.UninitializedObject:IgnoreRecordsWithField="[Tt]ag|[Kk]ind"</code>.
     <code>-analyzer-config alpha.cplusplus.UninitializedObject:IgnoreRecordsWithField="[Tt]ag|[Kk]ind"</code>.
   </li>
   </li>
-</ul></div></div></td>
+</ul></div></div></a></td>
 <td><div class="exampleContainer expandable">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 // With Pedantic and CheckPointeeInitialization set to true
 // With Pedantic and CheckPointeeInitialization set to true
@@ -568,10 +568,10 @@ void f() {
 <thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
 <thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
 
 
 <tbody>
 <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">
 alpha.deadcode.UnreachableCode</span><span class="lang">
 (C, C++, ObjC)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 // C
 // C
@@ -609,7 +609,7 @@ void test(id x) {
 <thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
 <thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
 
 
 <tbody>
 <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">
 alpha.llvm.Conventions</span><span class="lang">
 (C)</span><div class="descr">
 (C)</span><div class="descr">
 Check code for LLVM codebase conventions:
 Check code for LLVM codebase conventions:
@@ -618,7 +618,7 @@ Check code for LLVM codebase conventions:
   whose lifetime is shorter than the <code>StringRef</code>'s.</li>
   whose lifetime is shorter than the <code>StringRef</code>'s.</li>
   <li>Clang AST nodes should not have fields that can allocate memory.</li>
   <li>Clang AST nodes should not have fields that can allocate memory.</li>
 </ul>
 </ul>
-</div></div></td>
+</div></div></a></td>
 <td><div class="exampleContainer expandable">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 <!-- TODO: Add examples, as currently it's hard to get this checker working. -->
 <!-- TODO: Add examples, as currently it's hard to get this checker working. -->
@@ -634,11 +634,11 @@ Check code for LLVM codebase conventions:
 <thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
 <thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
 
 
 <tbody>
 <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">
 alpha.osx.cocoa.DirectIvarAssignment</span><span class="lang">
 (ObjC)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 @interface MyClass : NSObject {}
 @interface MyClass : NSObject {}
@@ -654,11 +654,11 @@ should be set with the setter, not though a direct assignment.</div></div></td>
 </pre></div></div></td></tr>
 </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">
 alpha.osx.cocoa.DirectIvarAssignmentForAnnotatedFunctions</span><span class="lang">
 (ObjC)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 @interface MyClass : NSObject {}
 @interface MyClass : NSObject {}
@@ -679,17 +679,17 @@ with <code>objc_no_direct_instance_variable_assignment</code>.</div></div></td>
 </pre></div></div></td></tr>
 </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">
 alpha.osx.cocoa.InstanceVariableInvalidation</span><span class="lang">
 (ObjC)</span><div class="descr">
 (ObjC)</span><div class="descr">
 Check that the invalidatable instance variables are invalidated in the methods
 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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 @protocol Invalidation &lt;NSObject&gt;
 @protocol Invalidation &lt;NSObject&gt;
-- (void) invalidate 
+- (void) invalidate
   __attribute__((annotate("objc_instance_variable_invalidator")));
   __attribute__((annotate("objc_instance_variable_invalidator")));
-@end 
+@end
 
 
 @interface InvalidationImpObj : NSObject &lt;Invalidation&gt;
 @interface InvalidationImpObj : NSObject &lt;Invalidation&gt;
 @end
 @end
@@ -707,15 +707,15 @@ annotated with <code>objc_instance_variable_invalidator</code>.</div></div></td>
 </pre></div></div></td></tr>
 </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">
 alpha.osx.cocoa.MissingInvalidationMethod</span><span class="lang">
 (ObjC)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 @protocol Invalidation &lt;NSObject&gt;
 @protocol Invalidation &lt;NSObject&gt;
-- (void)invalidate 
+- (void)invalidate
   __attribute__((annotate("objc_instance_variable_invalidator")));
   __attribute__((annotate("objc_instance_variable_invalidator")));
 @end
 @end
 
 
@@ -732,25 +732,25 @@ invalidatable instance variables.</div></div></td>
 </pre></div></div></td></tr>
 </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">
 alpha.osx.cocoa.localizability.PluralMisuseChecker</span><span class="lang">
 (ObjC)</span><div class="descr">
 (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.
 when generating localized strings.
-</div></div></td>
+</div></div></a></td>
 <td><div class="exampleContainer expandable">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
-NSString *reminderText = 
+NSString *reminderText =
   NSLocalizedString(@"None", @"Indicates no reminders");
   NSLocalizedString(@"None", @"Indicates no reminders");
 if (reminderCount == 1) {
 if (reminderCount == 1) {
   // Warning: Plural cases are not supported across all languages.
   // Warning: Plural cases are not supported across all languages.
   // Use a .stringsdict file instead
   // Use a .stringsdict file instead
-  reminderText = 
+  reminderText =
     NSLocalizedString(@"1 Reminder", @"Indicates single reminder");
     NSLocalizedString(@"1 Reminder", @"Indicates single reminder");
 } else if (reminderCount >= 2) {
 } else if (reminderCount >= 2) {
   // Warning: Plural cases are not supported across all languages.
   // Warning: Plural cases are not supported across all languages.
   // Use a .stringsdict file instead
   // Use a .stringsdict file instead
-  reminderText = 
+  reminderText =
     [NSString stringWithFormat:
     [NSString stringWithFormat:
       NSLocalizedString(@"%@ Reminders", @"Indicates multiple reminders"),
       NSLocalizedString(@"%@ Reminders", @"Indicates multiple reminders"),
         reminderCount];
         reminderCount];
@@ -766,10 +766,10 @@ if (reminderCount == 1) {
 <thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
 <thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
 
 
 <tbody>
 <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">
 alpha.security.ArrayBound</span><span class="lang">
 (C)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -791,7 +791,7 @@ void test() {
 }
 }
 </pre></div><div class="separator"></div>
 </pre></div><div class="separator"></div>
 <div class="example"><pre>
 <div class="example"><pre>
-// note: requires unix.Malloc or 
+// note: requires unix.Malloc or
 // alpha.unix.MallocWithAnnotations checks enabled.
 // alpha.unix.MallocWithAnnotations checks enabled.
 void test() {
 void test() {
   int *p = malloc(12);
   int *p = malloc(12);
@@ -807,10 +807,10 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 alpha.security.ArrayBoundV2</span><span class="lang">
 (C)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -844,10 +844,10 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 alpha.security.MallocOverflow</span><span class="lang">
 (C)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test(int n) {
 void test(int n) {
@@ -856,11 +856,11 @@ void test(int n) {
 </pre></div></div></td></tr>
 </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">
 alpha.security.MmapWriteExec</span><span class="lang">
 (C)</span><div class="descr">
 (C)</span><div class="descr">
 Warn on <code>mmap()<code> calls that are both writable and executable.
 Warn on <code>mmap()<code> calls that are both writable and executable.
-</div></div></td>
+</div></div></a></td>
 <td><div class="exampleContainer expandable">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test(int n) {
 void test(int n) {
@@ -873,10 +873,10 @@ void test(int n) {
 </pre></div></div></td></tr>
 </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">
 alpha.security.ReturnPtrRange</span><span class="lang">
 (C)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 static int A[10];
 static int A[10];
@@ -894,10 +894,10 @@ int test(void) {
 </pre></div></div></td></tr>
 </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">
 alpha.security.taint.TaintPropagation</span><span class="lang">
 (C)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -907,7 +907,7 @@ void test() {
 </pre></div><div class="separator"></div>
 </pre></div><div class="separator"></div>
 <div class="example"><pre>
 <div class="example"><pre>
 // note: compiler internally checks if the second param to
 // 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.
 // Use -Wno-format-security to suppress compiler warning.
 void test() {
 void test() {
   char s[10], buf[10];
   char s[10], buf[10];
@@ -920,7 +920,7 @@ void test() {
 void test() {
 void test() {
   size_t ts;
   size_t ts;
   scanf("%zd", &ts); // 'ts' marked as tainted
   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
     // warn: untrusted data as buffer size
 }
 }
 </pre></div></div></td></tr>
 </pre></div></div></td></tr>
@@ -935,7 +935,7 @@ void test() {
 <tbody>
 <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">
 alpha.unix.BlockInCriticalSection</span><span class="lang">
 (C)</span><div class="descr">
 (C)</span><div class="descr">
 Check for calls to blocking functions inside a critical section. Applies to:
 Check for calls to blocking functions inside a critical section. Applies to:
@@ -955,7 +955,7 @@ mtx_trylock<br>
 mtx_unlock<br>
 mtx_unlock<br>
 lock_guard<br>
 lock_guard<br>
 unique_lock</div>
 unique_lock</div>
-</div></div></td>
+</div></div></a></td>
 <td><div class="exampleContainer expandable">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -968,10 +968,10 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 alpha.unix.Chroot</span><span class="lang">
 (C)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void f();
 void f();
@@ -983,7 +983,7 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 alpha.unix.PthreadLock</span><span class="lang">
 (C)</span><div class="descr">
 (C)</span><div class="descr">
 Simple lock -> unlock checker; applies to:<div class=functions>
 Simple lock -> unlock checker; applies to:<div class=functions>
@@ -1002,14 +1002,14 @@ lck_rw_try_lock_shared<br>
 pthread_mutex_unlock<br>
 pthread_mutex_unlock<br>
 pthread_rwlock_unlock<br>
 pthread_rwlock_unlock<br>
 lck_mtx_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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 pthread_mutex_t mtx;
 pthread_mutex_t mtx;
 
 
 void test() {
 void test() {
   pthread_mutex_lock(&mtx);
   pthread_mutex_lock(&mtx);
-  pthread_mutex_lock(&mtx); 
+  pthread_mutex_lock(&mtx);
     // warn: this lock has already been acquired
     // warn: this lock has already been acquired
 }
 }
 </pre></div><div class="separator"></div>
 </pre></div><div class="separator"></div>
@@ -1019,7 +1019,7 @@ lck_mtx_t lck1, lck2;
 void test() {
 void test() {
   lck_mtx_lock(&lck1);
   lck_mtx_lock(&lck1);
   lck_mtx_lock(&lck2);
   lck_mtx_lock(&lck2);
-  lck_mtx_unlock(&lck1); 
+  lck_mtx_unlock(&lck1);
     // warn: this was not the most recently acquired lock
     // warn: this was not the most recently acquired lock
 }
 }
 </pre></div><div class="separator"></div>
 </pre></div><div class="separator"></div>
@@ -1037,7 +1037,7 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 alpha.unix.SimpleStream</span><span class="lang">
 (C)</span><div class="descr">
 (C)</span><div class="descr">
 Check for misuses of stream APIs:<div class=functions>
 Check for misuses of stream APIs:<div class=functions>
@@ -1046,7 +1046,7 @@ fclose</div>(demo checker, the subject of the demo
 (<a href="http://llvm.org/devmtg/2012-11/Zaks-Rose-Checker24Hours.pdf">Slides</a>
 (<a href="http://llvm.org/devmtg/2012-11/Zaks-Rose-Checker24Hours.pdf">Slides</a>
 ,<a href="https://youtu.be/kdxlsP5QVPw">Video</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/">
 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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -1065,7 +1065,7 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 alpha.unix.Stream</span><span class="lang">
 (C)</span><div class="descr">
 (C)</span><div class="descr">
 Check stream handling functions:<div class=functions>fopen<br>
 Check stream handling functions:<div class=functions>fopen<br>
@@ -1081,7 +1081,7 @@ fsetpos<br>
 clearerr<br>
 clearerr<br>
 feof<br>
 feof<br>
 ferror<br>
 ferror<br>
-fileno</div></div></div></td>
+fileno</div></div></div></a></td>
 <td><div class="exampleContainer expandable">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -1092,7 +1092,7 @@ void test() {
 void test() {
 void test() {
   FILE *p = fopen("foo", "r");
   FILE *p = fopen("foo", "r");
   fseek(p, 1, SEEK_SET); // warn: stream pointer might be NULL
   fseek(p, 1, SEEK_SET); // warn: stream pointer might be NULL
-  fclose(p); 
+  fclose(p);
 }
 }
 </pre></div><div class="separator"></div>
 </pre></div><div class="separator"></div>
 <div class="example"><pre>
 <div class="example"><pre>
@@ -1103,13 +1103,13 @@ void test() {
     fseek(p, 1, 3);
     fseek(p, 1, 3);
      // warn: third arg should be SEEK_SET, SEEK_END, or SEEK_CUR
      // warn: third arg should be SEEK_SET, SEEK_END, or SEEK_CUR
 
 
-  fclose(p); 
+  fclose(p);
 }
 }
 </pre></div><div class="separator"></div>
 </pre></div><div class="separator"></div>
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
   FILE *p = fopen("foo", "r");
   FILE *p = fopen("foo", "r");
-  fclose(p); 
+  fclose(p);
   fclose(p); // warn: already closed
   fclose(p); // warn: already closed
 }
 }
 </pre></div><div class="separator"></div>
 </pre></div><div class="separator"></div>
@@ -1122,12 +1122,12 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 alpha.unix.cstring.BufferOverlap</span><span class="lang">
 (C)</span><div class="descr">
 (C)</span><div class="descr">
 Checks for overlap in two buffer arguments; applies to:<div class=functions>
 Checks for overlap in two buffer arguments; applies to:<div class=functions>
 memcpy<br>
 memcpy<br>
-mempcpy</div></div></div></td>
+mempcpy</div></div></div></a></td>
 <td><div class="exampleContainer expandable">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -1137,7 +1137,7 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 alpha.unix.cstring.NotNullTerminated</span><span class="lang">
 (C)</span><div class="descr">
 (C)</span><div class="descr">
 Check for arguments which are not null-terminated strings; applies
 Check for arguments which are not null-terminated strings; applies
@@ -1153,16 +1153,16 @@ strncat</div></div></div></td>
 void test() {
 void test() {
   int y = strlen((char *)&test); // warn
   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">
 alpha.unix.cstring.OutOfBounds</span><span class="lang">
 (C)</span><div class="descr">
 (C)</span><div class="descr">
 Check for out-of-bounds access in string functions; applies
 Check for out-of-bounds access in string functions; applies
 to:<div class=functions>
 to:<div class=functions>
 strncopy<br>
 strncopy<br>
-strncat</div></div></div></td>
+strncat</div></div></div></a></td>
 <td><div class="exampleContainer expandable">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test(char *y) {
 void test(char *y) {

+ 142 - 142
www/analyzer/available_checks.html

@@ -52,11 +52,11 @@ Experimental (Alpha) Checkers</a>.
 <thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
 <thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
 
 
 <tbody>
 <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">
 core.CallAndMessage</span><span class="lang">
 (C, C++, ObjC)</span><div class="descr">
 (C, C++, ObjC)</span><div class="descr">
 Check for logical errors for function calls and Objective-C message expressions
 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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 // C
 // C
@@ -153,10 +153,10 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 core.DivideZero</span><span class="lang">
 (C, C++, ObjC)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test(int z) {
 void test(int z) {
@@ -172,11 +172,11 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 core.NonNullParamChecker</span><span class="lang">
 (C, C++, ObjC)</span><div class="descr">
 (C, C++, ObjC)</span><div class="descr">
 Check for null pointers passed as arguments to a function whose arguments are
 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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 int f(int *p) __attribute__((nonnull));
 int f(int *p) __attribute__((nonnull));
@@ -188,10 +188,10 @@ void test(int *p) {
 </pre></div></div></td></tr>
 </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">
 core.NullDereference</span><span class="lang">
 (C, C++, ObjC)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 // C
 // C
@@ -236,10 +236,10 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 core.StackAddressEscape</span><span class="lang">
 (C)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 char const *p;
 char const *p;
@@ -263,10 +263,10 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 core.UndefinedBinaryOperatorResult</span><span class="lang">
 (C)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -276,10 +276,10 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 core.VLASize</span><span class="lang">
 (C)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -295,10 +295,10 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 core.uninitialized.ArraySubscript</span><span class="lang">
 (C)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -308,10 +308,10 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 core.uninitialized.Assign</span><span class="lang">
 (C)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -321,10 +321,10 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 core.uninitialized.Branch</span><span class="lang">
 (C)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -335,10 +335,10 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 core.uninitialized.CapturedBlockVariable</span><span class="lang">
 (C)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -348,10 +348,10 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 core.uninitialized.UndefReturn</span><span class="lang">
 (C)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 int test() {
 int test() {
@@ -369,11 +369,11 @@ int test() {
 <thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
 <thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
 
 
 <tbody>
 <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">
 cplusplus.NewDelete</span><span class="lang">
 (C++)</span><div class="descr">
 (C++)</span><div class="descr">
 Check for double-free, use-after-free and offset problems involving C++ <code>
 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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void f(int *p);
 void f(int *p);
@@ -423,11 +423,11 @@ void test() {
 }
 }
 </pre></div></div></td></tr>
 </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">
 cplusplus.NewDeleteLeaks</span><span class="lang">
 (C++)</span><div class="descr">
 (C++)</span><div class="descr">
 Check for memory leaks. Traces memory managed by <code>new</code>/<code>
 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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -444,10 +444,10 @@ void test() {
 <thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
 <thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
 
 
 <tbody>
 <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">
 deadcode.DeadStores</span><span class="lang">
 (C)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -465,11 +465,11 @@ void test() {
 <thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
 <thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
 
 
 <tbody>
 <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">
 nullability.NullPassedToNonnull</span><span class="lang">
 (ObjC)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 if (name != nil)
 if (name != nil)
@@ -479,11 +479,11 @@ NSString *greeting = [@"Hello " stringByAppendingString:name];
 </pre></div></div></td></tr>
 </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">
 nullability.NullReturnedFromNonnull</span><span class="lang">
 (ObjC)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 - (nonnull id)firstChild {
 - (nonnull id)firstChild {
@@ -491,17 +491,17 @@ _Nonnull return type.</div></div></td>
   if ([_children count] > 0)
   if ([_children count] > 0)
     result = _children[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
   // to return a non-null value
   return result;
   return result;
 }
 }
 </pre></div></div></td></tr>
 </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">
 nullability.NullableDereferenced</span><span class="lang">
 (ObjC)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 struct LinkedList {
 struct LinkedList {
@@ -519,10 +519,10 @@ void updateNextData(struct LinkedList *list, int newData) {
 </pre></div></div></td></tr>
 </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">
 nullability.NullablePassedToNonnull</span><span class="lang">
 (ObjC)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 typedef struct Dummy { int val; } Dummy;
 typedef struct Dummy { int val; } Dummy;
@@ -545,16 +545,16 @@ void test() {
 
 
 
 
 <tbody>
 <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">
 optin.cplusplus.VirtualCall</span><span class="lang">
 (C++)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 class A {
 class A {
 public:
 public:
-  A() { 
+  A() {
     f(); // warn
     f(); // warn
   }
   }
   virtual void f();
   virtual void f();
@@ -571,16 +571,16 @@ public:
 </pre></div></div></td></tr>
 </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">
 optin.mpi.MPI-Checker</span><span class="lang">
 (C)</span><div class="descr">
 (C)</span><div class="descr">
-Checks MPI code</div></div></td>
+Checks MPI code</div></div></a></td>
 <td><div class="exampleContainer expandable">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
   double buf = 0;
   double buf = 0;
   MPI_Request sendReq1;
   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);
       0, MPI_COMM_WORLD, &sendReq1);
 } // warn: request 'sendReq1' has no matching wait.
 } // warn: request 'sendReq1' has no matching wait.
 </pre></div><div class="separator"></div>
 </pre></div><div class="separator"></div>
@@ -604,10 +604,10 @@ void missingNonBlocking() {
 </pre></div></div></td></tr>
 </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">
 optin.osx.cocoa.localizability.EmptyLocalizationContextChecker</span><span class="lang">
 (ObjC)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 - (void)test {
 - (void)test {
@@ -619,14 +619,14 @@ Check that NSLocalizedString macros include a comment for context.</div></div></
 </pre></div></div></td></tr>
 </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">
 optin.osx.cocoa.localizability.NonLocalizedStringChecker</span><span class="lang">
 (ObjC)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
-NSString *alarmText = 
+NSString *alarmText =
   NSLocalizedString(@"Enabled", @"Indicates alarm is turned on");
   NSLocalizedString(@"Enabled", @"Indicates alarm is turned on");
 if (!isEnabled) {
 if (!isEnabled) {
   alarmText = @"Disabled";
   alarmText = @"Disabled";
@@ -646,11 +646,11 @@ UILabel *alarmStateLabel = [[UILabel alloc] init];
 <thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
 <thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
 
 
 <tbody>
 <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">
 osx.API</span><span class="lang">
 (C)</span><div class="descr">
 (C)</span><div class="descr">
 Check for proper uses of various Apple APIs:<div class=functions>
 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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -660,15 +660,15 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 osx.NumberObjectConversion</span><span class="lang">
 (C, C++, ObjC)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 NSNumber *photoCount = [albumDescriptor objectForKey:@"PhotoCount"];
 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
 // to a scalar integer value
 if (photoCount > 0) {
 if (photoCount > 0) {
   [self displayPhotos];
   [self displayPhotos];
@@ -676,7 +676,7 @@ if (photoCount > 0) {
 </pre></div></div></td></tr>
 </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">
 osx.SecKeychainAPI</span><span class="lang">
 (C)</span><div class="descr">
 (C)</span><div class="descr">
 Check for improper uses of the Security framework's Keychain APIs:<div class=functions>
 Check for improper uses of the Security framework's Keychain APIs:<div class=functions>
@@ -685,7 +685,7 @@ SecKeychainFindGenericPassword<br>
 SecKeychainFindInternetPassword<br>
 SecKeychainFindInternetPassword<br>
 SecKeychainItemFreeContent<br>
 SecKeychainItemFreeContent<br>
 SecKeychainItemCopyAttributesAndData<br>
 SecKeychainItemCopyAttributesAndData<br>
-SecKeychainItemFreeAttributesAndData</div></div></div></td>
+SecKeychainItemFreeAttributesAndData</div></div></div></a></td>
 <td><div class="exampleContainer expandable">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -756,10 +756,10 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 osx.cocoa.AtSync</span><span class="lang">
 (ObjC)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test(id x) {
 void test(id x) {
@@ -775,11 +775,11 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 osx.cocoa.ClassRelease</span><span class="lang">
 (ObjC)</span><div class="descr">
 (ObjC)</span><div class="descr">
 Check for sending <code>retain</code>, <code>release</code>, or <code>
 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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 @interface MyClass : NSObject
 @interface MyClass : NSObject
@@ -791,16 +791,16 @@ void test(void) {
 </pre></div></div></td></tr>
 </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">
 osx.cocoa.Dealloc</span><span class="lang">
 (ObjC)</span><div class="descr">
 (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>.
 of <code>-dealloc</code>.
-</div></div></td>
+</div></div></a></td>
 <td><div class="exampleContainer expandable">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 @interface MyObject : NSObject {
 @interface MyObject : NSObject {
-  id _myproperty;  
+  id _myproperty;
 }
 }
 @end
 @end
 
 
@@ -851,10 +851,10 @@ of <code>-dealloc</code>.
 </pre></div></div></td></tr>
 </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">
 osx.cocoa.IncompatibleMethodTypes</span><span class="lang">
 (ObjC)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 @interface MyClass1 : NSObject
 @interface MyClass1 : NSObject
@@ -875,13 +875,13 @@ Check for an incompatible type signature when overriding an Objective-C method.<
 </pre></div></div></td></tr>
 </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">
 (ObjC)</span><div class="descr">
 Warn about Objective-C methods that lack a necessary call to super. (Note: The
 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>
 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
 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>
 <td><div class="example"><pre>
 @interface Test : UIViewController
 @interface Test : UIViewController
 @end
 @end
@@ -891,11 +891,11 @@ that haven't yet adopted this attribute.)</div></div></td>
 </pre></div></td></tr>
 </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">
 osx.cocoa.NSAutoreleasePool</span><span class="lang">
 (ObjC)</span><div class="descr">
 (ObjC)</span><div class="descr">
 Warn for suboptimal uses of NSAutoreleasePool in Objective-C
 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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -905,10 +905,10 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 osx.cocoa.NSError</span><span class="lang">
 (ObjC)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 @interface A : NSObject
 @interface A : NSObject
@@ -936,7 +936,7 @@ Check usage of <code>NSError**</code> parameters.</div></div></td>
 </pre></div></div></td></tr>
 </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">
 osx.cocoa.NilArg</span><span class="lang">
 (ObjC)</span><div class="descr">
 (ObjC)</span><div class="descr">
 Check for prohibited nil arguments in specific Objective-C method calls:<div class=functions>
 Check for prohibited nil arguments in specific Objective-C method calls:<div class=functions>
@@ -946,7 +946,7 @@ Check for prohibited nil arguments in specific Objective-C method calls:<div cla
 - compare:options:range:<br>
 - compare:options:range:<br>
 - compare:options:range:locale:<br>
 - compare:options:range:locale:<br>
 - componentsSeparatedByCharactersInSet:<br>
 - componentsSeparatedByCharactersInSet:<br>
-- initWithFormat:</div></div></div></td>
+- initWithFormat:</div></div></div></a></td>
 <td><div class="exampleContainer expandable">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 NSComparisonResult test(NSString *s) {
 NSComparisonResult test(NSString *s) {
@@ -958,25 +958,25 @@ NSComparisonResult test(NSString *s) {
 </pre></div></div></td></tr>
 </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">
 osx.cocoa.ObjCGenerics</span><span class="lang">
 (ObjC)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 NSMutableArray<NSString *> *names = [NSMutableArray array];
 NSMutableArray<NSString *> *names = [NSMutableArray array];
 NSMutableArray *birthDates = names;
 NSMutableArray *birthDates = names;
 
 
-// Warning: Conversion from value of type 'NSDate *' 
+// Warning: Conversion from value of type 'NSDate *'
 // to incompatible type 'NSString *'
 // to incompatible type 'NSString *'
 [birthDates addObject: [NSDate date]];
 [birthDates addObject: [NSDate date]];
 </pre></div></div></td></tr>
 </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">
 osx.cocoa.RetainCount</span><span class="lang">
 (ObjC)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -991,11 +991,11 @@ CFStringRef test(char *bytes) {
 </pre></div></div></td></tr>
 </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">
 osx.cocoa.SelfInit</span><span class="lang">
 (ObjC)</span><div class="descr">
 (ObjC)</span><div class="descr">
 Check that <code>self</code> is properly initialized inside an initializer
 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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 @interface MyObj : NSObject {
 @interface MyObj : NSObject {
@@ -1027,10 +1027,10 @@ method.</div></div></td>
 </pre></div></div></td></tr>
 </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">
 osx.cocoa.SuperDealloc</span><span class="lang">
 (ObjC)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 @interface SuperDeallocThenReleaseIvarClass : NSObject {
 @interface SuperDeallocThenReleaseIvarClass : NSObject {
@@ -1047,10 +1047,10 @@ Warn about improper use of '[super dealloc]' in Objective-C</div></div></td>
 </pre></div></div></td></tr>
 </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">
 osx.cocoa.UnusedIvars</span><span class="lang">
 (ObjC)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 @interface MyObj : NSObject {
 @interface MyObj : NSObject {
@@ -1064,11 +1064,11 @@ Warn about private ivars that are never used.</div></div></td>
 </pre></div></div></td></tr>
 </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">
 osx.cocoa.VariadicMethodTypes</span><span class="lang">
 (ObjC)</span><div class="descr">
 (ObjC)</span><div class="descr">
 Check for passing non-Objective-C types to variadic collection initialization
 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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -1078,10 +1078,10 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 osx.coreFoundation.CFError</span><span class="lang">
 (C)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test(CFErrorRef *error) {
 void test(CFErrorRef *error) {
@@ -1097,10 +1097,10 @@ int foo(CFErrorRef *error) {
 </pre></div></div></td></tr>
 </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">
 osx.coreFoundation.CFNumber</span><span class="lang">
 (C)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 CFNumberRef test(unsigned char x) {
 CFNumberRef test(unsigned char x) {
@@ -1110,11 +1110,11 @@ CFNumberRef test(unsigned char x) {
 </pre></div></div></td></tr>
 </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">
 osx.coreFoundation.CFRetainRelease</span><span class="lang">
 (C)</span><div class="descr">
 (C)</span><div class="descr">
 Check for null arguments to <code>CFRetain</code>, <code>CFRelease</code>,
 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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test(CFTypeRef p) {
 void test(CFTypeRef p) {
@@ -1132,10 +1132,10 @@ void test(int x, CFTypeRef p) {
 </pre></div></div></td></tr>
 </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">
 osx.coreFoundation.containers.OutOfBounds</span><span class="lang">
 (C)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -1145,11 +1145,11 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 osx.coreFoundation.containers.PointerSizedValues</span><span class="lang">
 (C)</span><div class="descr">
 (C)</span><div class="descr">
 Warns if <code>CFArray</code>, <code>CFDictionary</code>, <code>CFSet</code> are
 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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -1168,11 +1168,11 @@ void test() {
 <thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
 <thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
 
 
 <tbody>
 <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">
 security.FloatLoopCounter</span><span class="lang">
 (C)</span><div class="descr">
 (C)</span><div class="descr">
 Warn on using a floating point value as a loop counter (CERT: FLP30-C,
 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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -1181,7 +1181,7 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 security.insecureAPI.UncheckedReturn</span><span class="lang">
 (C)</span><div class="descr">
 (C)</span><div class="descr">
 Warn on uses of functions whose return values must be always checked:<div class=functions>
 Warn on uses of functions whose return values must be always checked:<div class=functions>
@@ -1190,7 +1190,7 @@ setgid<br>
 seteuid<br>
 seteuid<br>
 setegid<br>
 setegid<br>
 setreuid<br>
 setreuid<br>
-setregid</div></div></div></td>
+setregid</div></div></div></a></td>
 <td><div class="exampleContainer expandable">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -1199,10 +1199,10 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 security.insecureAPI.bcmp</span><span class="lang">
 (C)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -1210,10 +1210,10 @@ void test() {
 }
 }
 </pre></div></div></td></tr>
 </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">
 security.insecureAPI.bcopy</span><span class="lang">
 (C)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -1221,10 +1221,10 @@ void test() {
 }
 }
 </pre></div></div></td></tr>
 </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">
 security.insecureAPI.bzero</span><span class="lang">
 (C)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -1233,10 +1233,10 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 security.insecureAPI.getpw</span><span class="lang">
 (C)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -1246,10 +1246,10 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 security.insecureAPI.gets</span><span class="lang">
 (C)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -1259,12 +1259,12 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 security.insecureAPI.mkstemp</span><span class="lang">
 (C)</span><div class="descr">
 (C)</span><div class="descr">
 Warn when <code>mktemp</code>, <code>mkstemp</code>, <code>mkstemps</code> or
 Warn when <code>mktemp</code>, <code>mkstemp</code>, <code>mkstemps</code> or
 <code>mkdtemp</code> is passed fewer than 6
 <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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -1273,10 +1273,10 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 security.insecureAPI.mktemp</span><span class="lang">
 (C)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -1285,7 +1285,7 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 security.insecureAPI.rand</span><span class="lang">
 (C)</span><div class="descr">
 (C)</span><div class="descr">
 Warn on uses of inferior random number generating functions (only if <code>arc4random</code>
 Warn on uses of inferior random number generating functions (only if <code>arc4random</code>
@@ -1298,7 +1298,7 @@ lrand48<br>
 mrand48<br>
 mrand48<br>
 nrand48<br>
 nrand48<br>
 random<br>
 random<br>
-rand_r</div></div></div></td>
+rand_r</div></div></div></a></td>
 <td><div class="exampleContainer expandable">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -1307,10 +1307,10 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 security.insecureAPI.strcpy</span><span class="lang">
 (C)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -1322,10 +1322,10 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 security.insecureAPI.vfork</span><span class="lang">
 (C)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -1342,7 +1342,7 @@ void test() {
 <thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
 <thead><tr><td>Name, Description</td><td>Example</td></tr></thead>
 
 
 <tbody>
 <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">
 unix.API</span><span class="lang">
 (C)</span><div class="descr">
 (C)</span><div class="descr">
 Check calls to various UNIX/POSIX functions:<div class=functions>
 Check calls to various UNIX/POSIX functions:<div class=functions>
@@ -1351,7 +1351,7 @@ pthread_once<br>
 calloc<br>
 calloc<br>
 malloc<br>
 malloc<br>
 realloc<br>
 realloc<br>
-alloca<br>
+alloca<br></a></td>
 <td><div class="exampleContainer expandable">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 // Currently the check is performed for apple targets only.
 // Currently the check is performed for apple targets only.
@@ -1398,11 +1398,11 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 unix.Malloc</span><span class="lang">
 (C)</span><div class="descr">
 (C)</span><div class="descr">
 Check for memory leaks, double free, and use-after-free and offset problems
 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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -1440,11 +1440,11 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 unix.MallocSizeof</span><span class="lang">
 (C)</span><div class="descr">
 (C)</span><div class="descr">
 Check for dubious <code>malloc</code>, <code>calloc</code> or
 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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -1456,11 +1456,11 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 unix.MismatchedDeallocator</span><span class="lang">
 (C, C++, ObjC)</span><div class="descr">
 (C, C++, ObjC)</span><div class="descr">
 Check for mismatched deallocators (e.g. passing a pointer allocating
 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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 // C, C++
 // C, C++
@@ -1527,10 +1527,10 @@ void test(NSUInteger dataLength) {
 </pre></div></div></td></tr>
 </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">
 unix.Vfork</span><span class="lang">
 (C)</span><div class="descr">
 (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">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 int test(int x) {
 int test(int x) {
@@ -1559,13 +1559,13 @@ int test(int x) {
 </pre></div></div></td></tr>
 </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">
 unix.cstring.BadSizeArg</span><span class="lang">
 (C)</span><div class="descr">
 (C)</span><div class="descr">
 Check the size argument passed to <code>strncat</code> for common erroneous
 Check the size argument passed to <code>strncat</code> for common erroneous
 patterns. Use <code>-Wno-strncat-size</code> compiler option to mute other
 patterns. Use <code>-Wno-strncat-size</code> compiler option to mute other
 <code>strncat</code>-related compiler warnings.
 <code>strncat</code>-related compiler warnings.
-</div></div></td>
+</div></div></a></td>
 <td><div class="exampleContainer expandable">
 <td><div class="exampleContainer expandable">
 <div class="example"><pre>
 <div class="example"><pre>
 void test() {
 void test() {
@@ -1576,7 +1576,7 @@ void test() {
 </pre></div></div></td></tr>
 </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">
 unix.cstring.NullArg</span><span class="lang">
 (C)</span><div class="descr">
 (C)</span><div class="descr">
 Check for null pointers being passed as arguments to C string functions:<div class=functions>
 Check for null pointers being passed as arguments to C string functions:<div class=functions>
@@ -1589,7 +1589,7 @@ strncat<br>
 strcmp<br>
 strcmp<br>
 strncmp<br>
 strncmp<br>
 strcasecmp<br>
 strcasecmp<br>
-strncasecmp</div></div></div></td>
+strncasecmp</div></div></div></a></td>
 <td><div class="example"><pre>
 <td><div class="example"><pre>
 int test() {
 int test() {
   return strlen(0); // warn
   return strlen(0); // warn