mirror of
https://github.com/ethereum/solidity
synced 2023-10-03 13:03:40 +00:00
Merge pull request #2990 from ethereum/someMoreSMTStuff
Basic SMT tests.
This commit is contained in:
commit
f6fb7d96d3
@ -49,13 +49,6 @@ env:
|
|||||||
|
|
||||||
matrix:
|
matrix:
|
||||||
include:
|
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
|
- os: linux
|
||||||
dist: trusty
|
dist: trusty
|
||||||
sudo: required
|
sudo: required
|
||||||
|
@ -71,7 +71,7 @@ build_script:
|
|||||||
test_script:
|
test_script:
|
||||||
- cd %APPVEYOR_BUILD_FOLDER%
|
- cd %APPVEYOR_BUILD_FOLDER%
|
||||||
- cd %APPVEYOR_BUILD_FOLDER%\build\test\%CONFIGURATION%
|
- cd %APPVEYOR_BUILD_FOLDER%\build\test\%CONFIGURATION%
|
||||||
- soltest.exe --show-progress -- --no-ipc
|
- soltest.exe --show-progress -- --no-ipc --no-smt
|
||||||
|
|
||||||
artifacts:
|
artifacts:
|
||||||
- path: solidity-windows.zip
|
- path: solidity-windows.zip
|
||||||
|
@ -64,9 +64,11 @@ Running the compiler tests
|
|||||||
==========================
|
==========================
|
||||||
|
|
||||||
Solidity includes different types of tests. They are included in the application
|
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``.
|
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``.
|
||||||
|
|
||||||
|
@ -72,28 +72,21 @@ void Z3Interface::addAssertion(Expression const& _expr)
|
|||||||
|
|
||||||
pair<CheckResult, vector<string>> Z3Interface::check(vector<Expression> const& _expressionsToEvaluate)
|
pair<CheckResult, vector<string>> Z3Interface::check(vector<Expression> const& _expressionsToEvaluate)
|
||||||
{
|
{
|
||||||
// cout << "---------------------------------" << endl;
|
|
||||||
// cout << m_solver << endl;
|
|
||||||
CheckResult result;
|
CheckResult result;
|
||||||
switch (m_solver.check())
|
switch (m_solver.check())
|
||||||
{
|
{
|
||||||
case z3::check_result::sat:
|
case z3::check_result::sat:
|
||||||
result = CheckResult::SATISFIABLE;
|
result = CheckResult::SATISFIABLE;
|
||||||
cout << "sat" << endl;
|
|
||||||
break;
|
break;
|
||||||
case z3::check_result::unsat:
|
case z3::check_result::unsat:
|
||||||
result = CheckResult::UNSATISFIABLE;
|
result = CheckResult::UNSATISFIABLE;
|
||||||
cout << "unsat" << endl;
|
|
||||||
break;
|
break;
|
||||||
case z3::check_result::unknown:
|
case z3::check_result::unknown:
|
||||||
result = CheckResult::UNKNOWN;
|
result = CheckResult::UNKNOWN;
|
||||||
cout << "unknown" << endl;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
solAssert(false, "");
|
solAssert(false, "");
|
||||||
}
|
}
|
||||||
// cout << "---------------------------------" << endl;
|
|
||||||
|
|
||||||
|
|
||||||
vector<string> values;
|
vector<string> values;
|
||||||
if (result != CheckResult::UNSATISFIABLE)
|
if (result != CheckResult::UNSATISFIABLE)
|
||||||
|
@ -256,15 +256,6 @@ case $(uname -s) in
|
|||||||
#------------------------------------------------------------------------------
|
#------------------------------------------------------------------------------
|
||||||
# Ubuntu
|
# 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)
|
Ubuntu)
|
||||||
@ -320,6 +311,14 @@ case $(uname -s) in
|
|||||||
libboost-all-dev \
|
libboost-all-dev \
|
||||||
"$install_z3"
|
"$install_z3"
|
||||||
if [ "$CI" = true ]; then
|
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.
|
# Install 'eth', for use in the Solidity Tests-over-IPC.
|
||||||
# We will not use this 'eth', but its dependencies
|
# We will not use this 'eth', but its dependencies
|
||||||
sudo add-apt-repository -y ppa:ethereum/ethereum
|
sudo add-apt-repository -y ppa:ethereum/ethereum
|
||||||
|
@ -45,6 +45,8 @@ Options::Options()
|
|||||||
showMessages = true;
|
showMessages = true;
|
||||||
else if (string(suite.argv[i]) == "--no-ipc")
|
else if (string(suite.argv[i]) == "--no-ipc")
|
||||||
disableIPC = true;
|
disableIPC = true;
|
||||||
|
else if (string(suite.argv[i]) == "--no-smt")
|
||||||
|
disableSMT = true;
|
||||||
|
|
||||||
if (!disableIPC && ipcPath.empty())
|
if (!disableIPC && ipcPath.empty())
|
||||||
if (auto path = getenv("ETH_TEST_IPC"))
|
if (auto path = getenv("ETH_TEST_IPC"))
|
||||||
|
@ -35,6 +35,7 @@ struct Options: boost::noncopyable
|
|||||||
bool showMessages = false;
|
bool showMessages = false;
|
||||||
bool optimize = false;
|
bool optimize = false;
|
||||||
bool disableIPC = false;
|
bool disableIPC = false;
|
||||||
|
bool disableSMT = false;
|
||||||
|
|
||||||
static Options const& get();
|
static Options const& get();
|
||||||
|
|
||||||
|
@ -39,6 +39,17 @@
|
|||||||
|
|
||||||
using namespace boost::unit_test;
|
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*/[] )
|
test_suite* init_unit_test_suite( int /*argc*/, char* /*argv*/[] )
|
||||||
{
|
{
|
||||||
master_test_suite_t& master = framework::master_test_suite();
|
master_test_suite_t& master = framework::master_test_suite();
|
||||||
@ -57,12 +68,10 @@ test_suite* init_unit_test_suite( int /*argc*/, char* /*argv*/[] )
|
|||||||
"SolidityEndToEndTest",
|
"SolidityEndToEndTest",
|
||||||
"SolidityOptimizer"
|
"SolidityOptimizer"
|
||||||
})
|
})
|
||||||
{
|
removeTestSuite(suite);
|
||||||
auto id = master.get(suite);
|
|
||||||
assert(id != INV_TEST_UNIT_ID);
|
|
||||||
master.remove(id);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if (dev::test::Options::get().disableSMT)
|
||||||
|
removeTestSuite("SMTChecker");
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
86
test/libsolidity/SMTChecker.cpp
Normal file
86
test/libsolidity/SMTChecker.cpp
Normal file
@ -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()
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user