aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorchriseth <chris@ethereum.org>2017-10-04 20:56:24 +0800
committerGitHub <noreply@github.com>2017-10-04 20:56:24 +0800
commitf6fb7d96d3eb0d45ee93fbe25f01cb9f06b28b78 (patch)
tree7816b6b544ea0794032deed0f14e15f0dfc8057b
parent22f112fc13e8d609435e53e18a66d0b0664b5c44 (diff)
parentfefdfc0711e1637df91ef0ec813af0c30ad53af6 (diff)
downloaddexon-solidity-f6fb7d96d3eb0d45ee93fbe25f01cb9f06b28b78.tar.gz
dexon-solidity-f6fb7d96d3eb0d45ee93fbe25f01cb9f06b28b78.tar.zst
dexon-solidity-f6fb7d96d3eb0d45ee93fbe25f01cb9f06b28b78.zip
Merge pull request #2990 from ethereum/someMoreSMTStuff
Basic SMT tests.
-rw-r--r--.travis.yml7
-rw-r--r--appveyor.yml2
-rw-r--r--docs/contributing.rst6
-rw-r--r--libsolidity/formal/Z3Interface.cpp7
-rwxr-xr-xscripts/install_deps.sh17
-rw-r--r--test/TestHelper.cpp2
-rw-r--r--test/TestHelper.h1
-rw-r--r--test/boostTest.cpp19
-rw-r--r--test/libsolidity/SMTChecker.cpp86
9 files changed, 116 insertions, 31 deletions
diff --git a/.travis.yml b/.travis.yml
index c30e3e0f..708d3620 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -49,13 +49,6 @@ env:
matrix:
include:
- # Ubuntu 14.04 LTS "Trusty Tahr"
- # https://en.wikipedia.org/wiki/List_of_Ubuntu_releases#Ubuntu_14.04_LTS_.28Trusty_Tahr.29
- #
- # TravisCI doesn't directly support any new Ubuntu releases. These is
- # some Docker support, which we should probably investigate, at least for
- # Ubuntu 16.04 LTS "Xenial Xerus"
- # See https://en.wikipedia.org/wiki/List_of_Ubuntu_releases#Ubuntu_16.04_LTS_.28Xenial_Xerus.29.
- os: linux
dist: trusty
sudo: required
diff --git a/appveyor.yml b/appveyor.yml
index 3d4d65bb..b50681b9 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -71,7 +71,7 @@ build_script:
test_script:
- cd %APPVEYOR_BUILD_FOLDER%
- cd %APPVEYOR_BUILD_FOLDER%\build\test\%CONFIGURATION%
- - soltest.exe --show-progress -- --no-ipc
+ - soltest.exe --show-progress -- --no-ipc --no-smt
artifacts:
- path: solidity-windows.zip
diff --git a/docs/contributing.rst b/docs/contributing.rst
index 01caa5b1..0f7c3e72 100644
--- a/docs/contributing.rst
+++ b/docs/contributing.rst
@@ -64,9 +64,11 @@ Running the compiler tests
==========================
Solidity includes different types of tests. They are included in the application
-called ``soltest``. Some of them require the ``cpp-ethereum`` client in testing mode.
+called ``soltest``. Some of them require the ``cpp-ethereum`` client in testing mode,
+some others require ``libz3`` to be installed.
-To run a subset of the tests that do not require ``cpp-ethereum``, use ``./build/test/soltest -- --no-ipc``.
+To disable the z3 tests, use ``./build/test/soltest -- --no-smt`` and
+to run a subset of the tests that do not require ``cpp-ethereum``, use ``./build/test/soltest -- --no-ipc``.
For all other tests, you need to install `cpp-ethereum <https://github.com/ethereum/cpp-ethereum/releases/download/solidityTester/eth>`_ and run it in testing mode: ``eth --test -d /tmp/testeth``.
diff --git a/libsolidity/formal/Z3Interface.cpp b/libsolidity/formal/Z3Interface.cpp
index 522928f0..fbbd7a58 100644
--- a/libsolidity/formal/Z3Interface.cpp
+++ b/libsolidity/formal/Z3Interface.cpp
@@ -72,28 +72,21 @@ void Z3Interface::addAssertion(Expression const& _expr)
pair<CheckResult, vector<string>> Z3Interface::check(vector<Expression> const& _expressionsToEvaluate)
{
-// cout << "---------------------------------" << endl;
-// cout << m_solver << endl;
CheckResult result;
switch (m_solver.check())
{
case z3::check_result::sat:
result = CheckResult::SATISFIABLE;
- cout << "sat" << endl;
break;
case z3::check_result::unsat:
result = CheckResult::UNSATISFIABLE;
- cout << "unsat" << endl;
break;
case z3::check_result::unknown:
result = CheckResult::UNKNOWN;
- cout << "unknown" << endl;
break;
default:
solAssert(false, "");
}
-// cout << "---------------------------------" << endl;
-
vector<string> values;
if (result != CheckResult::UNSATISFIABLE)
diff --git a/scripts/install_deps.sh b/scripts/install_deps.sh
index 3a1abe10..01dee81d 100755
--- a/scripts/install_deps.sh
+++ b/scripts/install_deps.sh
@@ -256,15 +256,6 @@ case $(uname -s) in
#------------------------------------------------------------------------------
# Ubuntu
#
-# TODO - I wonder whether all of the Ubuntu-variants need some special
-# treatment?
-#
-# TODO - We should also test this code on Ubuntu Server, Ubuntu Snappy Core
-# and Ubuntu Phone.
-#
-# TODO - Our Ubuntu build is only working for amd64 and i386 processors.
-# It would be good to add armel, armhf and arm64.
-# See https://github.com/ethereum/webthree-umbrella/issues/228.
#------------------------------------------------------------------------------
Ubuntu)
@@ -320,6 +311,14 @@ case $(uname -s) in
libboost-all-dev \
"$install_z3"
if [ "$CI" = true ]; then
+ # install Z3 from PPA if the distribution does not provide it
+ if ! dpkg -l libz3-dev > /dev/null 2>&1
+ then
+ sudo apt-add-repository -y ppa:hvr/z3
+ sudo apt-get -y update
+ sudo apt-get -y install libz3-dev
+ fi
+
# Install 'eth', for use in the Solidity Tests-over-IPC.
# We will not use this 'eth', but its dependencies
sudo add-apt-repository -y ppa:ethereum/ethereum
diff --git a/test/TestHelper.cpp b/test/TestHelper.cpp
index 094b59c6..c8747a06 100644
--- a/test/TestHelper.cpp
+++ b/test/TestHelper.cpp
@@ -45,6 +45,8 @@ Options::Options()
showMessages = true;
else if (string(suite.argv[i]) == "--no-ipc")
disableIPC = true;
+ else if (string(suite.argv[i]) == "--no-smt")
+ disableSMT = true;
if (!disableIPC && ipcPath.empty())
if (auto path = getenv("ETH_TEST_IPC"))
diff --git a/test/TestHelper.h b/test/TestHelper.h
index d50568ad..d25c5cd8 100644
--- a/test/TestHelper.h
+++ b/test/TestHelper.h
@@ -35,6 +35,7 @@ struct Options: boost::noncopyable
bool showMessages = false;
bool optimize = false;
bool disableIPC = false;
+ bool disableSMT = false;
static Options const& get();
diff --git a/test/boostTest.cpp b/test/boostTest.cpp
index d8c5b678..7b452e06 100644
--- a/test/boostTest.cpp
+++ b/test/boostTest.cpp
@@ -39,6 +39,17 @@
using namespace boost::unit_test;
+namespace
+{
+void removeTestSuite(std::string const& _name)
+{
+ master_test_suite_t& master = framework::master_test_suite();
+ auto id = master.get(_name);
+ assert(id != INV_TEST_UNIT_ID);
+ master.remove(id);
+}
+}
+
test_suite* init_unit_test_suite( int /*argc*/, char* /*argv*/[] )
{
master_test_suite_t& master = framework::master_test_suite();
@@ -57,12 +68,10 @@ test_suite* init_unit_test_suite( int /*argc*/, char* /*argv*/[] )
"SolidityEndToEndTest",
"SolidityOptimizer"
})
- {
- auto id = master.get(suite);
- assert(id != INV_TEST_UNIT_ID);
- master.remove(id);
- }
+ removeTestSuite(suite);
}
+ if (dev::test::Options::get().disableSMT)
+ removeTestSuite("SMTChecker");
return 0;
}
diff --git a/test/libsolidity/SMTChecker.cpp b/test/libsolidity/SMTChecker.cpp
new file mode 100644
index 00000000..d58f296f
--- /dev/null
+++ b/test/libsolidity/SMTChecker.cpp
@@ -0,0 +1,86 @@
+/*
+ This file is part of solidity.
+
+ solidity is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ solidity is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with solidity. If not, see <http://www.gnu.org/licenses/>.
+*/
+/**
+ * Unit tests for the SMT checker.
+ */
+
+#include <test/libsolidity/AnalysisFramework.h>
+
+#include <boost/test/unit_test.hpp>
+
+#include <string>
+
+using namespace std;
+
+namespace dev
+{
+namespace solidity
+{
+namespace test
+{
+
+class SMTCheckerFramework: public AnalysisFramework
+{
+public:
+ SMTCheckerFramework()
+ {
+ m_warningsToFilter.push_back("Experimental features are turned on.");
+ }
+
+protected:
+ virtual std::pair<SourceUnit const*, std::shared_ptr<Error const>>
+ parseAnalyseAndReturnError(
+ std::string const& _source,
+ bool _reportWarnings = false,
+ bool _insertVersionPragma = true,
+ bool _allowMultipleErrors = false
+ )
+ {
+ return AnalysisFramework::parseAnalyseAndReturnError(
+ "pragma experimental SMTChecker;\n" + _source,
+ _reportWarnings,
+ _insertVersionPragma,
+ _allowMultipleErrors
+ );
+ }
+};
+
+BOOST_FIXTURE_TEST_SUITE(SMTChecker, SMTCheckerFramework)
+
+BOOST_AUTO_TEST_CASE(smoke_test)
+{
+ string text = R"(
+ contract C { }
+ )";
+ CHECK_SUCCESS_NO_WARNINGS(text);
+}
+
+BOOST_AUTO_TEST_CASE(simple_overflow)
+{
+ string text = R"(
+ contract C {
+ function f(uint a, uint b) public pure returns (uint) { return a + b; }
+ }
+ )";
+ CHECK_WARNING(text, "Overflow (resulting value larger than");
+}
+
+BOOST_AUTO_TEST_SUITE_END()
+
+}
+}
+}