Index: clang/test/Analysis/scan-build/Inputs/multidirectory_project/directory1/file1.c =================================================================== --- /dev/null +++ clang/test/Analysis/scan-build/Inputs/multidirectory_project/directory1/file1.c @@ -0,0 +1,9 @@ +int main() { + return 0; +} + +void function1(int *p) { + if (!p) { + *p = 7; // This will emit a null pointer diagnostic. + } +} Index: clang/test/Analysis/scan-build/Inputs/multidirectory_project/directory2/file2.c =================================================================== --- /dev/null +++ clang/test/Analysis/scan-build/Inputs/multidirectory_project/directory2/file2.c @@ -0,0 +1,5 @@ +void function2(int *o) { + if (!o) { + *o = 7; // This will emit a null pointer diagnostic. + } +} Index: clang/test/Analysis/scan-build/Inputs/single_null_dereference.c =================================================================== --- /dev/null +++ clang/test/Analysis/scan-build/Inputs/single_null_dereference.c @@ -0,0 +1,5 @@ +int main() { + int *p = 0; + *p = 7; // We expect a diagnostic about this. + return 0; +} Index: clang/test/Analysis/scan-build/exclude_directories.test =================================================================== --- /dev/null +++ clang/test/Analysis/scan-build/exclude_directories.test @@ -0,0 +1,34 @@ +RUN: rm -rf %t.output_dir && mkdir %t.output_dir +RUN: %scan-build -o %t.output_dir %clang \ +RUN: %S/Inputs/multidirectory_project/directory1/file1.c \ +RUN: %S/Inputs/multidirectory_project/directory2/file2.c \ +RUN: | FileCheck %s -check-prefix CHECK-NO-EXCLUDE + +// The purpose of this test is to ensure that the --exclude command line option +// actually excludes reports from inside the specified directories. + + +// First, let's make sure that without --exclude issues in both +// directory1 and directory2 are found. +CHECK-NO-EXCLUDE: scan-build: 2 bugs found. + + +// Only one issue should be found when directory1 is excluded. +RUN: rm -rf %t.output_dir && mkdir %t.output_dir +RUN: %scan-build -o %t.output_dir --exclude directory1 %clang \ +RUN: %S/Inputs/multidirectory_project/directory1/file1.c \ +RUN: %S/Inputs/multidirectory_project/directory2/file2.c \ +RUN: | FileCheck %s -check-prefix CHECK-EXCLUDE1 + +CHECK-EXCLUDE1: scan-build: 1 bug found. + + +// When both directories are excluded, no issues should be reported. +RUN: rm -rf %t.output_dir && mkdir %t.output_dir +RUN: %scan-build -o %t.output_dir --exclude directory1 --exclude directory2 %clang \ +RUN: %S/Inputs/multidirectory_project/directory1/file1.c \ +RUN: %S/Inputs/multidirectory_project/directory2/file2.c \ +RUN: | FileCheck %s -check-prefix CHECK-EXCLUDE-BOTH + +CHECK-EXCLUDE-BOTH: scan-build: 0 bugs found. + Index: clang/test/Analysis/scan-build/help.test =================================================================== --- /dev/null +++ clang/test/Analysis/scan-build/help.test @@ -0,0 +1,18 @@ +RUN: %scan-build -h | FileCheck %s +RUN: %scan-build --help | FileCheck %s + +Test for help output from scan-build. + + +CHECK: USAGE: scan-build [options] [build options] + +... + +CHECK: AVAILABLE CHECKERS: +... +CHECK: optin.performance.GCDAntipattern +CHECK: + osx.API +... + + + Index: clang/test/Analysis/scan-build/html_output.test =================================================================== --- /dev/null +++ clang/test/Analysis/scan-build/html_output.test @@ -0,0 +1,30 @@ +RUN: rm -rf %t.output_dir && mkdir %t.output_dir +RUN: %scan-build -o %t.output_dir %clang %S/Inputs/single_null_dereference.c \ +RUN: | FileCheck %s -check-prefix CHECK-STDOUT + +// Test html output + +CHECK-STDOUT: scan-build: Using '{{.*}}' for static analysis +CHECK-STDOUT: scan-build: 1 bug found. +CHECK-STDOUT: scan-build: Run 'scan-view {{.*}}' to examine bug reports. + +// We expect an index file, a file for the report, and sibling support files. +RUN: ls %t.output_dir/*/ | FileCheck %s -check-prefix CHECK-FILENAMES + +CHECK-FILENAMES: index.html +CHECK-FILENAMES: report-{{.*}}.html +CHECK-FILENAMES: scanview.css +CHECK-FILENAMES: sorttable.js + + +// The index should have a link to the report for the single issue. +RUN: cat %T/html_output_dir/*/index.html \ +RUN: | FileCheck %s -check-prefix CHECK-INDEX-HTML + +CHECK-INDEX-HTML: + +// The report should describe the issue. +RUN: cat %t.output_dir/*/report-*.html \ +RUN: | FileCheck %s -check-prefix CHECK-REPORT-HTML + +CHECK-REPORT-HTML: Index: clang/test/Analysis/scan-build/plist_html_output.test =================================================================== --- /dev/null +++ clang/test/Analysis/scan-build/plist_html_output.test @@ -0,0 +1,20 @@ +RUN: rm -rf %t.output_dir && mkdir %t.output_dir +RUN: %scan-build -plist-html -o %t.output_dir %clang %S/Inputs/single_null_dereference.c \ +RUN: | FileCheck %s -check-prefix CHECK-STDOUT + +// Test combined plist and html output with -plist-html + +CHECK-STDOUT: scan-build: Using '{{.*}}' for static analysis +CHECK-STDOUT: scan-build: Analysis run complete. +CHECK-STDOUT: scan-build: Analysis results (plist files) deposited in '{{.*}}' +CHECK-STDOUT: scan-build: 1 bug found. +CHECK-STDOUT: scan-build: Run 'scan-view {{.*}}' to examine bug reports. + +// We expect both html files and the plist files. +RUN: ls %t.output_dir/*/ | FileCheck %s -check-prefix CHECK-FILENAMES + +CHECK-FILENAMES: index.html +CHECK-FILENAMES-DAG: report-{{.*}}.html +CHECK-FILENAMES-DAG: report-{{.*}}.plist +CHECK-FILENAMES: scanview.css +CHECK-FILENAMES: sorttable.js Index: clang/test/Analysis/scan-build/plist_output.test =================================================================== --- /dev/null +++ clang/test/Analysis/scan-build/plist_output.test @@ -0,0 +1,20 @@ +RUN: rm -rf %t.output_dir && mkdir %t.output_dir +RUN: %scan-build -plist -o %t.output_dir %clang %S/Inputs/single_null_dereference.c \ +RUN: | FileCheck %s -check-prefix CHECK-STDOUT + +// Test plist output + +CHECK-STDOUT: scan-build: Using '{{.*}}' for static analysis +CHECK-STDOUT: scan-build: Analysis run complete. +CHECK-STDOUT: scan-build: Analysis results (plist files) deposited in '{{.*}}' + +// We expect a single plist file +RUN: ls %t.output_dir/*/ | FileCheck %s -check-prefix CHECK-FILENAMES + +CHECK-FILENAMES: report-{{.*}}.plist + +// The report should describe the issue. +RUN: cat %t.output_dir/*/report-*.plist \ +RUN: | FileCheck %s -check-prefix CHECK-REPORT-PLIST-CONTENTS + +CHECK-REPORT-PLIST-CONTENTS: typeDereference of null pointer Index: clang/test/lit.cfg.py =================================================================== --- clang/test/lit.cfg.py +++ clang/test/lit.cfg.py @@ -62,7 +62,7 @@ tools = [ 'c-index-test', 'clang-diff', 'clang-format', 'clang-tblgen', 'opt', 'llvm-ifs', - ToolSubst('%clang_extdef_map', command=FindTool( + 'scan-build', ToolSubst('%clang_extdef_map', command=FindTool( 'clang-extdef-mapping'), unresolved='ignore'), ] Index: llvm/utils/lit/lit/llvm/config.py =================================================================== --- llvm/utils/lit/lit/llvm/config.py +++ llvm/utils/lit/lit/llvm/config.py @@ -411,6 +411,7 @@ ToolSubst('%clang_cpp', command=self.config.clang, extra_args=['--driver-mode=cpp']+additional_flags), ToolSubst('%clang_cl', command=self.config.clang, extra_args=['--driver-mode=cl']+additional_flags), ToolSubst('%clangxx', command=self.config.clang, extra_args=['--driver-mode=g++']+additional_flags), + ToolSubst('%scan-build', command='scan-build'), ] self.add_tool_substitutions(tool_substitutions)