The current argument order has "expected" and "actual" the wrong way around, so that the diff shows the change from expected to actual, not from actual to expected. Namely, if the expected diagnostics contains the string "foo", but the analyzer emits "bar", we really want to see: ``` - foo + bar ``` not ``` - bar + foo ``` since adapting to most changes would require applying that diff to the expected output. Differential Revision: https://reviews.llvm.org/D56340 llvm-svn: 350866
105 lines
2.1 KiB
C++
105 lines
2.1 KiB
C++
// RUN: %clang_analyze_cc1 -std=c++11 -analyzer-checker=core -analyzer-output=plist-multi-file -o %t.plist -verify -analyzer-config eagerly-assume=false %s
|
|
// RUN: cat %t.plist | %diff_plist %S/Inputs/expected-plists/cxx-for-range.cpp.plist -
|
|
|
|
extern void work();
|
|
|
|
void testLoop() {
|
|
int z[] = {1,2};
|
|
for (int y : z) {
|
|
work();
|
|
work();
|
|
if (y == 2)
|
|
*(volatile int *)0 = 1; // expected-warning {{Dereference of null pointer}}
|
|
work();
|
|
work();
|
|
(void)y;
|
|
}
|
|
|
|
*(volatile int *)0 = 1; // no-warning
|
|
}
|
|
|
|
class MagicVector {
|
|
public:
|
|
MagicVector();
|
|
|
|
using iterator = int *;
|
|
|
|
iterator begin() const;
|
|
iterator end() const;
|
|
};
|
|
|
|
MagicVector get(bool fail = false) {
|
|
if (fail)
|
|
*(volatile int *)0 = 1; // expected-warning {{Dereference of null pointer}}
|
|
return MagicVector{};
|
|
}
|
|
|
|
void testLoopOpaqueCollection() {
|
|
for (int y : get()) {
|
|
work();
|
|
work();
|
|
if (y == 2)
|
|
*(volatile int *)0 = 1; // expected-warning {{Dereference of null pointer}}
|
|
work();
|
|
work();
|
|
(void)y;
|
|
}
|
|
|
|
*(volatile int *)0 = 1; // expected-warning {{Dereference of null pointer}}
|
|
}
|
|
|
|
|
|
class MagicVector2 {
|
|
public:
|
|
MagicVector2();
|
|
|
|
class iterator {
|
|
public:
|
|
int operator*() const;
|
|
iterator &operator++();
|
|
bool operator==(const iterator &);
|
|
bool operator!=(const iterator &);
|
|
};
|
|
|
|
iterator begin() const;
|
|
iterator end() const;
|
|
};
|
|
|
|
MagicVector2 get2() {
|
|
return MagicVector2{};
|
|
}
|
|
|
|
void testLoopOpaqueIterator() {
|
|
for (int y : get2()) {
|
|
work();
|
|
work();
|
|
if (y == 2)
|
|
*(volatile int *)0 = 1; // expected-warning {{Dereference of null pointer}}
|
|
work();
|
|
work();
|
|
(void)y;
|
|
}
|
|
|
|
*(volatile int *)0 = 1; // expected-warning {{Dereference of null pointer}}
|
|
}
|
|
|
|
|
|
void testLoopErrorInRange() {
|
|
for (int y : get(true)) { // error inside get()
|
|
work();
|
|
work();
|
|
if (y == 2)
|
|
*(volatile int *)0 = 1; // no-warning
|
|
work();
|
|
work();
|
|
(void)y;
|
|
}
|
|
|
|
*(volatile int *)0 = 1; // no-warning
|
|
}
|
|
|
|
void testForRangeInit() {
|
|
for (int *arr[3] = {nullptr, nullptr, nullptr}; int *p : arr) // expected-warning {{extension}}
|
|
*p = 1; // expected-warning {{Dereference of null pointer}}
|
|
}
|