forked from OSchip/llvm-project
[CFLAA] Fix a use-of-invalid-pointer bug.
As shown in the diff, we used to add to CFLAA's cache by doing `Cache[Fn] = buildSetsFrom(Fn)`. `buildSetsFrom(Fn)` may cause `Cache` to reallocate its underlying storage, if this happens and `Cache[Fn]` was evaluated prior to `buildSetsFrom(Fn)`, then we'll store the result to a bad address. Patch by Jia Chen. llvm-svn: 268269
This commit is contained in:
parent
0eace0bae5
commit
6edb891c8e
|
@ -994,7 +994,12 @@ void CFLAAResult::scan(Function *Fn) {
|
||||||
assert(InsertPair.second &&
|
assert(InsertPair.second &&
|
||||||
"Trying to scan a function that has already been cached");
|
"Trying to scan a function that has already been cached");
|
||||||
|
|
||||||
Cache[Fn] = buildSetsFrom(Fn);
|
// Note that we can't do Cache[Fn] = buildSetsFrom(Fn) here: the function call
|
||||||
|
// may get evaluated after operator[], potentially triggering a DenseMap
|
||||||
|
// resize and invalidating the reference returned by operator[]
|
||||||
|
auto FunInfo = buildSetsFrom(Fn);
|
||||||
|
Cache[Fn] = std::move(FunInfo);
|
||||||
|
|
||||||
Handles.push_front(FunctionHandle(Fn, this));
|
Handles.push_front(FunctionHandle(Fn, this));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue