mirror of
https://github.com/ToruNiina/toml11.git
synced 2024-11-09 14:20:06 +00:00
cf8a977be2
This patch addresses a static analysis issue reported by Cppcheck 2.9 where several member functions of the toml::discard_comment class defined in the toml/comments.hpp header were implemented to deliberately dereference the null pointer returned unconditionally by the always-empty container's data() member function. This behavior wasn't technically wrong because those functions all have as precondition that the container is non-empty so they must never be called on an instance of toml::discard_comment but we can still be more helpful without adversely affecting code generation. Instead of dereferencing the null pointer, this patch has these functions call an inline private helper function which is defined to invoke __builtin_unreachable() if available "and then" throw an exception with a helpful error message. Even at the -O1 level, GCC will optimize the code under the assumption that the function will never be called (i.e. no assembly is emitted), making failure to ensure this undefined behavior exactly as if the null pointer had been dereferenced. However, static analysis will now understand the programmer's intent and remain silent. Furthermore, when using the -O0 or -Og levels, GCC won't optimize under this assumption so the exception will be thrown and might be helpful for debugging. Compilers that don't have __builtin_unreachable() won't get any help in determining that the function must not be called and will have to figure this out by analyzing the calling code -- which really shouldn't exist in the first place anyway as the whole point is that these functions must not be called. |
||
---|---|---|
.. | ||
color.hpp | ||
combinator.hpp | ||
comments.hpp | ||
datetime.hpp | ||
exception.hpp | ||
from.hpp | ||
get.hpp | ||
into.hpp | ||
lexer.hpp | ||
literal.hpp | ||
macros.hpp | ||
parser.hpp | ||
region.hpp | ||
result.hpp | ||
serializer.hpp | ||
source_location.hpp | ||
storage.hpp | ||
string.hpp | ||
traits.hpp | ||
types.hpp | ||
utility.hpp | ||
value.hpp | ||
version.hpp |