| 1 | // RUN: %clang_analyze_cc1 %s -analyzer-output=text -verify \ |
| 2 | // RUN: -analyzer-checker=core,alpha.nondeterminism.PointerSorting |
| 3 | |
| 4 | #include "Inputs/system-header-simulator-cxx.h" |
| 5 | |
| 6 | bool f(int x) { return true; } |
| 7 | bool g(int *x) { return true; } |
| 8 | |
| 9 | void PointerSorting() { |
| 10 | int a = 1, b = 2; |
| 11 | std::vector<int> V1 = {a, b}; |
| 12 | std::vector<int *> V2 = {&a, &b}; |
| 13 | |
| 14 | std::is_sorted(V1.begin(), V1.end()); // no-warning |
| 15 | std::nth_element(V1.begin(), V1.begin() + 1, V1.end()); // no-warning |
| 16 | std::partial_sort(V1.begin(), V1.begin() + 1, V1.end()); // no-warning |
| 17 | std::sort(V1.begin(), V1.end()); // no-warning |
| 18 | std::stable_sort(V1.begin(), V1.end()); // no-warning |
| 19 | std::partition(V1.begin(), V1.end(), f); // no-warning |
| 20 | std::stable_partition(V1.begin(), V1.end(), g); // no-warning |
| 21 | |
| 22 | std::is_sorted(V2.begin(), V2.end()); // expected-warning {{Sorting pointer-like elements can result in non-deterministic ordering}} [alpha.nondeterminism.PointerSorting] |
| 23 | // expected-note@-1 {{Sorting pointer-like elements can result in non-deterministic ordering}} [alpha.nondeterminism.PointerSorting] |
| 24 | std::nth_element(V2.begin(), V2.begin() + 1, V2.end()); // expected-warning {{Sorting pointer-like elements can result in non-deterministic ordering}} [alpha.nondeterminism.PointerSorting] |
| 25 | // expected-note@-1 {{Sorting pointer-like elements can result in non-deterministic ordering}} [alpha.nondeterminism.PointerSorting] |
| 26 | std::partial_sort(V2.begin(), V2.begin() + 1, V2.end()); // expected-warning {{Sorting pointer-like elements can result in non-deterministic ordering}} [alpha.nondeterminism.PointerSorting] |
| 27 | // expected-note@-1 {{Sorting pointer-like elements can result in non-deterministic ordering}} [alpha.nondeterminism.PointerSorting] |
| 28 | std::sort(V2.begin(), V2.end()); // expected-warning {{Sorting pointer-like elements can result in non-deterministic ordering}} [alpha.nondeterminism.PointerSorting] |
| 29 | // expected-note@-1 {{Sorting pointer-like elements can result in non-deterministic ordering}} [alpha.nondeterminism.PointerSorting] |
| 30 | std::stable_sort(V2.begin(), V2.end()); // expected-warning {{Sorting pointer-like elements can result in non-deterministic ordering}} [alpha.nondeterminism.PointerSorting] |
| 31 | // expected-note@-1 {{Sorting pointer-like elements can result in non-deterministic ordering}} [alpha.nondeterminism.PointerSorting] |
| 32 | std::partition(V2.begin(), V2.end(), f); // expected-warning {{Sorting pointer-like elements can result in non-deterministic ordering}} [alpha.nondeterminism.PointerSorting] |
| 33 | // expected-note@-1 {{Sorting pointer-like elements can result in non-deterministic ordering}} [alpha.nondeterminism.PointerSorting] |
| 34 | std::stable_partition(V2.begin(), V2.end(), g); // expected-warning {{Sorting pointer-like elements can result in non-deterministic ordering}} [alpha.nondeterminism.PointerSorting] |
| 35 | // expected-note@-1 {{Sorting pointer-like elements can result in non-deterministic ordering}} [alpha.nondeterminism.PointerSorting] |
| 36 | } |
| 37 | |