From c96b27379dc8e91fd2ab53b2b868cdb9c419525c Mon Sep 17 00:00:00 2001 From: mahaloz Date: Thu, 22 Jan 2026 09:39:19 -0700 Subject: [PATCH 1/2] Bump pycparser like: https://github.com/angr/angr/commit/4fdc89b755e8ad6027d52064f18f3c81fe38561e --- libbs/__init__.py | 2 +- libbs/api/type_parser.py | 21 +++++++-------------- pyproject.toml | 2 +- 3 files changed, 9 insertions(+), 16 deletions(-) diff --git a/libbs/__init__.py b/libbs/__init__.py index 2540447d..7c319d93 100644 --- a/libbs/__init__.py +++ b/libbs/__init__.py @@ -1,4 +1,4 @@ -__version__ = "3.3.0" +__version__ = "3.3.1" import logging diff --git a/libbs/api/type_parser.py b/libbs/api/type_parser.py index 145c4855..c89d5832 100644 --- a/libbs/api/type_parser.py +++ b/libbs/api/type_parser.py @@ -95,13 +95,6 @@ def __init__( # hack in type parsing self._type_parser_singleton = pycparser.CParser() - self._type_parser_singleton.cparser = pycparser.ply.yacc.yacc( - module=self._type_parser_singleton, - start='parameter_declaration', - debug=False, - optimize=False, - errorlog=errorlog - ) self.ALL_TYPES = {} self.BASIC_TYPES = {} self.STDINT_TYPES = {} @@ -207,15 +200,15 @@ def extract_type_name(self, type_str: str) -> str | None: return type_name - def parse_type(self, defn, preprocess=True, predefined_types=None, arch=None) -> Optional[CType]: # pylint:disable=unused-argument + def parse_type(self, defn, predefined_types=None, arch=None) -> Optional[CType]: # pylint:disable=unused-argument """ Parse a simple type expression into a SimType >>> self.parse_type('int *') """ - return self.parse_type_with_name(defn, preprocess=preprocess, predefined_types=predefined_types, arch=arch)[0] + return self.parse_type_with_name(defn, predefined_types=predefined_types, arch=arch)[0] - def parse_type_with_name(self, defn, preprocess=True, predefined_types=None, arch=None): # pylint:disable=unused-argument + def parse_type_with_name(self, defn, predefined_types=None, arch=None): # pylint:disable=unused-argument """ Parse a simple type expression into a SimType, returning the a tuple of the type object and any associated name that might be found in the place a name would go in a type declaration. @@ -228,12 +221,12 @@ def parse_type_with_name(self, defn, preprocess=True, predefined_types=None, arc if pycparser is None: raise ImportError("Please install pycparser in order to parse C definitions") - if preprocess: - defn = re.sub(r"/\*.*?\*/", r"", defn) + defn = re.sub(r"/\*.*?\*/", r"", defn, flags=re.DOTALL) + defn = re.sub(r"//.*?$", r"", defn, flags=re.MULTILINE) failed_parse = False try: - node = self._type_parser_singleton.parse(text=defn) + node = self._type_parser_singleton.parse_type_with_name(text=defn) except ParseError: failed_parse = True @@ -243,7 +236,7 @@ def parse_type_with_name(self, defn, preprocess=True, predefined_types=None, arc # if failed_parse: try: - node = self._type_parser_singleton.parse(text="struct " + defn) + node = self._type_parser_singleton.parse_type_with_name(text="struct " + defn) except Exception: return (None, ) diff --git a/pyproject.toml b/pyproject.toml index 77d9a48f..57a66303 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -17,7 +17,7 @@ requires-python = ">= 3.10" dependencies = [ "toml", "ply", - "pycparser", + "pycparser~=3.0", "setuptools", "prompt_toolkit", "tqdm", From c7894ff59f0950c00c2b8c75ab34ee9c9836becc Mon Sep 17 00:00:00 2001 From: mahaloz Date: Thu, 22 Jan 2026 10:11:50 -0700 Subject: [PATCH 2/2] fix --- libbs/api/type_parser.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libbs/api/type_parser.py b/libbs/api/type_parser.py index c89d5832..4ae896f3 100644 --- a/libbs/api/type_parser.py +++ b/libbs/api/type_parser.py @@ -226,7 +226,7 @@ def parse_type_with_name(self, defn, predefined_types=None, arch=None): # pylin failed_parse = False try: - node = self._type_parser_singleton.parse_type_with_name(text=defn) + node = self._type_parser_singleton.parse(text=defn) except ParseError: failed_parse = True @@ -236,7 +236,7 @@ def parse_type_with_name(self, defn, predefined_types=None, arch=None): # pylin # if failed_parse: try: - node = self._type_parser_singleton.parse_type_with_name(text="struct " + defn) + node = self._type_parser_singleton.parse(text="struct " + defn) except Exception: return (None, )