[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
This commit is contained in:
@@ -0,0 +1,9 @@
|
||||
int main() {
|
||||
return 0;
|
||||
}
|
||||
|
||||
void function1(int *p) {
|
||||
if (!p) {
|
||||
*p = 7; // This will emit a null pointer diagnostic.
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
void function2(int *o) {
|
||||
if (!o) {
|
||||
*o = 7; // This will emit a null pointer diagnostic.
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
int main() {
|
||||
int *p = 0;
|
||||
*p = 7; // We expect a diagnostic about this.
|
||||
return 0;
|
||||
}
|
||||
34
clang/test/Analysis/scan-build/exclude_directories.test
Normal file
34
clang/test/Analysis/scan-build/exclude_directories.test
Normal file
@@ -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.
|
||||
|
||||
18
clang/test/Analysis/scan-build/help.test
Normal file
18
clang/test/Analysis/scan-build/help.test
Normal file
@@ -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
|
||||
...
|
||||
|
||||
|
||||
|
||||
30
clang/test/Analysis/scan-build/html_output.test
Normal file
30
clang/test/Analysis/scan-build/html_output.test
Normal file
@@ -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 -->
|
||||
20
clang/test/Analysis/scan-build/plist_html_output.test
Normal file
20
clang/test/Analysis/scan-build/plist_html_output.test
Normal file
@@ -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
|
||||
20
clang/test/Analysis/scan-build/plist_output.test
Normal file
20
clang/test/Analysis/scan-build/plist_output.test
Normal file
@@ -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>
|
||||
@@ -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'),
|
||||
]
|
||||
|
||||
|
||||
@@ -411,6 +411,7 @@ class LLVMConfig(object):
|
||||
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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user