astroid icon indicating copy to clipboard operation
astroid copied to clipboard

ValueError when pretty-printing node while handling RecursionError

Open correctmost opened this issue 9 months ago • 0 comments

Steps to reproduce

The following code triggers a ValueError in astroid:

class c(c&()):
    _
class aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa(c&()):
    _

This bug was discovered by OSS-Fuzz: https://issues.oss-fuzz.com/issues/423673973 (report not public yet)

Current behavior

[...snip...]

RecursionError: maximum recursion depth exceeded

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "pylint/pylint/lint/pylinter.py", line 994, in get_ast
    return MANAGER.ast_from_file(filepath, modname, source=True)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "astroid/astroid/manager.py", line 165, in ast_from_file
    return AstroidBuilder(self).file_build(filepath, modname)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "astroid/astroid/builder.py", line 145, in file_build
    return self._post_build(module, builder, encoding)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "astroid/astroid/builder.py", line 173, in _post_build
    module = self._manager.visit_transforms(module)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "astroid/astroid/manager.py", line 129, in visit_transforms
    return self._transform.visit(node)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "astroid/astroid/transforms.py", line 162, in visit
    return self._visit(node)
           ^^^^^^^^^^^^^^^^^
  File "astroid/astroid/transforms.py", line 84, in _visit
    visited = self._visit_generic(value)
              ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "astroid/astroid/transforms.py", line 112, in _visit_generic
    return [self._visit_generic(child) for child in node]
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "astroid/astroid/transforms.py", line 112, in <listcomp>
    return [self._visit_generic(child) for child in node]
            ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "astroid/astroid/transforms.py", line 123, in _visit_generic
    f"Astroid was unable to transform {node}.\n"
  File "astroid/astroid/nodes/node_ng.py", line 201, in __str__
    lines = pprint.pformat(value, indent=2, width=width).splitlines(True)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "~/.local/share/uv/python/cpython-3.11.13-linux-x86_64-gnu/lib/python3.11/pprint.py", line 60, in pformat
    return PrettyPrinter(indent=indent, width=width, depth=depth,
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "~/.local/share/uv/python/cpython-3.11.13-linux-x86_64-gnu/lib/python3.11/pprint.py", line 142, in __init__
    raise ValueError('width must be != 0')
ValueError: width must be != 0

Expected behavior

No crash

Version

580d17cd55af78

correctmost avatar Jun 11 '25 02:06 correctmost