Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
41 changes: 36 additions & 5 deletions .github/workflows/CITest.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,50 @@ env:
CI: true
jobs:
tests:
runs-on: ubuntu-20.04
name: build_test on ubuntu 20.04
runs-on: ${{ matrix.os }}
name: Python ${{ matrix.python-version }} on ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
os: [ubuntu-18.04, ubuntu-20.04]
python-version: [2.7, 3.6, 3.9]
exclude:
- os: ubuntu-18.04
python-version: 3.9

steps:
- uses: actions/checkout@v2

- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: ${{ matrix.python-version }}

- name: prepare
shell: 'script -q -e -c "bash {0}"'
run: |
export LD_LIBRARY_PATH=`pwd`/tests/:$LD_LIBRARY_PATH
wget https://github.com/groundx/capstonefuzz/raw/master/corpus/corpus-libFuzzer-capstone_fuzz_disasmnext-latest.zip
unzip -q corpus-libFuzzer-capstone_fuzz_disasmnext-latest.zip -d suite/fuzz
git clone https://git.cryptomilk.org/projects/cmocka.git suite/cstest/cmocka
chmod +x suite/cstest/build_cstest.sh

- name: make
shell: 'script -q -e -c "bash {0}"'
run: |
./make.sh
make check
sudo make install

- name: build python binding
shell: 'script -q -e -c "bash {0}"'
run: |
cp libcapstone.so.* bindings/python/libcapstone.so
cd tests
chmod +x ./test_all.sh
./test_all.sh
cd bindings/python && make check; cd ../..;

- name: cstest
shell: 'script -q -e -c "bash {0}"'
run: |
cd suite/cstest && ./build_cstest.sh;
python cstest_report.py -D -t build/cstest -d ../MC;
python cstest_report.py -D -t build/cstest -f issues.cs; cd ..;
4 changes: 3 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,7 @@ xcode/Capstone.xcodeproj/xcuserdata
xcode/Capstone.xcodeproj/project.xcworkspace/xcuserdata

# suite/
corpus-libFuzzer-capstone_fuzz_disasmnext-latest.zip
test_arm_regression
test_arm_regression.o
fuzz_harness
Expand All @@ -119,7 +120,8 @@ fuzz_bindisasm
fuzz_disasm
fuzz_decode_platform
capstone_get_setup

suite/fuzz/
suite/cstest/cmocka/

*.s

Expand Down
63 changes: 42 additions & 21 deletions bindings/python/test_evm.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,26 +4,47 @@

from __future__ import print_function
from capstone import *
import sys

from xprint import to_hex

CODE = "\x60\x61\x50"
cs = Cs(CS_ARCH_EVM, 0)
cs.detail = True

print("Platform: EVM")
print("Code: %s" %to_hex(CODE))
print("Disasm:")

for i in cs.disasm(CODE, 0x80001000):
print("0x%x:\t%s\t%s" %(i.address, i.mnemonic, i.op_str))
if i.pop > 0:
print("\tPop: %u" %i.pop)
if i.push > 0:
print("\tPush: %u" %i.push)
if i.fee > 0:
print("\tGas fee: %u" %i.fee)
if len(i.groups) > 0:
print("\tGroups: ", end=''),
for m in i.groups:
print("%s " % i.group_name(m), end=''),
print()
_python3 = sys.version_info.major == 3


EVM_CODE = b"\x60\x61\x50"

all_tests = (
(CS_ARCH_EVM, 0, EVM_CODE, "EVM"),
)


def test_class():
address = 0x80001000
for (arch, mode, code, comment) in all_tests:
print("Platform: %s" % comment)
print("Code: %s " % to_hex(code))
print("Disasm:")

try:
md = Cs(arch, mode)
md.detail = True
for i in md.disasm(code, address):
print("0x%x:\t%s\t%s" %(i.address, i.mnemonic, i.op_str))
if i.pop > 0:
print("\tPop: %u" %i.pop)
if i.push > 0:
print("\tPush: %u" %i.push)
if i.fee > 0:
print("\tGas fee: %u" %i.fee)
if len(i.groups) > 0:
print("\tGroups: ", end=''),
for m in i.groups:
print("%s " % i.group_name(m), end=''),
print()

except CsError as e:
print("ERROR: %s" % e.__str__())


if __name__ == '__main__':
test_class()
Empty file modified suite/cstest/build_cstest.sh
100644 → 100755
Empty file.
23 changes: 14 additions & 9 deletions suite/cstest/cstest_report.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,11 @@
from pprint import pprint as ppr
import os

