File: Fix-a-pointer-type-mismatch-error-by-delete-with-tra.patch

package info (click to toggle)
afnix 3.7.0-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 65,288 kB
  • sloc: cpp: 201,098; xml: 35,338; makefile: 4,973; sh: 992; lisp: 249
file content (168 lines) | stat: -rw-r--r-- 7,833 bytes parent folder | download
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;