aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArthur Cohen <arthur.cohen@embecosm.com>2023-08-03 16:40:07 +0200
committerCohenArthur <arthur.cohen@embecosm.com>2023-08-14 00:30:37 +0000
commit74b27ac68d857719fbe92fcd769ff89467ea253f (patch)
tree0ee0dd7e7752d5161a63545f15516dd522715f54
parent87c5cc15163351f4ab0f0740b44a895a405a3eff (diff)
downloadgcc-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.cc13
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;
}