_python3 = sys.version_info.major == 3


def Usage(s):
print 'Usage: {} -t <cstest_path> [-f <file_name.cs>] [-d <directory>]'.format(s)
print('Usage: {} -t <cstest_path> [-f <file_name.cs>] [-d <directory>]'.format(s))
sys.exit(-1)

def get_report_file(toolpath, filepath, getDetails, cmt_out):
Expand All @@ -19,8 +21,11 @@ def get_report_file(toolpath, filepath, getDetails, cmt_out):

# stdout
failed_tests = []
# print '---> stdout\n', stdout
# print '---> stderr\n', stderr
if _python3:
stdout = bytes.decode(stdout)
stderr = bytes.decode(stderr)
# print('---> stdout\n', stdout)
# print('---> stderr\n', stderr)
matches = re.finditer(r'\[\s+RUN\s+\]\s+(.*)\n\[\s+FAILED\s+\]', stdout)
for match in matches:
failed_tests.append(match.group(1))
Expand All @@ -41,12 +46,12 @@ def get_report_file(toolpath, filepath, getDetails, cmt_out):
counter += 1
else:
continue
print '\n[-] There are/is {} failed test(s)'.format(len(details))
print('\n[-] There are/is {} failed test(s)'.format(len(details)))
if len(details) > 0 and getDetails:
print '[-] Detailed report for {}:\n'.format(filepath)
print('[-] Detailed report for {}:\n'.format(filepath))
for c, f, d in details:
print '\t[+] {}: {}\n\t\t{}\n'.format(f, c, d)
print '\n'
print('\t[+] {}: {}\n\t\t{}\n'.format(f, c, d))
print('\n')
return 0
elif len(details) > 0:
for c, f, d in details:
Expand All @@ -58,7 +63,7 @@ def get_report_file(toolpath, filepath, getDetails, cmt_out):
rm_proc = Popen(tmp_cmd2, stdout=PIPE, stderr=PIPE)
rm_proc.communicate()

return 0;
return 0
return 1

def get_report_folder(toolpath, folderpath, details, cmt_out):
Expand All @@ -67,7 +72,7 @@ def get_report_folder(toolpath, folderpath, details, cmt_out):
path = root.split(os.sep)
for f in files:
if f.split('.')[-1] == 'cs':
print '[-] Target:', f,
print('[-] Target:', f,)
result *= get_report_file(toolpath, os.sep.join(x for x in path) + os.sep + f, details, cmt_out)

sys.exit(result ^ 1)
Expand Down
2 changes: 1 addition & 1 deletion suite/test_all.sh
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@

# syntax: test_all.sh <name>

./test_archs.py > /tmp/$1_arch
# ./test_archs.py > /tmp/$1_arch
./test_c.sh $1_c
34 changes: 21 additions & 13 deletions suite/test_c.sh
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,24 @@
# Run all the Python tests, and send the output that to a file to be compared later
# This is useful when we want to verify if a commit (wrongly) changes the disassemble result.

../tests/test > /tmp/$1
../tests/test_detail >> /tmp/$1
../tests/test_skipdata >> /tmp/$1
../tests/test_iter >> /tmp/$1
../tests/test_arm >> /tmp/$1
../tests/test_arm64 >> /tmp/$1
../tests/test_mips >> /tmp/$1
../tests/test_ppc >> /tmp/$1
../tests/test_sparc >> /tmp/$1
../tests/test_x86 >> /tmp/$1
../tests/test_systemz >> /tmp/$1
../tests/test_xcore >> /tmp/$1
../tests/test_riscv >> /tmp/$1
../tests/test_arm > /tmp/$1
../tests/test_arm64 > /tmp/$1
../tests/test_basic > /tmp/$1
../tests/test_bpf > /tmp/$1
../tests/test_customized_mnem > /tmp/$1
../tests/test_detail > /tmp/$1
../tests/test_evm > /tmp/$1
../tests/test_iter > /tmp/$1
../tests/test_m680x > /tmp/$1
../tests/test_m68k > /tmp/$1
../tests/test_mips > /tmp/$1
../tests/test_mos65xx > /tmp/$1
../tests/test_ppc > /tmp/$1
../tests/test_skipdata > /tmp/$1
../tests/test_sparc > /tmp/$1
../tests/test_systemz > /tmp/$1
../tests/test_tms320c64x > /tmp/$1
../tests/test_wasm > /tmp/$1
../tests/test_winkernel > /tmp/$1
../tests/test_x86 > /tmp/$1
../tests/test_xcore > /tmp/$1