1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168
|
From 9922164a0e9c1484da5c2c73ccd8d095f93a7033 Mon Sep 17 00:00:00 2001
From: Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
Date: Tue, 6 Dec 2022 14:46:09 +0900
Subject: [PATCH 1/2] Fix a pointer type mismatch error by delete with
transient.tcc
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
```
g++ -Wall -Werror -fno-builtin -MMD -pthread -fPIC -nostdinc -nostdinc++ -O2 -I. -I../../../../bld/hdr/bit -I../../../../bld/hdr/plt -o Ascii.o -c Ascii.cpp
In file included from Ascii.cpp:19:
In destructor ‘afnix::t_transient<T, amod>::~t_transient() [with T = char; bool amod = false]’,
inlined from ‘static afnix::String afnix::Ascii::btos(const afnix::t_byte*, long int)’ at Ascii.cpp:58:3:
../../../../bld/hdr/bit/transient.tcc:54:57: error: ‘void operator delete(void*, long unsigned int)’ called on pointer returned from a mismatched allocation function [-Werror=mismatched-new-delete]
54 | if constexpr (amod == true) delete [] p_ptr; else delete p_ptr;
| ^~~~~~~~~~~~
Ascii.cpp: In static member function ‘static afnix::String afnix::Ascii::btos(const afnix::t_byte*, long int)’:
Ascii.cpp:50:45: note: returned from ‘void* operator new [](long unsigned int)’
50 | t_transient<char> data = new char[blen+1];
| ^
In destructor ‘afnix::t_transient<T, amod>::~t_transient() [with T = char; bool amod = false]’,
inlined from ‘static afnix::String afnix::Ascii::btos(const afnix::t_byte*, long int)’ at Ascii.cpp:58:3:
../../../../bld/hdr/bit/transient.tcc:54:57: error: ‘void operator delete(void*, long unsigned int)’ called on pointer returned from a mismatched allocation function [-Werror=mismatched-new-delete]
54 | if constexpr (amod == true) delete [] p_ptr; else delete p_ptr;
| ^~~~~~~~~~~~
Ascii.cpp: In static member function ‘static afnix::String afnix::Ascii::btos(const afnix::t_byte*, long int)’:
Ascii.cpp:50:45: note: returned from ‘void* operator new [](long unsigned int)’
50 | t_transient<char> data = new char[blen+1];
| ^
cc1plus: all warnings being treated as errors
```
Signed-off-by: Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
---
src/lib/std/shl/Ascii.cpp | 2 +-
src/lib/std/shl/Unicode.cpp | 22 +++++++++++-----------
2 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/src/lib/std/shl/Ascii.cpp b/src/lib/std/shl/Ascii.cpp
index 6fef8631..71d0b9e6 100644
--- a/src/lib/std/shl/Ascii.cpp
+++ b/src/lib/std/shl/Ascii.cpp
@@ -47,7 +47,7 @@ namespace afnix {
if ((src == nullptr) || (size <= 0)) return "";
// create a character buffer
long blen = size * 2;
- t_transient<char> data = new char[blen+1];
+ t_transient<char, true> data = new char[blen+1];
for (long i = 0, j = 0; i < size; i++, j+=2) {
data[j] = Ascii::btoc (src[i], false);
data[j+1] = Ascii::btoc (src[i], true);
diff --git a/src/lib/std/shl/Unicode.cpp b/src/lib/std/shl/Unicode.cpp
index 1924f8cb..22e35d71 100644
--- a/src/lib/std/shl/Unicode.cpp
+++ b/src/lib/std/shl/Unicode.cpp
@@ -703,7 +703,7 @@ namespace afnix {
t_quad* Unicode::strmak (const t_quad* s, const t_quad c) {
// compute size
long slen = Unicode::strlen (s);
- t_transient<t_quad> sbuf = new t_quad[slen+2];
+ t_transient<t_quad, true> sbuf = new t_quad[slen+2];
// copy string directly
for (long k = 0L; k < slen; k++) sbuf[k] = s[k];
sbuf[slen] = c;
@@ -725,7 +725,7 @@ namespace afnix {
t_quad* Unicode::strmak (const t_quad c, const t_quad* s) {
// compute size
long slen = Unicode::strlen (s);
- t_transient<t_quad> sbuf = new t_quad[slen+2];
+ t_transient<t_quad, true> sbuf = new t_quad[slen+2];
// add character and copy string
sbuf[0] = c;
for (long k = 0L; k < slen; k++) sbuf[k+1] = s[k];
@@ -742,7 +742,7 @@ namespace afnix {
long len1 = Unicode::strlen (s1);
long len2 = Ascii::strlen (s2);
// allocate a temporary buffer and copy
- t_transient<t_quad> sbuf = new t_quad[len1+len2+1];
+ t_transient<t_quad, true> sbuf = new t_quad[len1+len2+1];
for (long k = 0L; k < len1; k++) sbuf[k] = s1[k];
for (long k = 0L; k < len2; k++) sbuf[len1+k] = Unicode::toquad (s2[k]);
sbuf[len1+len2] = nilq;
@@ -758,7 +758,7 @@ namespace afnix {
long len1 = Unicode::strlen (s1);
long len2 = Unicode::strlen (s2);
// allocate a temporary buffer and copy
- t_transient<t_quad> sbuf = new t_quad[len1+len2+1];
+ t_transient<t_quad, true> sbuf = new t_quad[len1+len2+1];
for (long k = 0L; k < len1; k++) sbuf[k] = s1[k];
for (long k = 0L; k < len2; k++) sbuf[len1+k] = s2[k];
sbuf[len1+len2] = nilq;
@@ -785,7 +785,7 @@ namespace afnix {
// get the buffer length and check for nil
long slen = Ascii::strlen (s);
// convert the source buffer
- t_transient<t_quad> sbuf = new t_quad[slen+1];
+ t_transient<t_quad, true> sbuf = new t_quad[slen+1];
for (long k = 0L; k < slen; k++) sbuf[k] = Unicode::toquad (s[k]);
sbuf[slen] = nilq;
// normalize if requested
@@ -799,7 +799,7 @@ namespace afnix {
// get the string length and check for nil
long slen = Unicode::strlen (s);
// create a new quad array
- t_transient<t_quad> sbuf = new t_quad[slen+1];
+ t_transient<t_quad, true> sbuf = new t_quad[slen+1];
// copy the source buffer
for (long k = 0L; k < slen; k++) sbuf[k] = s[k];
sbuf[slen] = nilq;
@@ -811,7 +811,7 @@ namespace afnix {
t_quad* Unicode::strdup (const char* s, const long size) {
// create a new quad array
- t_transient<t_quad> result = new t_quad[size+1];
+ t_transient<t_quad, true> result = new t_quad[size+1];
// convert the source buffer
for (long k = 0L; k < size; k++) result[k] = Unicode::toquad (s[k]);
result[size] = nilq;
@@ -984,7 +984,7 @@ namespace afnix {
long len = Ascii::strlen (s);
// allocate and convert
long size = len * UCD_LCM_MAX + 1;
- t_transient<t_quad> sbuf = new t_quad[size];
+ t_transient<t_quad, true> sbuf = new t_quad[size];
long sidx = 0;
t_quad sdst[UCD_LCM_MAX];
for (long i = 0; i < len; i++) {
@@ -1006,7 +1006,7 @@ namespace afnix {
long len = Unicode::strlen (s);
// allocate and convert
long size = len * UCD_LCM_MAX + 1;
- t_transient<t_quad> sbuf = new t_quad[size];
+ t_transient<t_quad, true> sbuf = new t_quad[size];
// set indexes
long sidx = 0;
t_quad sdst[UCD_LCM_MAX];
@@ -1029,7 +1029,7 @@ namespace afnix {
long len = Ascii::strlen (s);
// allocate and convert
long size = len * UCD_UCM_MAX + 1;
- t_transient<t_quad> sbuf = new t_quad[size];
+ t_transient<t_quad, true> sbuf = new t_quad[size];
// set indexes
long sidx = 0;
t_quad sdst[UCD_UCM_MAX];
@@ -1052,7 +1052,7 @@ namespace afnix {
long len = Unicode::strlen (s);
// allocate and convert
long size = len * UCD_UCM_MAX + 1;
- t_transient<t_quad> sbuf = new t_quad[size];
+ t_transient<t_quad, true> sbuf = new t_quad[size];
// set indexes
long sidx = 0;
t_quad sdst[UCD_UCM_MAX];
diff --git a/src/lib/bit/tst/t_transient.cpp b/src/lib/bit/tst/t_transient.cpp
index 09ed51e1..678a0e98 100644
--- a/src/lib/bit/tst/t_transient.cpp
+++ b/src/lib/bit/tst/t_transient.cpp
@@ -20,7 +20,7 @@ int main (int, char**) {
using namespace afnix;
// create a new tansient
- t_transient<long> tl = new long[256];
+ t_transient<long, true> tl = new long[256];
// push and test array data
for (long k = 0L; k < 256; k++) tl[k] = k;
|