diff options
| author | Devin Coughlin <dcoughlin@apple.com> | 2019-11-04 20:26:35 -0800 |
|---|---|---|
| committer | Devin Coughlin <dcoughlin@apple.com> | 2019-11-04 20:26:35 -0800 |
| commit | 0aba69eb1a01c44185009f50cc633e3c648e9950 (patch) | |
| tree | 043c87856cb4bead0f6d212cef2a10b3a56137a2 /clang/test | |
| parent | 4264e7bbfdb30ed8fe1e0907bfa25e4d1bb04207 (diff) | |
| download | bcm5719-llvm-0aba69eb1a01c44185009f50cc633e3c648e9950.tar.gz bcm5719-llvm-0aba69eb1a01c44185009f50cc633e3c648e9950.zip | |
[analyzer] Add test directory for scan-build.
The static analyzer's scan-build script is critical infrastructure but
is not well tested. To start to address this, add a new test directory under
tests/Analysis for scan-build lit tests and seed it with several tests. The
goal is that future scan-build changes will be accompanied by corresponding
tests.
Differential Revision: https://reviews.llvm.org/D69781
Diffstat (limited to 'clang/test')
9 files changed, 142 insertions, 1 deletions
diff --git a/clang/test/Analysis/scan-build/Inputs/multidirectory_project/directory1/file1.c b/clang/test/Analysis/scan-build/Inputs/multidirectory_project/directory1/file1.c new file mode 100644 index 00000000000..7fffb69e01a --- /dev/null +++ b/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. + } +} diff --git a/clang/test/Analysis/scan-build/Inputs/multidirectory_project/directory2/file2.c b/clang/test/Analysis/scan-build/Inputs/multidirectory_project/directory2/file2.c new file mode 100644 index 00000000000..ed0e1721233 --- /dev/null +++ b/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. + } +} diff --git a/clang/test/Analysis/scan-build/Inputs/single_null_dereference.c b/clang/test/Analysis/scan-build/Inputs/single_null_dereference.c new file mode 100644 index 00000000000..21a43dfd08a --- /dev/null +++ b/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; +} diff --git a/clang/test/Analysis/scan-build/exclude_directories.test b/clang/test/Analysis/scan-build/exclude_directories.test new file mode 100644 index 00000000000..db53a34aa65 --- /dev/null +++ b/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. + diff --git a/clang/test/Analysis/scan-build/help.test b/clang/test/Analysis/scan-build/help.test new file mode 100644 index 00000000000..4d1972b7065 --- /dev/null +++ b/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 command> [build options] + +... + +CHECK: AVAILABLE CHECKERS: +... +CHECK: optin.performance.GCDAntipattern +CHECK: + osx.API +... + + + diff --git a/clang/test/Analysis/scan-build/html_output.test b/clang/test/Analysis/scan-build/html_output.test new file mode 100644 index 00000000000..07aa481fae1 --- /dev/null +++ b/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: <!-- REPORTBUG id="report-{{.*}}.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: <!-- BUGTYPE Dereference of null pointer --> diff --git a/clang/test/Analysis/scan-build/plist_html_output.test b/clang/test/Analysis/scan-build/plist_html_output.test new file mode 100644 index 00000000000..ed26b272246 --- /dev/null +++ b/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 diff --git a/clang/test/Analysis/scan-build/plist_output.test b/clang/test/Analysis/scan-build/plist_output.test new file mode 100644 index 00000000000..1ee331b8d0e --- /dev/null +++ b/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: <key>type</key><string>Dereference of null pointer</string> diff --git a/clang/test/lit.cfg.py b/clang/test/lit.cfg.py index 1ffb6d094d7..88803466b8b 100644 --- a/clang/test/lit.cfg.py +++ b/clang/test/lit.cfg.py @@ -62,7 +62,7 @@ tool_dirs = [config.clang_tools_dir, config.llvm_tools_dir] 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'), ] |

