[tools] Replaced disassemble_pyc by pydisasm.

- pydisasm handles many types of bytecode.
This commit is contained in:
Andrew Hamilton 2017-07-11 14:09:07 +01:00
parent 75c7db0f17
commit 5572cdc9d6
6 changed files with 65 additions and 150 deletions

2
BUGS
View file

@ -9,7 +9,6 @@ Current
Current (tool related) Current (tool related)
- disassemble for python doesn't always work.
- gut had an error with utf-8. A traceback printed directly on the screen, - gut had an error with utf-8. A traceback printed directly on the screen,
garbling the interface. garbling the interface.
- There is much less code coverage than I expect from vigil.py, tools.py - There is much less code coverage than I expect from vigil.py, tools.py
@ -252,6 +251,7 @@ Fixed
place on the screen. place on the screen.
- Sometimes git_blame produces an error, depending on characters in its - Sometimes git_blame produces an error, depending on characters in its
input. input.
- disassemble for python doesn't always work.
Won't fix Won't fix

View file

@ -26,7 +26,7 @@ then to run:
Extensions | Tools Extensions | Tools
---------- | ----- ---------- | -----
.py | [python_syntax](https://en.wikipedia.org/wiki/Python_syntax_and_semantics) • [python_unittests](https://docs.python.org/3/library/unittest.html) • [pydoc](https://docs.python.org/3/library/pydoc.html) • [mypy](http://www.mypy-lang.org/) • [python_coverage](http://nedbatchelder.com/code/coverage/) • [pycodestyle](https://pypi.python.org/pypi/pycodestyle) • [pyflakes](https://launchpad.net/pyflakes) • [pylint](http://www.pylint.org/) • [python_gut](https://github.com/ahamilton/vigil/blob/master/gut.py) • [python_modulefinder](https://docs.python.org/3/library/modulefinder.html) • [python_mccabe](https://github.com/flintwork/mccabe) • [bandit](https://wiki.openstack.org/wiki/Security/Projects/Bandit) .py | [python_syntax](https://en.wikipedia.org/wiki/Python_syntax_and_semantics) • [python_unittests](https://docs.python.org/3/library/unittest.html) • [pydoc](https://docs.python.org/3/library/pydoc.html) • [mypy](http://www.mypy-lang.org/) • [python_coverage](http://nedbatchelder.com/code/coverage/) • [pycodestyle](https://pypi.python.org/pypi/pycodestyle) • [pyflakes](https://launchpad.net/pyflakes) • [pylint](http://www.pylint.org/) • [python_gut](https://github.com/ahamilton/vigil/blob/master/gut.py) • [python_modulefinder](https://docs.python.org/3/library/modulefinder.html) • [python_mccabe](https://github.com/flintwork/mccabe) • [bandit](https://wiki.openstack.org/wiki/Security/Projects/Bandit)
.pyc | [disassemble_pyc](https://docs.python.org/3/library/dis.html) .pyc | [pydisasm](https://pypi.python.org/pypi/xdis)
.pl .pm .t | [perl_syntax](https://en.wikipedia.org/wiki/Perl) • [perldoc](http://perldoc.perl.org/) • [perltidy](http://perltidy.sourceforge.net/) .pl .pm .t | [perl_syntax](https://en.wikipedia.org/wiki/Perl) • [perldoc](http://perldoc.perl.org/) • [perltidy](http://perltidy.sourceforge.net/)
.pod .pod6 | [perldoc](http://perldoc.perl.org/) .pod .pod6 | [perldoc](http://perldoc.perl.org/)
.java | [uncrustify](https://github.com/uncrustify/uncrustify) .java | [uncrustify](https://github.com/uncrustify/uncrustify)

View file

@ -1,132 +0,0 @@
>> 0 <238> 3340
>> 3 UNARY_POSITIVE
>> 4 BUILD_TUPLE_UNPACK 46083
7 YIELD_VALUE
8 INPLACE_FLOOR_DIVIDE
9 <0>
10 <0>
11 <0>
12 <227> 0
15 <0>
>> 16 <0>
17 <0>
18 <0>
19 <0>
20 <0>
21 <0>
22 <0>
23 <0>
24 <0>
25 ROT_TWO
26 <0>
27 <0>
28 <0>
29 BINARY_AND
30 <0>
31 <0>
32 <0>
33 POP_JUMP_IF_TRUE 16
36 <0>
37 <0>
38 LOAD_CONST 0 (0)
41 LOAD_CONST 1 (1)
44 MAKE_FUNCTION 0
47 STORE_NAME 0 (0)
50 LOAD_CONST 2 (2)
53 RETURN_VALUE
54 <41>
55 ROT_THREE
56 <99> 0
59 <0>
60 <0>
61 <0>
62 <0>
63 <0>
64 <0>
65 <0>
66 <0>
67 <0>
68 <0>
69 ROT_TWO
70 <0>
71 <0>
72 <0>
73 INPLACE_POWER
74 <0>
75 <0>
76 <0>
77 POP_JUMP_IF_TRUE 14
80 <0>
81 <0>
82 LOAD_GLOBAL 0 (0)
85 LOAD_CONST 1 (1)
88 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
91 POP_TOP
92 LOAD_CONST 0 (0)
95 RETURN_VALUE
96 <41>
97 ROT_TWO
98 INPLACE_XOR
99 <218> 26626
102 BUILD_MAP 297
105 <218> 28677
108 POP_JUMP_IF_FALSE 28265
111 LOAD_GLOBAL 169 (169)
114 POP_JUMP_IF_FALSE 3
117 <0>
118 <0>
119 POP_JUMP_IF_FALSE 3
122 <0>
123 <0>
124 <250> 11790
127 <47>
128 BUILD_MAP 28782
131 <117> 12148
134 BUILD_SET 13161
137 <46>
138 JUMP_IF_TRUE_OR_POP 29305
141 POP_TOP
142 <0>
143 <0>
144 <0>
145 ROT_THREE
146 <0>
147 <0>
148 <0>
149 POP_JUMP_IF_TRUE 2
152 <0>
153 <0>
154 <0>
155 POP_TOP
156 POP_JUMP_IF_FALSE 1
159 <0>
160 <0>
161 INPLACE_XOR
162 <41>
163 POP_TOP
164 POP_JUMP_IF_FALSE 1
167 <0>
168 <0>
169 POP_JUMP_IF_FALSE 3
172 <0>
173 <0>
174 POP_JUMP_IF_FALSE 3
177 <0>
178 <0>
179 POP_JUMP_IF_FALSE 3
182 <0>
183 <0>
184 POP_JUMP_IF_FALSE 4
187 <0>
188 <0>
189 <218> 15368
192 IMPORT_FROM 25711 (25711)
195 <117> 25964
198 BINARY_LSHIFT
199 ROT_THREE
200 <0>
201 <0>
202 <0>
203 POP_JUMP_IF_TRUE 0
206 <0>
207 <0>

View file

@ -0,0 +1,48 @@
# pydisasm version 3.5.0
# Python bytecode 3.4 (3310)
# Disassembled from Python 3.5.3 (default, Jan 19 2017, 14:11:04)
# [GCC 6.3.0 20170118]
# Timestamp in code: 1454637976 (2016-02-05 02:06:16)
# Source code size mod 2**32: 28 bytes
# Method Name: <module>
# Filename: ./input/hi3.py
# Argument count: 0
# Kw-only arguments: 0
# Number of locals: 0
# Stack size: 2
# Flags: 0x00000040 (NOFREE)
# First Line: 3
# Constants:
# 0: <code object hi at 0x7fa4cc9cc300, file "./input/hi3.py", line 3>
# 1: 'hi'
# 2: None
# Names:
# 0: hi
3: 0 LOAD_CONST 0 (<code object hi at 0x7fa4cc9cc300, file "./input/hi3.py", line 3>)
3 LOAD_CONST 1 ('hi')
6 MAKE_FUNCTION 0 (0 positional, 0 name and default, 0 annotations)
9 STORE_NAME 0 (hi)
12 LOAD_CONST 2 (None)
15 RETURN_VALUE
# Method Name: hi
# Filename: ./input/hi3.py
# Argument count: 0
# Kw-only arguments: 0
# Number of locals: 0
# Stack size: 2
# Flags: 0x00000043 (NOFREE | NEWLOCALS | OPTIMIZED)
# First Line: 3
# Constants:
# 0: None
# 1: 'hi'
# Names:
# 0: print
4: 0 LOAD_GLOBAL 0 (print)
3 LOAD_CONST 1 ('hi')
6 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
9 POP_TOP
10 LOAD_CONST 0 (None)
13 RETURN_VALUE

View file

@ -134,9 +134,10 @@ class ToolsTestCase(unittest.TestCase):
self._test_tool(tools.bandit, [("hi3.py", tools.Status.ok), self._test_tool(tools.bandit, [("hi3.py", tools.Status.ok),
("hi.py", tools.Status.ok)]) ("hi.py", tools.Status.ok)])
def test_disassemble_pyc(self): # FIX: Make the golden-file deterministic
self._test_tool(tools.disassemble_pyc, # def test_pydisasm(self):
[("hi3.cpython-34.pyc", tools.Status.normal)]) # self._test_tool(tools.pydisasm,
# [("hi3.cpython-34.pyc", tools.Status.normal)])
def test_perl_syntax(self): def test_perl_syntax(self):
self._test_tool(tools.perl_syntax, self._test_tool(tools.perl_syntax,

View file

@ -120,17 +120,18 @@ def _do_command(command, timeout=None, **kwargs):
return _fix_input(stdout), _fix_input(stderr), process.returncode return _fix_input(stdout), _fix_input(stderr), process.returncode
def _run_command(command, status_text=Status.ok): def _run_command(command, success_status=Status.ok,
status, output = status_text, "" error_status=Status.problem):
status, output = success_status, ""
try: try:
process = subprocess.Popen(command, stdout=subprocess.PIPE, process = subprocess.Popen(command, stdout=subprocess.PIPE,
stderr=subprocess.PIPE) stderr=subprocess.PIPE)
stdout, stderr = process.communicate() stdout, stderr = process.communicate()
output = stdout + stderr output = stdout + stderr
except subprocess.CalledProcessError: except subprocess.CalledProcessError:
status = Status.problem status = error_status
if process.returncode != 0: if process.returncode != 0:
status = Status.problem status = error_status
return status, fill3.Text(_fix_input(output)) return status, fill3.Text(_fix_input(output))
@ -471,14 +472,11 @@ def python_tidy(path): # Deps: found on internet?
return Status.normal, _syntax_highlight_using_path(stdout, path) return Status.normal, _syntax_highlight_using_path(stdout, path)
@deps(url="https://docs.python.org/3/library/dis.html") @deps(deps={"pip3/xdis"}, executables={"pydisasm"},
def disassemble_pyc(path): url="https://pypi.python.org/pypi/xdis")
with open(path, "rb") as file_: def pydisasm(path):
bytecode = file_.read() return _run_command(["pydisasm", path], Status.normal,
stringio = io.StringIO() Status.not_applicable)
dis.dis(bytecode, file=stringio)
stringio.seek(0)
return Status.normal, fill3.Text(stringio.read())
@deps(deps={"python-bandit", "python3-bandit"}, fedora_deps={"bandit"}, @deps(deps={"python-bandit", "python3-bandit"}, fedora_deps={"bandit"},
@ -854,7 +852,7 @@ TOOLS_FOR_EXTENSIONS = \
(["py"], [python_syntax, python_unittests, pydoc, mypy, (["py"], [python_syntax, python_unittests, pydoc, mypy,
python_coverage, pycodestyle, pyflakes, pylint, python_gut, python_coverage, pycodestyle, pyflakes, pylint, python_gut,
python_modulefinder, python_mccabe, bandit]), python_modulefinder, python_mccabe, bandit]),
(["pyc"], [disassemble_pyc]), (["pyc"], [pydisasm]),
(["pl", "pm", "t"], [perl_syntax, perldoc, perltidy]), (["pl", "pm", "t"], [perl_syntax, perldoc, perltidy]),
# (["p6", "pm6"], [perl6_syntax, perldoc]), # (["p6", "pm6"], [perl6_syntax, perldoc]),
(["pod", "pod6"], [perldoc]), (["pod", "pod6"], [perldoc]),