diff options
author | Arthur Cohen <arthur.cohen@embecosm.com> | 2023-08-03 16:40:07 +0200 |
---|---|---|
committer | CohenArthur <arthur.cohen@embecosm.com> | 2023-08-14 00:30:37 +0000 |
commit | 74b27ac68d857719fbe92fcd769ff89467ea253f (patch) | |
tree | 0ee0dd7e7752d5161a63545f15516dd522715f54 | |
parent | 87c5cc15163351f4ab0f0740b44a895a405a3eff (diff) | |
download | gcc-74b27ac68d857719fbe92fcd769ff89467ea253f.zip gcc-74b27ac68d857719fbe92fcd769ff89467ea253f.tar.gz gcc-74b27ac68d857719fbe92fcd769ff89467ea253f.tar.bz2 |
diagnostics: Fix mismatch between new[] and free
We cannot use `free` on a pointer allocated through `new[]`, and this
causes an ASAN failure. This fixes it by using `xcalloc` instead of
`new[]` when creating description buffers for our error codes.
gcc/rust/ChangeLog:
* rust-diagnostics.cc: Switch from new[] to xcalloc
-rw-r--r-- | gcc/rust/rust-diagnostics.cc | 13 |
1 files changed, 4 insertions, 9 deletions
diff --git a/gcc/rust/rust-diagnostics.cc b/gcc/rust/rust-diagnostics.cc index 4a991c6..fce10bd 100644 --- a/gcc/rust/rust-diagnostics.cc +++ b/gcc/rust/rust-diagnostics.cc @@ -199,6 +199,9 @@ public: void format_error_code (char *buffer) const { + // we can use the `u` format specifier because the `ErrorCode` enum class + // "inherits" from `unsigned int` - add a static assertion to make sure + // that's the case before we do the formatting static_assert ( std::is_same<std::underlying_type<ErrorCode>::type, unsigned int>::value, "invalid format specifier for ErrorCode's underlying type"); @@ -210,18 +213,10 @@ public: char *make_description () const final override { // 'E' + 4 characters + \0 - char *buffer = new char[6]; - - // is that needed. does C++ suck that much that you - // can't zero initialize a new[]'d char array - memset (buffer, 0, 6); + char *buffer = static_cast<char *> (xcalloc (6, sizeof (char))); format_error_code (buffer); - // we can use the `u` format specifier because the `ErrorCode` enum class - // "inherits" from `unsigned int` - add a static assertion to make sure - // that's the case before we do the formatting - return buffer; } |