Skip to content

Commit ee9903d

Browse files
committed
Do not crash when running AST checks and the document contains null bytes
1 parent 3bdb2ea commit ee9903d

3 files changed

Lines changed: 31 additions & 17 deletions

File tree

CHANGES.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ Changelog
1717

1818
* Correctly report other E12 errors when E123 is ignored. (Issue #103)
1919

20+
* Do not crash when running AST checks and the document contains null bytes.
21+
(Issue #184)
22+
2023

2124
1.4.5 (2013-03-06)
2225
------------------

pep8.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1205,9 +1205,12 @@ def __init__(self, filename=None, lines=None,
12051205

12061206
def report_invalid_syntax(self):
12071207
exc_type, exc = sys.exc_info()[:2]
1208-
offset = exc.args[1]
1209-
if len(offset) > 2:
1210-
offset = offset[1:3]
1208+
if len(exc.args) > 1:
1209+
offset = exc.args[1]
1210+
if len(offset) > 2:
1211+
offset = offset[1:3]
1212+
else:
1213+
offset = (1, 0)
12111214
self.report_error(offset[0], offset[1] or 0,
12121215
'E901 %s: %s' % (exc_type.__name__, exc.args[0]),
12131216
self.report_invalid_syntax)
@@ -1324,7 +1327,7 @@ def check_logical(self):
13241327
def check_ast(self):
13251328
try:
13261329
tree = compile(''.join(self.lines), '', 'exec', PyCF_ONLY_AST)
1327-
except SyntaxError:
1330+
except (SyntaxError, TypeError):
13281331
return self.report_invalid_syntax()
13291332
for name, cls, _ in self._ast_checks:
13301333
checker = cls(tree, self.filename)

testsuite/test_api.py

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,15 @@
1010
E11 = os.path.join(ROOT_DIR, 'testsuite', 'E11.py')
1111

1212

13+
class DummyChecker(object):
14+
def __init__(self, tree, filename):
15+
pass
16+
17+
def run(self):
18+
if False:
19+
yield
20+
21+
1322
class APITestCase(unittest.TestCase):
1423
"""Test the public methods."""
1524

@@ -68,13 +77,6 @@ def check_dummy(logical_line, tokens):
6877
for name, func, args in options.logical_checks))
6978

7079
def test_register_ast_check(self):
71-
class DummyChecker(object):
72-
def __init__(self, tree, filename):
73-
pass
74-
75-
def run(self):
76-
if False:
77-
yield
7880
pep8.register_check(DummyChecker, ['Z701'])
7981

8082
self.assertTrue(DummyChecker in pep8._checks['tree'])
@@ -87,18 +89,14 @@ def run(self):
8789
for name, cls, args in options.ast_checks))
8890

8991
def test_register_invalid_check(self):
90-
class DummyChecker(object):
92+
class InvalidChecker(DummyChecker):
9193
def __init__(self, filename):
9294
pass
9395

94-
def run(self):
95-
if False:
96-
yield
97-
9896
def check_dummy(logical, tokens):
9997
if False:
10098
yield
101-
pep8.register_check(DummyChecker, ['Z741'])
99+
pep8.register_check(InvalidChecker, ['Z741'])
102100
pep8.register_check(check_dummy, ['Z441'])
103101

104102
for checkers in pep8._checks.values():
@@ -306,3 +304,13 @@ def test_styleguide_check_files(self):
306304
self.assertRaises(Exception, pep8style.check_files, [42])
307305
# TODO: runner
308306
# TODO: input_file
307+
308+
def test_check_nullbytes(self):
309+
pep8.register_check(DummyChecker, ['Z701'])
310+
311+
pep8style = pep8.StyleGuide()
312+
count_errors = pep8style.input_file('stdin', lines=['\x00\n'])
313+
314+
self.assertTrue(sys.stdout[0].startswith("stdin:1:1: E901 TypeError"))
315+
self.assertFalse(sys.stderr)
316+
self.assertEqual(count_errors, 1)

0 commit comments

Comments
 (0)