diff options
| author | KyleMiles <krm504@nyu.edu> | 2021-11-01 23:32:36 -0400 |
|---|---|---|
| committer | KyleMiles <krm504@nyu.edu> | 2021-11-11 16:16:38 -0500 |
| commit | cf762601b42ae4365d271c3825d59720718047a2 (patch) | |
| tree | 8876abd90dd1303d843327766edf83daa3361ae6 | |
| parent | 2c75c418ea472fca237df5b8f80e47c9cbe35467 (diff) | |
Add Function::GetMediumLevelILSSAVariables and Function::GetHighLevelILSSAVariables to the C++ API
| -rw-r--r-- | binaryninjaapi.h | 2 | ||||
| -rw-r--r-- | function.cpp | 54 |
2 files changed, 53 insertions, 3 deletions
diff --git a/binaryninjaapi.h b/binaryninjaapi.h index 2d567bba..dd443c80 100644 --- a/binaryninjaapi.h +++ b/binaryninjaapi.h @@ -3547,8 +3547,10 @@ __attribute__ ((format (printf, 1, 2))) std::map<Variable, VariableNameAndType> GetVariables(); std::set<Variable> GetMediumLevelILVariables(); std::set<Variable> GetMediumLevelILAliasedVariables(); + std::set<SSAVariable> GetMediumLevelILSSAVariables(); std::set<Variable> GetHighLevelILVariables(); std::set<Variable> GetHighLevelILAliasedVariables(); + std::set<SSAVariable> GetHighLevelILSSAVariables(); void CreateAutoVariable(const Variable& var, const Confidence<Ref<Type>>& type, const std::string& name, bool ignoreDisjointUses = false); diff --git a/function.cpp b/function.cpp index 20c978ac..1f649191 100644 --- a/function.cpp +++ b/function.cpp @@ -1098,7 +1098,7 @@ map<Variable, VariableNameAndType> Function::GetVariables() BNVariableNameAndType* vars = BNGetFunctionVariables(m_object, &count); map<Variable, VariableNameAndType> result; - for (size_t i = 0; i < count; i++) + for (size_t i = 0; i < count; ++i) { VariableNameAndType var; var.name = vars[i].name; @@ -1115,7 +1115,7 @@ map<Variable, VariableNameAndType> Function::GetVariables() set<Variable> Function::GetMediumLevelILVariables() { - auto mlil = this->GetMediumLevelIL(); + Ref<MediumLevelILFunction> mlil = this->GetMediumLevelIL(); if (!mlil) return {}; @@ -1149,9 +1149,33 @@ set<Variable> Function::GetMediumLevelILAliasedVariables() } +set<SSAVariable> Function::GetMediumLevelILSSAVariables() +{ + Ref<MediumLevelILFunction> mlil = this->GetMediumLevelIL(); + if (!mlil) + return {}; + + size_t count; + BNVariable* vars = BNGetMediumLevelILVariables(mlil->GetObject(), &count); + + set<SSAVariable> result; + for (size_t i = 0; i < count; ++i) + { + size_t versionCount; + size_t* versions = BNGetMediumLevelILVariableSSAVersions(mlil->GetObject(), &vars[i], &versionCount); + for (size_t j = 0; j < versionCount; ++j) + result.emplace(vars[i], versions[j]); + BNFreeILInstructionList(versions); + } + + BNFreeVariableList(vars); + return result; +} + + set<Variable> Function::GetHighLevelILVariables() { - auto hlil = this->GetHighLevelIL(); + Ref<HighLevelILFunction> hlil = this->GetHighLevelIL(); if (!hlil) return {}; @@ -1185,6 +1209,30 @@ set<Variable> Function::GetHighLevelILAliasedVariables() } +set<SSAVariable> Function::GetHighLevelILSSAVariables() +{ + Ref<HighLevelILFunction> hlil = this->GetHighLevelIL(); + if (!hlil) + return {}; + + size_t count; + BNVariable* vars = BNGetHighLevelILVariables(hlil->GetObject(), &count); + + set<SSAVariable> result; + for (size_t i = 0; i < count; ++i) + { + size_t versionCount; + size_t* versions = BNGetHighLevelILVariableSSAVersions(hlil->GetObject(), &vars[i], &versionCount); + for (size_t j = 0; j < versionCount; ++j) + result.emplace(vars[i], versions[j]); + BNFreeILInstructionList(versions); + } + + BNFreeVariableList(vars); + return result; +} + + void Function::CreateAutoVariable(const Variable& var, const Confidence<Ref<Type>>& type, const string& name, bool ignoreDisjointUses) { |
