[analyzer] Re-land 0aba69e "Add test directory for scan-build."

The tool is now looked for in the source directory rather than in the
install directory, which should exclude the problems with not being able
to find it.

The tests still aren't being run on Windows, but they hopefully will run
on other platforms that have shell, which hopefully also means Perl.

Differential Revision: https://reviews.llvm.org/D69781
This commit is contained in:
Artem Dergachev 2019-11-15 14:36:42 -08:00
parent cb7b661d3d
commit 5521236a18
9 changed files with 189 additions and 0 deletions

View File

@ -0,0 +1,9 @@
int main() {
return 0;
}
void function1(int *p) {
if (!p) {
*p = 7; // This will emit a null pointer diagnostic.
}
}

View File

@ -0,0 +1,5 @@
void function2(int *o) {
if (!o) {
*o = 7; // This will emit a null pointer diagnostic.
}
}

View File

@ -0,0 +1,5 @@
int main() {
int *p = 0;
*p = 7; // We expect a diagnostic about this.
return 0;
}

View File

@ -0,0 +1,40 @@
// FIXME: Actually, "perl".
REQUIRES: shell
// FIXME: Should ideally work on Windows.
UNSUPPORTED: system-windows
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.

View File

@ -0,0 +1,24 @@
// FIXME: Actually, "perl".
REQUIRES: shell
// FIXME: Should ideally work on Windows.
UNSUPPORTED: system-windows
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: + core.NullDereference
CHECK: optin.performance.GCDAntipattern
...

View File

@ -0,0 +1,36 @@
// FIXME: Actually, "perl".
REQUIRES: shell
// FIXME: Should ideally work on Windows.
UNSUPPORTED: system-windows
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.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 -->

View File

@ -0,0 +1,18 @@
# -*- Python -*-
import lit.util
import lit.formats
import os
use_lit_shell = os.environ.get("LIT_USE_INTERNAL_SHELL")
config.test_format = lit.formats.ShTest(use_lit_shell == "0")
config.substitutions.append(('%scan-build',
'\'%s\' --use-analyzer=%s ' % (
lit.util.which('scan-build',
os.path.join(
config.clang_src_dir,
'tools',
'scan-build',
'bin')),
config.clang)))

View File

@ -0,0 +1,26 @@
// FIXME: Actually, "perl".
REQUIRES: shell
// FIXME: Should ideally work on Windows.
UNSUPPORTED: system-windows
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

View File

@ -0,0 +1,26 @@
// FIXME: Actually, "perl".
REQUIRES: shell
// FIXME: Should ideally work on Windows.
UNSUPPORTED: system-windows
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>