diff --git a/docs/bugs_by_version.json b/docs/bugs_by_version.json new file mode 100644 index 000000000..55df848d0 --- /dev/null +++ b/docs/bugs_by_version.json @@ -0,0 +1,297 @@ +{ + "0.1.0": { + "bugs": [ + "IdentityPrecompileReturnIgnored", + "StaleKnowledegAboutSHA3", + "SendFailsForZeroEther", + "DynamicAllocationInfiniteLoop", + "ClearStateOnCodePathJoin", + "CleanBytesHigherOrderBits", + "ArrayAccessCleanHigherOrderBits", + "AncientCompiler" + ], + "released": "2015-07-10" + }, + "0.1.1": { + "bugs": [ + "IdentityPrecompileReturnIgnored", + "StaleKnowledegAboutSHA3", + "SendFailsForZeroEther", + "DynamicAllocationInfiniteLoop", + "ClearStateOnCodePathJoin", + "CleanBytesHigherOrderBits", + "ArrayAccessCleanHigherOrderBits", + "AncientCompiler" + ], + "released": "2015-08-04" + }, + "0.1.2": { + "bugs": [ + "IdentityPrecompileReturnIgnored", + "StaleKnowledegAboutSHA3", + "SendFailsForZeroEther", + "DynamicAllocationInfiniteLoop", + "ClearStateOnCodePathJoin", + "CleanBytesHigherOrderBits", + "ArrayAccessCleanHigherOrderBits", + "AncientCompiler" + ], + "released": "2015-08-20" + }, + "0.1.3": { + "bugs": [ + "IdentityPrecompileReturnIgnored", + "StaleKnowledegAboutSHA3", + "SendFailsForZeroEther", + "DynamicAllocationInfiniteLoop", + "ClearStateOnCodePathJoin", + "CleanBytesHigherOrderBits", + "ArrayAccessCleanHigherOrderBits", + "AncientCompiler" + ], + "released": "2015-09-25" + }, + "0.1.4": { + "bugs": [ + "IdentityPrecompileReturnIgnored", + "StaleKnowledegAboutSHA3", + "SendFailsForZeroEther", + "DynamicAllocationInfiniteLoop", + "ClearStateOnCodePathJoin", + "CleanBytesHigherOrderBits", + "ArrayAccessCleanHigherOrderBits", + "AncientCompiler" + ], + "released": "2015-09-30" + }, + "0.1.5": { + "bugs": [ + "IdentityPrecompileReturnIgnored", + "StaleKnowledegAboutSHA3", + "SendFailsForZeroEther", + "DynamicAllocationInfiniteLoop", + "ClearStateOnCodePathJoin", + "CleanBytesHigherOrderBits", + "ArrayAccessCleanHigherOrderBits", + "AncientCompiler" + ], + "released": "2015-10-07" + }, + "0.1.6": { + "bugs": [ + "IdentityPrecompileReturnIgnored", + "HighOrderByteCleanStorage", + "StaleKnowledegAboutSHA3", + "SendFailsForZeroEther", + "DynamicAllocationInfiniteLoop", + "ClearStateOnCodePathJoin", + "CleanBytesHigherOrderBits", + "ArrayAccessCleanHigherOrderBits", + "AncientCompiler" + ], + "released": "2015-10-16" + }, + "0.1.7": { + "bugs": [ + "IdentityPrecompileReturnIgnored", + "HighOrderByteCleanStorage", + "StaleKnowledegAboutSHA3", + "SendFailsForZeroEther", + "DynamicAllocationInfiniteLoop", + "ClearStateOnCodePathJoin", + "CleanBytesHigherOrderBits", + "ArrayAccessCleanHigherOrderBits", + "AncientCompiler" + ], + "released": "2015-11-17" + }, + "0.2.0": { + "bugs": [ + "IdentityPrecompileReturnIgnored", + "HighOrderByteCleanStorage", + "StaleKnowledegAboutSHA3", + "SendFailsForZeroEther", + "DynamicAllocationInfiniteLoop", + "ClearStateOnCodePathJoin", + "CleanBytesHigherOrderBits", + "ArrayAccessCleanHigherOrderBits", + "AncientCompiler" + ], + "released": "2015-12-02" + }, + "0.2.1": { + "bugs": [ + "IdentityPrecompileReturnIgnored", + "HighOrderByteCleanStorage", + "StaleKnowledegAboutSHA3", + "SendFailsForZeroEther", + "DynamicAllocationInfiniteLoop", + "ClearStateOnCodePathJoin", + "CleanBytesHigherOrderBits", + "ArrayAccessCleanHigherOrderBits", + "AncientCompiler" + ], + "released": "2016-01-30" + }, + "0.2.2": { + "bugs": [ + "IdentityPrecompileReturnIgnored", + "HighOrderByteCleanStorage", + "StaleKnowledegAboutSHA3", + "SendFailsForZeroEther", + "DynamicAllocationInfiniteLoop", + "ClearStateOnCodePathJoin", + "CleanBytesHigherOrderBits", + "ArrayAccessCleanHigherOrderBits", + "AncientCompiler" + ], + "released": "2016-02-17" + }, + "0.3.0": { + "bugs": [ + "IdentityPrecompileReturnIgnored", + "HighOrderByteCleanStorage", + "StaleKnowledegAboutSHA3", + "SendFailsForZeroEther", + "DynamicAllocationInfiniteLoop", + "ClearStateOnCodePathJoin", + "CleanBytesHigherOrderBits", + "ArrayAccessCleanHigherOrderBits" + ], + "released": "2016-03-11" + }, + "0.3.1": { + "bugs": [ + "IdentityPrecompileReturnIgnored", + "HighOrderByteCleanStorage", + "StaleKnowledegAboutSHA3", + "SendFailsForZeroEther", + "DynamicAllocationInfiniteLoop", + "ClearStateOnCodePathJoin", + "CleanBytesHigherOrderBits" + ], + "released": "2016-03-31" + }, + "0.3.2": { + "bugs": [ + "IdentityPrecompileReturnIgnored", + "HighOrderByteCleanStorage", + "StaleKnowledegAboutSHA3", + "SendFailsForZeroEther", + "DynamicAllocationInfiniteLoop", + "ClearStateOnCodePathJoin", + "CleanBytesHigherOrderBits" + ], + "released": "2016-04-18" + }, + "0.3.3": { + "bugs": [ + "IdentityPrecompileReturnIgnored", + "HighOrderByteCleanStorage", + "StaleKnowledegAboutSHA3", + "SendFailsForZeroEther", + "DynamicAllocationInfiniteLoop", + "ClearStateOnCodePathJoin" + ], + "released": "2016-05-27" + }, + "0.3.4": { + "bugs": [ + "IdentityPrecompileReturnIgnored", + "HighOrderByteCleanStorage", + "StaleKnowledegAboutSHA3", + "SendFailsForZeroEther", + "DynamicAllocationInfiniteLoop", + "ClearStateOnCodePathJoin" + ], + "released": "2016-05-31" + }, + "0.3.5": { + "bugs": [ + "IdentityPrecompileReturnIgnored", + "HighOrderByteCleanStorage", + "StaleKnowledegAboutSHA3", + "SendFailsForZeroEther", + "DynamicAllocationInfiniteLoop", + "ClearStateOnCodePathJoin" + ], + "released": "2016-06-10" + }, + "0.3.6": { + "bugs": [ + "IdentityPrecompileReturnIgnored", + "HighOrderByteCleanStorage", + "StaleKnowledegAboutSHA3", + "SendFailsForZeroEther" + ], + "released": "2016-08-10" + }, + "0.4.0": { + "bugs": [ + "IdentityPrecompileReturnIgnored", + "HighOrderByteCleanStorage", + "StaleKnowledegAboutSHA3", + "LibrariesNotCallableFromPayableFunctions" + ], + "released": "2016-09-08" + }, + "0.4.1": { + "bugs": [ + "IdentityPrecompileReturnIgnored", + "HighOrderByteCleanStorage", + "StaleKnowledegAboutSHA3", + "LibrariesNotCallableFromPayableFunctions" + ], + "released": "2016-09-09" + }, + "0.4.10": { + "bugs": [], + "released": "2017-03-15" + }, + "0.4.2": { + "bugs": [ + "IdentityPrecompileReturnIgnored", + "HighOrderByteCleanStorage", + "StaleKnowledegAboutSHA3" + ], + "released": "2016-09-17" + }, + "0.4.3": { + "bugs": [ + "IdentityPrecompileReturnIgnored", + "HighOrderByteCleanStorage" + ], + "released": "2016-10-25" + }, + "0.4.4": { + "bugs": [ + "IdentityPrecompileReturnIgnored" + ], + "released": "2016-10-31" + }, + "0.4.5": { + "bugs": [ + "IdentityPrecompileReturnIgnored", + "StateKnowledgeNotResetForJumpdest" + ], + "released": "2016-11-21" + }, + "0.4.6": { + "bugs": [ + "IdentityPrecompileReturnIgnored" + ], + "released": "2016-11-22" + }, + "0.4.7": { + "bugs": [], + "released": "2016-12-15" + }, + "0.4.8": { + "bugs": [], + "released": "2017-01-13" + }, + "0.4.9": { + "bugs": [], + "released": "2017-01-31" + } +} \ No newline at end of file diff --git a/scripts/update_bugs_by_version.py b/scripts/update_bugs_by_version.py new file mode 100755 index 000000000..c4bc0c9bf --- /dev/null +++ b/scripts/update_bugs_by_version.py @@ -0,0 +1,43 @@ +#!/usr/bin/env python +# +# This script is used to generate the list of bugs per compiler version +# from the list of bugs. +# It updates the list in place and signals failure if there were changes. +# This makes it possible to use this script as part of CI to check +# that the list is up to date. + +import os +import json +import re +import sys + +def comp(version_string): + return [int(c) for c in version_string.split('.')] + +path = os.path.dirname(os.path.realpath(__file__)) +with open(path + '/../docs/bugs.json') as bugsFile: + bugs = json.load(bugsFile) + +versions = {} +with open(path + '/../Changelog.md') as changelog: + for line in changelog: + m = re.search(r'^### (\S+) \((\d+-\d+-\d+)\)$', line) + if m: + versions[m.group(1)] = {} + versions[m.group(1)]['released'] = m.group(2) + +for v in versions: + versions[v]['bugs'] = [] + for bug in bugs: + if 'introduced' in bug and comp(bug['introduced']) > comp(v): + continue + if comp(bug['fixed']) <= comp(v): + continue + versions[v]['bugs'] += [bug['name']] + +with open(path + '/../docs/bugs_by_version.json', 'r+') as bugs_by_version: + old_contents = bugs_by_version.read() + new_contents = json.dumps(versions, sort_keys=True, indent=4) + bugs_by_version.seek(0) + bugs_by_version.write(new_contents) + sys.exit(old_contents != new_contents) \ No newline at end of file diff --git a/test/cmdlineTests.sh b/test/cmdlineTests.sh index 99cac346a..caf09a910 100755 --- a/test/cmdlineTests.sh +++ b/test/cmdlineTests.sh @@ -31,7 +31,10 @@ set -e REPO_ROOT="$(dirname "$0")"/.. SOLC="$REPO_ROOT/build/solc/solc" -# Compile all files in std and examples. +echo "Checking that the bug list is up to date..." +"$REPO_ROOT"/scripts/update_bugs_by_version.py + +echo "Compiling all files in std and examples..." for f in "$REPO_ROOT"/std/*.sol do