diff options
author | chriseth <chris@ethereum.org> | 2017-10-04 20:56:24 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-10-04 20:56:24 +0800 |
commit | f6fb7d96d3eb0d45ee93fbe25f01cb9f06b28b78 (patch) | |
tree | 7816b6b544ea0794032deed0f14e15f0dfc8057b | |
parent | 22f112fc13e8d609435e53e18a66d0b0664b5c44 (diff) | |
parent | fefdfc0711e1637df91ef0ec813af0c30ad53af6 (diff) | |
download | dexon-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.yml | 7 | ||||
-rw-r--r-- | appveyor.yml | 2 | ||||
-rw-r--r-- | docs/contributing.rst | 6 | ||||
-rw-r--r-- | libsolidity/formal/Z3Interface.cpp | 7 | ||||
-rwxr-xr-x | scripts/install_deps.sh | 17 | ||||
-rw-r--r-- | test/TestHelper.cpp | 2 | ||||
-rw-r--r-- | test/TestHelper.h | 1 | ||||
-rw-r--r-- | test/boostTest.cpp | 19 | ||||
-rw-r--r-- | test/libsolidity/SMTChecker.cpp | 86 |
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() + +} +} +} |