From d9abe02b2e1f15642e64413968832714eb8cdee1 Mon Sep 17 00:00:00 2001 From: Ben Lubar Date: Wed, 5 Feb 2020 19:06:14 -0600 Subject: [PATCH] add support for DfArray in check-structures-sanity --- plugins/devel/check-structures-sanity.cpp | 32 ++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) diff --git a/plugins/devel/check-structures-sanity.cpp b/plugins/devel/check-structures-sanity.cpp index 94584485e..61a31c951 100644 --- a/plugins/devel/check-structures-sanity.cpp +++ b/plugins/devel/check-structures-sanity.cpp @@ -51,6 +51,7 @@ class Checker void check_container(void *, container_identity *); void check_vector(void *, container_identity *, type_identity *); void check_deque(void *, container_identity *, type_identity *); + void check_dfarray(void *, container_identity *, type_identity *); void check_bit_container(void *, container_identity *); void check_virtual(void *, virtual_identity *); void check_primitive(void *, type_identity *); @@ -436,6 +437,10 @@ void Checker::check_container(void *base, container_identity *identity) { check_deque(base, identity, item_identity); } + else if (void_name == "DfArray") + { + check_dfarray(base, identity, item_identity); + } else { FAIL("TODO: " << void_name); @@ -452,7 +457,7 @@ void Checker::check_vector(void *base, container_identity *identity, type_identi uintptr_t end_of_storage; }; - if (identity->byte_size() != sizeof(vector_data) || identity->getFullName().find("vector<") != 0) + if (identity->byte_size() != sizeof(vector_data)) { UNEXPECTED; return; @@ -506,6 +511,31 @@ void Checker::check_deque(void *base, container_identity *identity, type_identit // TODO: check deque? } +void Checker::check_dfarray(void *base, container_identity *identity, type_identity *item_identity) +{ + struct dfarray_data + { + uintptr_t start; + unsigned short size; + }; + + if (identity->byte_size() != sizeof(dfarray_data)) + { + UNEXPECTED; + return; + } + + dfarray_data dfarray = *reinterpret_cast(base); + + size_t length = dfarray.size; + size_t item_size = item_identity->byte_size(); + + if (check_access(reinterpret_cast(dfarray.start), identity, item_size * length)) + { + check_static_array(reinterpret_cast(dfarray.start), item_identity, length); + } +} + void Checker::check_bit_container(void *base, container_identity *identity) { if (identity->getFullName() == "BitArray<>")