
The checker currently reports beneath the null dereference dereferences of undefined value and of label addresses. If we want to add more kinds of invalid dereferences (or split the existing functionality) it is more useful to make it separate checkers. To make this possible the existing checker is split into a DereferenceModeling part and a NullDereference checker that actually only switches on the check of null dereference. This is similar architecture as in MallocChecker and CStringChecker. The change is almost NFC but a new (modeling) checker is added. If the NullDereference checker is turned off the found invalid dereferences will still stop the analysis without emitted warning (this is different compared to the old behavior).
73 lines
2.7 KiB
C
73 lines
2.7 KiB
C
// Here we test the order of the Checkers when StdCLibraryFunctions is
|
|
// enabled.
|
|
|
|
// RUN: %clang --analyze %s --target=x86_64-pc-linux-gnu \
|
|
// RUN: -Xclang -analyzer-checker=core \
|
|
// RUN: -Xclang -analyzer-checker=unix.StdCLibraryFunctions \
|
|
// RUN: -Xclang -analyzer-config \
|
|
// RUN: -Xclang unix.StdCLibraryFunctions:ModelPOSIX=true \
|
|
// RUN: -Xclang -analyzer-checker=unix.Stream \
|
|
// RUN: -Xclang -analyzer-list-enabled-checkers \
|
|
// RUN: -Xclang -analyzer-display-progress \
|
|
// RUN: 2>&1 | FileCheck %s --implicit-check-not=ANALYZE \
|
|
// RUN: --implicit-check-not=\.
|
|
|
|
// CHECK: OVERVIEW: Clang Static Analyzer Enabled Checkers List
|
|
// CHECK-EMPTY:
|
|
// CHECK-NEXT: apiModeling.Errno
|
|
// CHECK-NEXT: apiModeling.TrustNonnull
|
|
// CHECK-NEXT: apiModeling.TrustReturnsNonnull
|
|
// CHECK-NEXT: apiModeling.llvm.CastValue
|
|
// CHECK-NEXT: apiModeling.llvm.ReturnValue
|
|
// CHECK-NEXT: core.BitwiseShift
|
|
// CHECK-NEXT: core.CallAndMessageModeling
|
|
// CHECK-NEXT: core.CallAndMessage
|
|
// CHECK-NEXT: core.DereferenceModeling
|
|
// CHECK-NEXT: core.DivideZero
|
|
// CHECK-NEXT: core.DynamicTypePropagation
|
|
// CHECK-NEXT: core.NonNullParamChecker
|
|
// CHECK-NEXT: core.NonnilStringConstants
|
|
// CHECK-NEXT: core.NullDereference
|
|
// CHECK-NEXT: core.StackAddrEscapeBase
|
|
// CHECK-NEXT: core.StackAddressEscape
|
|
// CHECK-NEXT: core.UndefinedBinaryOperatorResult
|
|
// CHECK-NEXT: core.VLASize
|
|
// CHECK-NEXT: core.builtin.BuiltinFunctions
|
|
// CHECK-NEXT: core.builtin.NoReturnFunctions
|
|
// CHECK-NEXT: core.uninitialized.ArraySubscript
|
|
// CHECK-NEXT: core.uninitialized.Assign
|
|
// CHECK-NEXT: core.uninitialized.Branch
|
|
// CHECK-NEXT: core.uninitialized.CapturedBlockVariable
|
|
// CHECK-NEXT: core.uninitialized.UndefReturn
|
|
// CHECK-NEXT: deadcode.DeadStores
|
|
// CHECK-NEXT: nullability.NullabilityBase
|
|
// CHECK-NEXT: nullability.NullPassedToNonnull
|
|
// CHECK-NEXT: nullability.NullReturnedFromNonnull
|
|
// CHECK-NEXT: security.insecureAPI.SecuritySyntaxChecker
|
|
// CHECK-NEXT: security.insecureAPI.UncheckedReturn
|
|
// CHECK-NEXT: security.insecureAPI.getpw
|
|
// CHECK-NEXT: security.insecureAPI.gets
|
|
// CHECK-NEXT: security.insecureAPI.mkstemp
|
|
// CHECK-NEXT: security.insecureAPI.mktemp
|
|
// CHECK-NEXT: security.insecureAPI.vfork
|
|
// CHECK-NEXT: unix.API
|
|
// CHECK-NEXT: unix.BlockInCriticalSection
|
|
// CHECK-NEXT: unix.Chroot
|
|
// CHECK-NEXT: unix.cstring.CStringModeling
|
|
// CHECK-NEXT: unix.DynamicMemoryModeling
|
|
// CHECK-NEXT: unix.Errno
|
|
// CHECK-NEXT: unix.Malloc
|
|
// CHECK-NEXT: unix.MallocSizeof
|
|
// CHECK-NEXT: unix.MismatchedDeallocator
|
|
// CHECK-NEXT: unix.Stream
|
|
// CHECK-NEXT: unix.StdCLibraryFunctions
|
|
// CHECK-NEXT: unix.Vfork
|
|
// CHECK-NEXT: unix.cstring.BadSizeArg
|
|
// CHECK-NEXT: unix.cstring.NotNullTerminated
|
|
// CHECK-NEXT: unix.cstring.NullArg
|
|
|
|
int main() {
|
|
int i;
|
|
(void)(10 / i);
|
|
}
|