mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Detect var being assigned in inline assembly block
This commit is contained in:
parent
2528ff31ee
commit
0cb4bd9308
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user