Fix memory leak in process_value().
diff --git a/systemverilog-plugin/UhdmAst.cc b/systemverilog-plugin/UhdmAst.cc
index 0997aa3..dcf9757 100644
--- a/systemverilog-plugin/UhdmAst.cc
+++ b/systemverilog-plugin/UhdmAst.cc
@@ -1537,24 +1537,29 @@
}
vpi_release_handle(typespec_h);
}
+ std::string val_str;
if (val.format) { // Needed to handle parameter nodes without typespecs and constants
switch (val.format) {
case vpiScalarVal:
return AST::AstNode::mkconst_int(val.value.scalar, false, 1);
case vpiBinStrVal: {
strValType += "b";
+ val_str = val.value.str;
break;
}
case vpiDecStrVal: {
strValType += "d";
+ val_str = val.value.str;
break;
}
case vpiHexStrVal: {
strValType += "h";
+ val_str = val.value.str;
break;
}
case vpiOctStrVal: {
strValType += "o";
+ val_str = val.value.str;
break;
}
// Surelog reports constant integers as a unsigned, but by default int is signed
@@ -1563,16 +1568,14 @@
if (val.value.uint > std::numeric_limits<std::uint32_t>::max()) {
// an integer is by default signed, so use 'sd despite the variant vpiUIntVal
strValType = "'sd";
- string str_value = std::to_string(val.value.uint);
- val.value.str = strdup(str_value.c_str());
+ val_str = std::to_string(val.value.uint);
break;
}
[[fallthrough]];
case vpiIntVal: {
if (val.value.integer > std::numeric_limits<std::int32_t>::max()) {
strValType = "'sd";
- string str_value = std::to_string(val.value.integer);
- val.value.str = strdup(str_value.c_str());
+ val_str = std::to_string(val.value.integer);
break;
}
@@ -1626,8 +1629,8 @@
vpi_release_handle(caseItem_h);
}
// handle vpiBinStrVal, vpiDecStrVal and vpiHexStrVal
- if (std::strchr(val.value.str, '\'')) {
- return ::systemverilog_plugin::const2ast(val.value.str, caseType, false);
+ if (val_str.find('\'') != std::string::npos) {
+ return ::systemverilog_plugin::const2ast(std::move(val_str), caseType, false);
} else {
auto size = vpi_get(vpiSize, obj_h);
std::string size_str;
@@ -1643,7 +1646,7 @@
size_str = "1";
}
}
- auto c = ::systemverilog_plugin::const2ast(size_str + strValType + val.value.str, caseType, false);
+ auto c = ::systemverilog_plugin::const2ast(size_str + strValType + val_str, caseType, false);
if (size <= 0) {
// unsized unbased const
c->is_unsized = true;