From 84e060a8160d1c0487b754f236bfb9fdbca78fea Mon Sep 17 00:00:00 2001 From: Max Vollmer Date: Wed, 11 Mar 2020 09:40:42 +0000 Subject: [PATCH] Change: ExtractData throws exception instead of returning false if data is invalid. Explanation: The return value of ExtractData is never checked anywhere in code. However if it returns false, outData remains uninitialized. All code using ExtractData assumes outData is initialized and proceeds to using it. I haven't encountered a real-life case where this goes wrong - but the simple fact that it can go wrong is a red flag. Instead of relying on every bit of code checking the return value and handling this properly, I think it makes much more sense to have ExtractData throw an exception. It obviously is an exceptional situation, and throwing makes sure that no code that doesn't explicitly handle such a scenario continues running and potentially causing harm. --- code/glTF2/glTF2Asset.h | 2 +- code/glTF2/glTF2Asset.inl | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/glTF2/glTF2Asset.h b/code/glTF2/glTF2Asset.h index d3c1654d0..3af9e4a7b 100644 --- a/code/glTF2/glTF2Asset.h +++ b/code/glTF2/glTF2Asset.h @@ -398,7 +398,7 @@ namespace glTF2 inline uint8_t* GetPointer(); template - bool ExtractData(T*& outData); + void ExtractData(T*& outData); void WriteData(size_t count, const void* src_buffer, size_t src_stride); diff --git a/code/glTF2/glTF2Asset.inl b/code/glTF2/glTF2Asset.inl index 35ecfa62d..d7876cfca 100644 --- a/code/glTF2/glTF2Asset.inl +++ b/code/glTF2/glTF2Asset.inl @@ -637,10 +637,12 @@ namespace { } template -bool Accessor::ExtractData(T*& outData) +void Accessor::ExtractData(T*& outData) { uint8_t* data = GetPointer(); - if (!data) return false; + if (!data) { + throw DeadlyImportError("GLTF: data is NULL"); + } const size_t elemSize = GetElementSize(); const size_t totalSize = elemSize * count; @@ -661,8 +663,6 @@ bool Accessor::ExtractData(T*& outData) memcpy(outData + i, data + i*stride, elemSize); } } - - return true; } inline void Accessor::WriteData(size_t count, const void* src_buffer, size_t src_stride)