Index: clang/test/Analysis/scan-build/Inputs/null_dereference_and_division_by_zero.c =================================================================== --- /dev/null +++ clang/test/Analysis/scan-build/Inputs/null_dereference_and_division_by_zero.c @@ -0,0 +1,9 @@ + +int test(int x) { + if (x) { + int *p = 0; + return *p; // Null dereference. + } else { + return 1 / x; // Division by zero. + } +} Index: clang/test/Analysis/scan-build/silence-core-checkers.test =================================================================== --- /dev/null +++ clang/test/Analysis/scan-build/silence-core-checkers.test @@ -0,0 +1,30 @@ +// FIXME: Actually, "perl". +REQUIRES: shell + +RUN: rm -rf %t.output_dir && mkdir %t.output_dir +RUN: %scan-build -o %t.output_dir \ +RUN: %clang -S %S/Inputs/null_dereference_and_division_by_zero.c \ +RUN: | FileCheck %s -check-prefix CHECK-TWO-BUGS + +RUN: rm -rf %t.output_dir && mkdir %t.output_dir +RUN: %scan-build -o %t.output_dir \ +RUN: -disable-checker core.DivideZero \ +RUN: %clang -S %S/Inputs/null_dereference_and_division_by_zero.c \ +RUN: | FileCheck %s -check-prefix CHECK-ONE-BUG + +RUN: rm -rf %t.output_dir && mkdir %t.output_dir +RUN: %scan-build -o %t.output_dir \ +RUN: -disable-checker core.NullDereference \ +RUN: %clang -S %S/Inputs/null_dereference_and_division_by_zero.c \ +RUN: | FileCheck %s -check-prefix CHECK-ONE-BUG + +RUN: rm -rf %t.output_dir && mkdir %t.output_dir +RUN: %scan-build -o %t.output_dir \ +RUN: -disable-checker core.NullDereference \ +RUN: -disable-checker core.DivideZero \ +RUN: %clang -S %S/Inputs/null_dereference_and_division_by_zero.c \ +RUN: | FileCheck %s -check-prefix CHECK-NO-BUGS + +CHECK-NO-BUGS: scan-build: No bugs found. +CHECK-ONE-BUG: scan-build: 1 bug found. +CHECK-TWO-BUGS: scan-build: 2 bugs found. Index: clang/tools/scan-build/bin/scan-build =================================================================== --- clang/tools/scan-build/bin/scan-build +++ clang/tools/scan-build/bin/scan-build @@ -1973,11 +1973,13 @@ my $CCC_ANALYZER_PLUGINS = join ' ', map { "-load ".$_ } @{$Options{PluginsToLoad}}; my $CCC_ANALYZER_CONFIG = join ' ', map { "-analyzer-config ".$_ } @{$Options{ConfigOptions}}; -foreach (sort { $Options{SilenceCheckers}{$a} <=> $Options{SilenceCheckers}{$b} } - keys %{$Options{SilenceCheckers}}) { - # Add checkers in order they were silenced. +if (%{$Options{SilenceCheckers}}) { $CCC_ANALYZER_CONFIG = - $CCC_ANALYZER_CONFIG." -analyzer-config silence-checkers=".$_; + $CCC_ANALYZER_CONFIG." -analyzer-config silence-checkers=" + .join(';', sort { + $Options{SilenceCheckers}{$a} <=> + $Options{SilenceCheckers}{$b} + } keys %{$Options{SilenceCheckers}}); } my %EnvVars = (