Relax assertion in SValuator so that we don't crash when analyzing a call via a function pointer that

casts the return value to something completely different.  While we need better reasoning here,
we should definately not crash.

llvm-svn: 119177
This commit is contained in:
Ted Kremenek 2010-11-15 20:09:42 +00:00
parent 2a3c22efba
commit db73d599b7
2 changed files with 22 additions and 1 deletions

View File

@ -122,7 +122,18 @@ SVal SValuator::EvalCast(SVal val, QualType castTy, QualType originalTy) {
// FIXME: We should handle the case where we strip off view layers to get
// to a desugared type.
assert(Loc::IsLocType(castTy));
if (!Loc::IsLocType(castTy)) {
// FIXME: There can be gross cases where one casts the result of a function
// (that returns a pointer) to some other value that happens to fit
// within that pointer value. We currently have no good way to
// model such operations. When this happens, the underlying operation
// is that the caller is reasoning about bits. Conceptually we are
// layering a "view" of a location on top of those bits. Perhaps
// we need to be more lazy about mutual possible views, even on an
// SVal? This may be necessary for bit-level reasoning as well.
return UnknownVal();
}
// We get a symbolic function pointer for a dereference of a function
// pointer, but it is of function type. Example:

View File

@ -1193,3 +1193,13 @@ void pr5272_test() {
(*(struct pr5272*)0xBC000000).var2 += 2; // no-warning
}
// Support casting the return value of function to another different type
// This previously caused a crash, although we likely need more precise
// reasoning here. <rdar://problem/8663544>
void* rdar8663544();
typedef struct {} Val8663544;
Val8663544 bazR8663544() {
Val8663544(*func) () = (Val8663544(*) ()) rdar8663544;
return func();
}