From d7cb78879e2ddb5a2a6d4f2f674acdedb4948962 Mon Sep 17 00:00:00 2001 From: Peiwei Hu Date: Mon, 14 Mar 2022 10:46:59 +0800 Subject: [PATCH] Add hint for unexpected type definition (#2393) --- librz/type/parser/c_cpp_parser.c | 18 ++++++++++++++++-- librz/type/parser/types_parser.c | 5 +++++ test/db/cmd/types | 6 +++++- 3 files changed, 26 insertions(+), 3 deletions(-) diff --git a/librz/type/parser/c_cpp_parser.c b/librz/type/parser/c_cpp_parser.c index 0fbfbc37d6..84789b1bf9 100644 --- a/librz/type/parser/c_cpp_parser.c +++ b/librz/type/parser/c_cpp_parser.c @@ -10,6 +10,18 @@ #include +#define TS_START_END(node, start, end) \ + do { \ + start = ts_node_start_byte(node); \ + end = ts_node_end_byte(node); \ + } while (0) + +static char *ts_node_sub_string(TSNode node, const char *cstr) { + ut32 start, end; + TS_START_END(node, start, end); + return rz_str_newf("%.*s", end - start, cstr + start); +} + // Declare the `tree_sitter_c` function, which is // implemented by the `tree-sitter-c` library. TSLanguage *tree_sitter_c(); @@ -168,10 +180,12 @@ static int type_parse_string(CParserState *state, const char *code, char **error for (i = 0; i < root_node_child_count; i++) { TSNode child = ts_node_named_child(root_node, i); // We skip ";" or "," - empty expressions - const char *node_type = ts_node_type(child); - if (!strcmp(node_type, "expression_statement")) { + char *node_code = ts_node_sub_string(child, code); + if (!strcmp(node_code, ";") || !strcmp(node_code, ",")) { + free(node_code); continue; } + free(node_code); parser_debug(state, "Processing %d child...\n", i); result += parse_type_nodes_save(state, child, code); } diff --git a/librz/type/parser/types_parser.c b/librz/type/parser/types_parser.c index dfa25d46e3..cf43bb4dc5 100644 --- a/librz/type/parser/types_parser.c +++ b/librz/type/parser/types_parser.c @@ -1899,6 +1899,11 @@ int parse_type_nodes_save(CParserState *state, TSNode node, const char *text) { return -1; } } + + if (result) { + parser_error(state, "Unsupported type definition: %s\n", ts_node_sub_string(node, text)); + } + // In case of anonymous type we could use identifier as a name for this type? return result; } diff --git a/test/db/cmd/types b/test/db/cmd/types index f8cf7a938f..0fa1bb7c8f 100644 --- a/test/db/cmd/types +++ b/test/db/cmd/types @@ -2068,9 +2068,13 @@ NAME=td crash FILE== CMDS=<