Skip to content

Commit 23d3f5c

Browse files
authored
oss-fuzz/type2.cpp: avoid usage of expensive std::ostringstream (#5986)
1 parent c6853dc commit 23d3f5c

1 file changed

Lines changed: 60 additions & 35 deletions

File tree

oss-fuzz/type2.cpp

Lines changed: 60 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@
1919
#include "type2.h"
2020

2121
#include <cstring>
22-
#include <sstream>
2322

2423
static int getValue(const uint8_t *data, size_t dataSize, uint8_t maxValue, bool *done = nullptr)
2524
{
@@ -54,19 +53,20 @@ static std::string generateExpression2_lvalue(const uint8_t *data, size_t dataSi
5453

5554
static std::string generateExpression2_Op(const uint8_t *data, size_t dataSize, uint8_t numberOfGlobalConstants)
5655
{
57-
std::ostringstream code;
56+
std::string code;
5857
switch (getValue(data, dataSize, 3)) {
5958
case 0:
60-
code << generateExpression2_lvalue(data, dataSize);
59+
code += generateExpression2_lvalue(data, dataSize);
6160
break;
6261
case 1:
63-
code << "globalconstant" << (1 + getValue(data, dataSize, numberOfGlobalConstants));
62+
code += "globalconstant";
63+
code += (1 + getValue(data, dataSize, numberOfGlobalConstants));
6464
break;
6565
case 2:
66-
code << (getValue(data, dataSize, 0x80) * 0x80 + getValue(data, dataSize, 0x80));
66+
code += (getValue(data, dataSize, 0x80) * 0x80 + getValue(data, dataSize, 0x80));
6767
break;
6868
}
69-
return code.str();
69+
return code;
7070
}
7171

7272
static std::string generateExpression2_Expr(const uint8_t *data, size_t dataSize, uint8_t numberOfGlobalConstants, int depth=0)
@@ -130,12 +130,14 @@ static std::string generateExpression2_conditionalCode(const std::string &indent
130130
size_t dataSize,
131131
uint8_t numberOfGlobalConstants)
132132
{
133-
std::ostringstream code;
133+
std::string code;
134134

135135
if (indent.empty())
136-
code << functionStart();
137-
else
138-
code << indent << "{\n";
136+
code += functionStart();
137+
else {
138+
code += indent;
139+
code += "{\n";
140+
}
139141

140142
for (int line = 0; line < 4 || indent.empty(); ++line) {
141143
bool done = false;
@@ -150,37 +152,60 @@ static std::string generateExpression2_conditionalCode(const std::string &indent
150152
((type1 >= 5) ? mostLikelyType : type1);
151153

152154
if (type2 == 0) {
153-
code << indent << " var" << getValue(data, dataSize, 5) << "=" << generateExpression2_Expr(data, dataSize, numberOfGlobalConstants) << ";\n";
155+
code += indent;
156+
code += " var";
157+
code += getValue(data, dataSize, 5);
158+
code += "=";
159+
code += generateExpression2_Expr(data, dataSize, numberOfGlobalConstants);
160+
code += ";\n";
154161
} else if (type2 == 1) {
155-
code << indent << " if (" << generateExpression2_Cond(data, dataSize, numberOfGlobalConstants) << ")\n";
156-
code << generateExpression2_conditionalCode(indent + " ", data, dataSize, numberOfGlobalConstants);
162+
code += indent;
163+
code += " if (";
164+
code += generateExpression2_Cond(data, dataSize, numberOfGlobalConstants);
165+
code += ")\n";
166+
code += generateExpression2_conditionalCode(indent + " ", data, dataSize, numberOfGlobalConstants);
157167
} else if (type2 == 2) {
158-
code << indent << " if (" << generateExpression2_Cond(data, dataSize, numberOfGlobalConstants) << ")\n";
159-
code << generateExpression2_conditionalCode(indent + " ", data, dataSize, numberOfGlobalConstants);
160-
code << indent << " else\n";
161-
code << generateExpression2_conditionalCode(indent + " ", data, dataSize, numberOfGlobalConstants);
168+
code += indent;
169+
code += " if (";
170+
code += generateExpression2_Cond(data, dataSize, numberOfGlobalConstants);
171+
code += ")\n";
172+
code += generateExpression2_conditionalCode(indent + " ", data, dataSize, numberOfGlobalConstants);
173+
code += indent;
174+
code += " else\n";
175+
code += generateExpression2_conditionalCode(indent + " ", data, dataSize, numberOfGlobalConstants);
162176
} else if (type2 == 3) {
163-
code << indent << " while (" << generateExpression2_Cond(data, dataSize, numberOfGlobalConstants) << ")\n";
164-
code << generateExpression2_conditionalCode(indent + " ", data, dataSize, numberOfGlobalConstants);
177+
code += indent;
178+
code += " while (";
179+
code += generateExpression2_Cond(data, dataSize, numberOfGlobalConstants);
180+
code += ")\n";
181+
code += generateExpression2_conditionalCode(indent + " ", data, dataSize, numberOfGlobalConstants);
165182
} else if (type2 == 4) {
166-
code << indent << " return " << generateExpression2_Expr(data, dataSize, numberOfGlobalConstants) << ";\n";
167-
if (indent.empty())
168-
code << "}\n\n" << functionStart();
183+
code += indent;
184+
code += " return ";
185+
code += generateExpression2_Expr(data, dataSize, numberOfGlobalConstants);
186+
code += ";\n";
187+
if (indent.empty()) {
188+
code += "}\n\n";
189+
code += functionStart();
190+
}
169191
else
170192
break;
171193
}
172194
}
173195

174-
if (!indent.empty())
175-
code << indent << "}\n";
176-
else
177-
code << " return 0;\n}\n";
178-
return code.str();
196+
if (!indent.empty()) {
197+
code += indent;
198+
code += "}\n";
199+
}
200+
else {
201+
code += " return 0;\n}\n";
202+
}
203+
return code;
179204
}
180205

181206
std::string generateCode2(const uint8_t *data, size_t dataSize)
182207
{
183-
std::ostringstream code;
208+
std::string code;
184209

185210
// create global constants
186211
constexpr uint8_t numberOfGlobalConstants = 0;
@@ -192,15 +217,15 @@ std::string generateCode2(const uint8_t *data, size_t dataSize)
192217
}
193218
*/
194219

195-
code << "int var1 = 1;\n"
196-
"int var2 = 0;\n"
197-
"int var3 = 1;\n"
198-
"int var4 = 0;\n"
199-
"int var5 = -1;\n\n";
220+
code += "int var1 = 1;\n"
221+
"int var2 = 0;\n"
222+
"int var3 = 1;\n"
223+
"int var4 = 0;\n"
224+
"int var5 = -1;\n\n";
200225

201-
code << generateExpression2_conditionalCode("", data, dataSize, numberOfGlobalConstants);
226+
code += generateExpression2_conditionalCode("", data, dataSize, numberOfGlobalConstants);
202227

203-
return code.str();
228+
return code;
204229
}
205230

206231

0 commit comments

Comments
 (0)