diff options
Diffstat (limited to 'lib/Core/AddressSpace.cpp')
-rw-r--r-- | lib/Core/AddressSpace.cpp | 24 |
1 files changed, 15 insertions, 9 deletions
diff --git a/lib/Core/AddressSpace.cpp b/lib/Core/AddressSpace.cpp index bb77f0fc..138119b1 100644 --- a/lib/Core/AddressSpace.cpp +++ b/lib/Core/AddressSpace.cpp @@ -318,14 +318,14 @@ void AddressSpace::copyOutConcrete(const MemoryObject *mo, std::memcpy(address, os->concreteStore, mo->size); } -bool AddressSpace::copyInConcretes() { +bool AddressSpace::copyInConcretes(bool concretize) { for (auto &obj : objects) { const MemoryObject *mo = obj.first; if (!mo->isUserSpecified) { const auto &os = obj.second; - if (!copyInConcrete(mo, os.get(), mo->address)) + if (!copyInConcrete(mo, os.get(), mo->address, concretize)) return false; } } @@ -334,7 +334,7 @@ bool AddressSpace::copyInConcretes() { } bool AddressSpace::copyInConcrete(const MemoryObject *mo, const ObjectState *os, - uint64_t src_address) { + uint64_t src_address, bool concretize) { auto address = reinterpret_cast<std::uint8_t*>(src_address); // Don't do anything if the underlying representation has not been changed @@ -357,12 +357,18 @@ bool AddressSpace::copyInConcrete(const MemoryObject *mo, const ObjectState *os, return true; } - // The object is partially symbolic, it needs to be updated byte-by-byte - // via object state's `write` function - for (size_t i = 0, ie = mo->size; i < ie; ++i) { - u_int8_t external_byte_value = *(address + i); - if (external_byte_value != wos->concreteStore[i]) - wos->write8(i, external_byte_value); + // Check if object should be concretized + if (concretize) { + wos->makeConcrete(); + std::memcpy(wos->concreteStore, address, mo->size); + } else { + // The object is partially symbolic, it needs to be updated byte-by-byte + // via object state's `write` function + for (size_t i = 0, ie = mo->size; i < ie; ++i) { + u_int8_t external_byte_value = *(address + i); + if (external_byte_value != wos->concreteStore[i]) + wos->write8(i, external_byte_value); + } } return true; } |