Detect var being assigned in inline assembly block

This commit is contained in:
Matheus Aguiar 2023-09-20 16:58:19 -03:00
parent 2528ff31ee
commit 0cb4bd9308

View File

@ -24,6 +24,8 @@
#include <liblangutil/SemVerHandler.h> #include <liblangutil/SemVerHandler.h>
#include <libsolutil/Algorithms.h> #include <libsolutil/Algorithms.h>
#include <libsolutil/FunctionSelector.h> #include <libsolutil/FunctionSelector.h>
#include <libyul/optimiser/ASTWalker.h>
#include <libyul/AST.h>
#include <memory> #include <memory>
@ -432,6 +434,23 @@ struct ReservedErrorSelector: public PostTypeChecker::Checker
} }
}; };
class YulLValueChecker : public solidity::yul::ASTWalker
{
public:
YulLValueChecker(ASTString const& _identifierName): m_identifierName(_identifierName) {}
bool willBeWrittenTo() { return m_willBeWrittenTo; }
using solidity::yul::ASTWalker::operator();
void operator()(solidity::yul::Assignment const& _assignment) override
{
for (auto const& yulIdentifier: _assignment.variableNames)
if (yulIdentifier.name.str() == m_identifierName)
m_willBeWrittenTo = true;
}
private:
ASTString const& m_identifierName;
bool m_willBeWrittenTo = false;
};
class LValueChecker: public ASTConstVisitor class LValueChecker: public ASTConstVisitor
{ {
public: public:
@ -448,6 +467,12 @@ public:
) )
m_willBeWrittenTo = true; m_willBeWrittenTo = true;
} }
void endVisit(InlineAssembly const& _inlineAssembly) override
{
YulLValueChecker yulChecker{m_declaration->name()};
yulChecker(_inlineAssembly.operations());
m_willBeWrittenTo = yulChecker.willBeWrittenTo();
}
private: private:
Declaration const* m_declaration{}; Declaration const* m_declaration{};
bool m_willBeWrittenTo = false; bool m_willBeWrittenTo = false;