aboutsummaryrefslogtreecommitdiffstats
path: root/libsolidity/interface/CompilerStack.cpp
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2018-05-15 03:05:50 +0800
committerGitHub <noreply@github.com>2018-05-15 03:05:50 +0800
commit7f97995e11ebfbbd76df4d792a358793ae5f9cc4 (patch)
tree1a9af2c7a182d8633a2b2c104bd52fa3acac3b8c /libsolidity/interface/CompilerStack.cpp
parent8f17f7219aec4586961af41b9bdd1804b3d59aa5 (diff)
parentd7d71a14dfa7ab6f51842c086c25b9e7a2d9b19a (diff)
downloaddexon-solidity-7f97995e11ebfbbd76df4d792a358793ae5f9cc4.tar
dexon-solidity-7f97995e11ebfbbd76df4d792a358793ae5f9cc4.tar.gz
dexon-solidity-7f97995e11ebfbbd76df4d792a358793ae5f9cc4.tar.bz2
dexon-solidity-7f97995e11ebfbbd76df4d792a358793ae5f9cc4.tar.lz
dexon-solidity-7f97995e11ebfbbd76df4d792a358793ae5f9cc4.tar.xz
dexon-solidity-7f97995e11ebfbbd76df4d792a358793ae5f9cc4.tar.zst
dexon-solidity-7f97995e11ebfbbd76df4d792a358793ae5f9cc4.zip
Merge pull request #4057 from ethereum/cfg
Control flow graph for uninitialized storage return detection.
Diffstat (limited to 'libsolidity/interface/CompilerStack.cpp')
-rw-r--r--libsolidity/interface/CompilerStack.cpp18
1 files changed, 18 insertions, 0 deletions
diff --git a/libsolidity/interface/CompilerStack.cpp b/libsolidity/interface/CompilerStack.cpp
index 4ff14aa2..47dc30cf 100644
--- a/libsolidity/interface/CompilerStack.cpp
+++ b/libsolidity/interface/CompilerStack.cpp
@@ -29,6 +29,8 @@
#include <libsolidity/ast/AST.h>
#include <libsolidity/parsing/Scanner.h>
#include <libsolidity/parsing/Parser.h>
+#include <libsolidity/analysis/ControlFlowAnalyzer.h>
+#include <libsolidity/analysis/ControlFlowGraph.h>
#include <libsolidity/analysis/GlobalContext.h>
#include <libsolidity/analysis/NameAndTypeResolver.h>
#include <libsolidity/analysis/TypeChecker.h>
@@ -224,6 +226,22 @@ bool CompilerStack::analyze()
if (noErrors)
{
+ CFG cfg(m_errorReporter);
+ for (Source const* source: m_sourceOrder)
+ if (!cfg.constructFlow(*source->ast))
+ noErrors = false;
+
+ if (noErrors)
+ {
+ ControlFlowAnalyzer controlFlowAnalyzer(cfg, m_errorReporter);
+ for (Source const* source: m_sourceOrder)
+ if (!controlFlowAnalyzer.analyze(*source->ast))
+ noErrors = false;
+ }
+ }
+
+ if (noErrors)
+ {
StaticAnalyzer staticAnalyzer(m_errorReporter);
for (Source const* source: m_sourceOrder)
if (!staticAnalyzer.analyze(*source->ast))