From 753fa1c3ffb78738d7a61cb132e6912c4e8ce341 Mon Sep 17 00:00:00 2001 From: Amaan Qureshi Date: Wed, 19 Jul 2023 03:49:14 -0400 Subject: [PATCH] fix(lib): explicitly cast numbers to the same size in potential spots for infinite loops --- lib/src/language.c | 4 ++-- lib/src/parser.c | 2 +- lib/src/query.c | 14 +++++++------- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/lib/src/language.c b/lib/src/language.c index d0b497d6..c87a8dc1 100644 --- a/lib/src/language.c +++ b/lib/src/language.c @@ -78,7 +78,7 @@ TSSymbol ts_language_symbol_for_name( bool is_named ) { if (!strncmp(string, "ERROR", length)) return ts_builtin_sym_error; - uint32_t count = ts_language_symbol_count(self); + uint16_t count = (uint16_t)ts_language_symbol_count(self); for (TSSymbol i = 0; i < count; i++) { TSSymbolMetadata metadata = ts_language_symbol_metadata(self, i); if ((!metadata.visible && !metadata.supertype) || metadata.named != is_named) continue; @@ -121,7 +121,7 @@ TSFieldId ts_language_field_id_for_name( const char *name, uint32_t name_length ) { - uint32_t count = ts_language_field_count(self); + uint16_t count = (uint16_t)ts_language_field_count(self); for (TSSymbol i = 1; i < count + 1; i++) { switch (strncmp(name, self->field_names[i], name_length)) { case 0: diff --git a/lib/src/parser.c b/lib/src/parser.c index f84b3c8d..b6be9aa6 100644 --- a/lib/src/parser.c +++ b/lib/src/parser.c @@ -1328,7 +1328,7 @@ static void ts_parser__handle_error( TSStateId state = ts_stack_state(self->stack, v); for ( TSSymbol missing_symbol = 1; - missing_symbol < self->language->token_count; + missing_symbol < (uint16_t)self->language->token_count; missing_symbol++ ) { TSStateId state_after_missing_symbol = ts_language_next_state( diff --git a/lib/src/query.c b/lib/src/query.c index 74fa888f..32fc2836 100644 --- a/lib/src/query.c +++ b/lib/src/query.c @@ -416,7 +416,7 @@ static CaptureListPool capture_list_pool_new(void) { } static void capture_list_pool_reset(CaptureListPool *self) { - for (uint16_t i = 0; i < self->list.size; i++) { + for (uint16_t i = 0; i < (uint16_t)self->list.size; i++) { // This invalid size means that the list is not in use. self->list.contents[i].size = UINT32_MAX; } @@ -424,7 +424,7 @@ static void capture_list_pool_reset(CaptureListPool *self) { } static void capture_list_pool_delete(CaptureListPool *self) { - for (uint16_t i = 0; i < self->list.size; i++) { + for (uint16_t i = 0; i < (uint16_t)self->list.size; i++) { array_delete(&self->list.contents[i]); } array_delete(&self->list); @@ -449,7 +449,7 @@ static bool capture_list_pool_is_empty(const CaptureListPool *self) { static uint16_t capture_list_pool_acquire(CaptureListPool *self) { // First see if any already allocated capture list is currently unused. if (self->free_capture_list_count > 0) { - for (uint16_t i = 0; i < self->list.size; i++) { + for (uint16_t i = 0; i < (uint16_t)self->list.size; i++) { if (self->list.contents[i].size == UINT32_MAX) { array_clear(&self->list.contents[i]); self->free_capture_list_count--; @@ -696,7 +696,7 @@ static void capture_quantifiers_add_all( if (self->size < quantifiers->size) { array_grow_by(self, quantifiers->size - self->size); } - for (uint16_t id = 0; id < quantifiers->size; id++) { + for (uint16_t id = 0; id < (uint16_t)quantifiers->size; id++) { uint8_t *quantifier = array_get(quantifiers, id); uint8_t *own_quantifier = array_get(self, id); *own_quantifier = (uint8_t) quantifier_add((TSQuantifier) *own_quantifier, (TSQuantifier) *quantifier); @@ -708,7 +708,7 @@ static void capture_quantifiers_mul( CaptureQuantifiers *self, TSQuantifier quantifier ) { - for (uint16_t id = 0; id < self->size; id++) { + for (uint16_t id = 0; id < (uint16_t)self->size; id++) { uint8_t *own_quantifier = array_get(self, id); *own_quantifier = (uint8_t) quantifier_mul((TSQuantifier) *own_quantifier, quantifier); } @@ -1519,7 +1519,7 @@ static bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_offset) { AnalysisSubgraph subgraph = { .symbol = parent_symbol }; array_insert_sorted_by(&subgraphs, .symbol, subgraph); } - for (TSSymbol sym = self->language->token_count; sym < self->language->symbol_count; sym++) { + for (TSSymbol sym = (uint16_t)self->language->token_count; sym < (uint16_t)self->language->symbol_count; sym++) { if (!ts_language_symbol_metadata(self->language, sym).visible) { AnalysisSubgraph subgraph = { .symbol = sym }; array_insert_sorted_by(&subgraphs, .symbol, subgraph); @@ -1533,7 +1533,7 @@ static bool ts_query__analyze_patterns(TSQuery *self, unsigned *error_offset) { // with information about the node that would be created. // 3) A list of predecessor states for each state. StatePredecessorMap predecessor_map = state_predecessor_map_new(self->language); - for (TSStateId state = 1; state < self->language->state_count; state++) { + for (TSStateId state = 1; state < (uint16_t)self->language->state_count; state++) { unsigned subgraph_index, exists; LookaheadIterator lookahead_iterator = ts_language_lookaheads(self->language, state); while (ts_lookahead_iterator_next(&lookahead_iterator)) {