| // 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: %normalize_plist <%t.plist | diff -ub %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}} |
| } |