From 440264216c7660653a4d1baae9f154d30cdf4c5b Mon Sep 17 00:00:00 2001 From: David Robillard Date: Sat, 26 May 2018 11:49:43 +0200 Subject: Add debug checks for node padding --- src/node.c | 40 ++++++++++++++++++++++++++++++++-------- 1 file changed, 32 insertions(+), 8 deletions(-) (limited to 'src/node.c') diff --git a/src/node.c b/src/node.c index a4e40611..f8c4b47f 100644 --- a/src/node.c +++ b/src/node.c @@ -104,6 +104,23 @@ serd_node_maybe_get_meta_c(const SerdNode* const node) return (node->flags & meta_mask) ? serd_node_meta_c(node) : NULL; } +static void +serd_node_check_padding(const SerdNode* node) +{ + (void)node; +#ifndef NDEBUG + if (node) { + const size_t unpadded_size = node->length; + const size_t padded_size = serd_node_pad_size(unpadded_size); + for (size_t i = 0; i < padded_size - unpadded_size; ++i) { + assert(serd_node_buffer_c(node)[unpadded_size + i] == '\0'); + } + + serd_node_check_padding(serd_node_maybe_get_meta_c(node)); + } +#endif +} + static SERD_PURE_FUNC size_t serd_node_total_size(const SerdNode* const node) @@ -188,6 +205,8 @@ serd_new_simple_node(const SerdNodeType type, const SerdStringView str) node->length = length; } + serd_node_check_padding(node); + return node; } @@ -201,6 +220,7 @@ serd_new_string(const SerdStringView str) memcpy(serd_node_buffer(node), str.buf, str.len); node->length = length; + serd_node_check_padding(node); return node; } @@ -225,6 +245,7 @@ serd_new_literal(const SerdStringView str, lang_node->type = SERD_LITERAL; lang_node->length = lang.len; memcpy(serd_node_buffer(lang_node), lang.buf, lang.len); + serd_node_check_padding(lang_node); } else if (datatype_uri.len) { const size_t total_len = len + sizeof(SerdNode) + datatype_uri.len; @@ -237,6 +258,7 @@ serd_new_literal(const SerdStringView str, datatype_node->type = SERD_URI; datatype_node->length = datatype_uri.len; memcpy(serd_node_buffer(datatype_node), datatype_uri.buf, datatype_uri.len); + serd_node_check_padding(datatype_node); } else { node = serd_node_malloc(length, flags, SERD_LITERAL); @@ -244,6 +266,7 @@ serd_new_literal(const SerdStringView str, node->length = length; } + serd_node_check_padding(node); return node; } @@ -267,14 +290,8 @@ serd_node_copy(const SerdNode* node) } const size_t size = serd_node_total_size(node); -#ifndef NDEBUG - const size_t unpadded_size = node->length; - const size_t padded_size = serd_node_pad_size(node->length); - for (size_t i = 0; i < padded_size - unpadded_size; ++i) { - assert(serd_node_buffer_c(node)[unpadded_size + i] == '\0'); - } -#endif - SerdNode* copy = (SerdNode*)serd_calloc_aligned(serd_node_align, size); + SerdNode* copy = (SerdNode*)serd_calloc_aligned(serd_node_align, size); + memcpy(copy, node, size); return copy; } @@ -325,6 +342,7 @@ serd_new_parsed_uri(const SerdURIView uri) serd_node_buffer(node)[actual_len] = '\0'; node->length = actual_len; + serd_node_check_padding(node); return node; } @@ -340,6 +358,7 @@ serd_new_from_uri(const SerdURIView uri, const SerdURIView base) serd_node_buffer(node)[actual_len] = '\0'; node->length = actual_len; + serd_node_check_padding(node); return node; } @@ -354,6 +373,7 @@ serd_new_resolved_uri(const SerdStringView string, const SerdURIView base) return NULL; } + serd_node_check_padding(result); return result; } @@ -436,6 +456,7 @@ serd_new_file_uri(const SerdStringView path, const SerdStringView hostname) serd_new_uri(SERD_SUBSTRING((const char*)buffer.buf, buffer.len - 1)); free(buffer.buf); + serd_node_check_padding(node); return node; } @@ -507,6 +528,7 @@ serd_new_decimal(const double d, } memcpy(serd_node_meta(node), type, type_len); + serd_node_check_padding(node); return node; } @@ -537,6 +559,7 @@ serd_new_integer(const int64_t i, const SerdNode* const datatype) } while ((abs_i /= 10) > 0); memcpy(serd_node_meta(node), type, type_len); + serd_node_check_padding(node); return node; } @@ -565,6 +588,7 @@ serd_new_blob(const void* const buf, node->length = len; memcpy(serd_node_meta(node), type, type_len); + serd_node_check_padding(node); return node; } -- cgit v1.2.1