diff options
author | Julian Büning <julian.buening@comsys.rwth-aachen.de> | 2021-05-06 22:01:30 +0200 |
---|---|---|
committer | MartinNowack <2443641+MartinNowack@users.noreply.github.com> | 2021-05-10 17:48:34 +0100 |
commit | 24badb5bf17ff586dc3f1856901f27210713b2ac (patch) | |
tree | 00368e6c71eda9911768946649fddef855d88cf5 /lib/Core/Executor.h | |
parent | c155cc7132a4d4bff042bf982ee08bf142a21b5e (diff) | |
download | klee-24badb5bf17ff586dc3f1856901f27210713b2ac.tar.gz |
allocate memory objects for functions
Before, we reused the llvm::Function* value in the target program, even though it stems from KLEE's own address space. This leads to non-deterministic function pointers, even with --allocate-determ. This issue was identified in the MoKLEE paper. Now, we allocate a memory object per function, for its (potentially) deterministic address. Mapping this address back to llvm::Functions is done by the legalFunctions map. Also, pointer width now depends on the target, not the host.
Diffstat (limited to 'lib/Core/Executor.h')
-rw-r--r-- | lib/Core/Executor.h | 7 |
1 files changed, 4 insertions, 3 deletions
diff --git a/lib/Core/Executor.h b/lib/Core/Executor.h index ae960731..987edf47 100644 --- a/lib/Core/Executor.h +++ b/lib/Core/Executor.h @@ -34,6 +34,7 @@ #include <memory> #include <set> #include <string> +#include <unordered_map> #include <vector> struct KTest; @@ -164,9 +165,9 @@ private: /// globals that have no representative object (i.e. functions). std::map<const llvm::GlobalValue*, ref<ConstantExpr> > globalAddresses; - /// The set of legal function addresses, used to validate function - /// pointers. We use the actual Function* address as the function address. - std::set<uint64_t> legalFunctions; + /// Map of legal function addresses to the corresponding Function. + /// Used to validate and dereference function pointers. + std::unordered_map<std::uint64_t, llvm::Function*> legalFunctions; /// When non-null the bindings that will be used for calls to /// klee_make_symbolic in order replay. |