From b29c5dbf15d583e6d098d6e9b8483ed854af68b4 Mon Sep 17 00:00:00 2001 From: Max Brunsfeld Date: Fri, 15 Jun 2018 17:07:35 -0700 Subject: [PATCH] Rephrase ts_subtree_array_copy to avoid conspicuous null case This avoids a false positive error from the clang static analyzer, which doesn't understand the invariants of the Array type. --- src/runtime/subtree.c | 21 +++++++++------------ src/runtime/subtree.h | 2 +- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/src/runtime/subtree.c b/src/runtime/subtree.c index 69ee1cdc..89e9d0d5 100644 --- a/src/runtime/subtree.c +++ b/src/runtime/subtree.c @@ -67,20 +67,17 @@ bool ts_external_scanner_state_eq(const ExternalScannerState *a, const ExternalS // SubtreeArray -bool ts_subtree_array_copy(SubtreeArray self, SubtreeArray *dest) { - const Subtree **contents = NULL; - if (self.capacity > 0) { - contents = ts_calloc(self.capacity, sizeof(Subtree *)); - memcpy(contents, self.contents, self.size * sizeof(Subtree *)); - for (uint32_t i = 0; i < self.size; i++) { - ts_subtree_retain(contents[i]); - } - } - +void ts_subtree_array_copy(SubtreeArray self, SubtreeArray *dest) { dest->size = self.size; dest->capacity = self.capacity; - dest->contents = contents; - return true; + dest->contents = self.contents; + if (self.capacity > 0) { + dest->contents = ts_calloc(self.capacity, sizeof(Subtree *)); + memcpy(dest->contents, self.contents, self.size * sizeof(Subtree *)); + for (uint32_t i = 0; i < self.size; i++) { + ts_subtree_retain(dest->contents[i]); + } + } } void ts_subtree_array_delete(SubtreePool *pool, SubtreeArray *self) { diff --git a/src/runtime/subtree.h b/src/runtime/subtree.h index 66fc1f24..0fdba75f 100644 --- a/src/runtime/subtree.h +++ b/src/runtime/subtree.h @@ -79,7 +79,7 @@ typedef struct { void ts_external_scanner_state_init(ExternalScannerState *, const char *, unsigned); const char *ts_external_scanner_state_data(const ExternalScannerState *); -bool ts_subtree_array_copy(SubtreeArray, SubtreeArray *); +void ts_subtree_array_copy(SubtreeArray, SubtreeArray *); void ts_subtree_array_delete(SubtreePool *, SubtreeArray *); SubtreeArray ts_subtree_array_remove_trailing_extras(SubtreeArray *); void ts_subtree_array_reverse(SubtreeArray *);