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;