mirror of
https://github.com/Gericom/teak-llvm.git
synced 2025-06-22 13:05:52 -04:00

When growing a body on a body farm, it's essential to use the same redeclaration of the function that's going to be used during analysis. Otherwise our ParmVarDecls won't match the ones that are used to identify argument regions. This boils down to trusting the reasoning in AnalysisDeclContext. We shouldn't canonicalize the declaration before farming the body because it makes us not obey the sophisticated decision-making process of AnalysisDeclContext. Differential Revision: https://reviews.llvm.org/D60899 llvm-svn: 358946
28 lines
1.0 KiB
C
28 lines
1.0 KiB
C
// RUN: %clang_analyze_cc1 -w -analyzer-checker=core,debug.ExprInspection \
|
|
// RUN: -analyzer-output=text -verify %s
|
|
|
|
int OSAtomicCompareAndSwapPtrBarrier(*, *, **);
|
|
int OSAtomicCompareAndSwapPtrBarrier() {
|
|
// There is some body in the actual header,
|
|
// but we should trust our BodyFarm instead.
|
|
}
|
|
|
|
int *invalidSLocOnRedecl() {
|
|
// Was crashing when trying to throw a report about returning an uninitialized
|
|
// value to the caller. FIXME: We should probably still throw that report,
|
|
// something like "The "compare" part of CompareAndSwap depends on an
|
|
// undefined value".
|
|
int *b;
|
|
OSAtomicCompareAndSwapPtrBarrier(0, 0, &b); // no-crash
|
|
return b;
|
|
}
|
|
|
|
void testThatItActuallyWorks() {
|
|
void *x = 0;
|
|
int res = OSAtomicCompareAndSwapPtrBarrier(0, &x, &x);
|
|
clang_analyzer_eval(res); // expected-warning{{TRUE}}
|
|
// expected-note@-1{{TRUE}}
|
|
clang_analyzer_eval(x == &x); // expected-warning{{TRUE}}
|
|
// expected-note@-1{{TRUE}}
|
|
}
|