Artem Dergachev | e2a8e43 | 2019-04-23 02:50:38 +0000 | [diff] [blame] | 1 | // RUN: %clang_analyze_cc1 -w -analyzer-checker=core,debug.ExprInspection \ |
| 2 | // RUN: -analyzer-output=text -verify %s |
| 3 | |
| 4 | int OSAtomicCompareAndSwapPtrBarrier(*, *, **); |
| 5 | int OSAtomicCompareAndSwapPtrBarrier() { |
| 6 | // There is some body in the actual header, |
| 7 | // but we should trust our BodyFarm instead. |
| 8 | } |
| 9 | |
| 10 | int *invalidSLocOnRedecl() { |
Artem Dergachev | 727d6ca | 2019-04-23 02:56:00 +0000 | [diff] [blame] | 11 | // Was crashing when trying to throw a report about returning an uninitialized |
| 12 | // value to the caller. FIXME: We should probably still throw that report, |
| 13 | // something like "The "compare" part of CompareAndSwap depends on an |
| 14 | // undefined value". |
| 15 | int *b; |
Artem Dergachev | e2a8e43 | 2019-04-23 02:50:38 +0000 | [diff] [blame] | 16 | OSAtomicCompareAndSwapPtrBarrier(0, 0, &b); // no-crash |
Artem Dergachev | 727d6ca | 2019-04-23 02:56:00 +0000 | [diff] [blame] | 17 | return b; |
| 18 | } |
Artem Dergachev | e2a8e43 | 2019-04-23 02:50:38 +0000 | [diff] [blame] | 19 | |
Artem Dergachev | 727d6ca | 2019-04-23 02:56:00 +0000 | [diff] [blame] | 20 | void testThatItActuallyWorks() { |
| 21 | void *x = 0; |
| 22 | int res = OSAtomicCompareAndSwapPtrBarrier(0, &x, &x); |
| 23 | clang_analyzer_eval(res); // expected-warning{{TRUE}} |
| 24 | // expected-note@-1{{TRUE}} |
| 25 | clang_analyzer_eval(x == &x); // expected-warning{{TRUE}} |
| 26 | // expected-note@-1{{TRUE}} |
Artem Dergachev | e2a8e43 | 2019-04-23 02:50:38 +0000 | [diff] [blame] | 27 | } |