in include/HashedAbstractEnvironment.h [262:290]
bool leq(const MapValue& other) const override {
if (other.m_map.size() > m_map.size()) {
// In this case, there is a variable bound to a non-Top value in 'other'
// that is not defined in 'this' (and is therefore implicitly bound to
// Top).
return false;
}
for (const auto& binding : m_map) {
auto it = other.m_map.find(binding.first);
if (it == other.m_map.end()) {
// The other value is Top.
continue;
}
if (!binding.second.leq(it->second)) {
return false;
}
}
// Now we look for a variable appearing in 'other' that is not defined in
// 'this' (and thus bound to Top).
for (const auto& binding : other.m_map) {
auto it = m_map.find(binding.first);
if (it == m_map.end()) {
// The value is Top, but we know by construction that binding.second is
// not Top.
return false;
}
}
return true;
}