Merge pull request #530 from antmicro/mglb/FixLeaks
systemverilog-plugin: Fix few ASAN issues
diff --git a/systemverilog-plugin/UhdmAst.cc b/systemverilog-plugin/UhdmAst.cc
index 59c95d7..36c5080 100644
--- a/systemverilog-plugin/UhdmAst.cc
+++ b/systemverilog-plugin/UhdmAst.cc
@@ -454,13 +454,17 @@
new AST::AstNode(AST::AST_SUB, range_right, AST::AstNode::mkconst_int(wire_node->multirange_dimensions[right_idx], false));
}
}
- range_left = new AST::AstNode(AST::AST_SUB,
- new AST::AstNode(AST::AST_MUL, new AST::AstNode(AST::AST_ADD, range_left, AST::AstNode::mkconst_int(1, false)),
- AST::AstNode::mkconst_int(single_elem_size[i + 1], false)),
- AST::AstNode::mkconst_int(1, false));
+ if (!result) {
+ range_left =
+ new AST::AstNode(AST::AST_SUB,
+ new AST::AstNode(AST::AST_MUL, new AST::AstNode(AST::AST_ADD, range_left, AST::AstNode::mkconst_int(1, false)),
+ AST::AstNode::mkconst_int(single_elem_size[i + 1], false)),
+ AST::AstNode::mkconst_int(1, false));
+ }
range_right = new AST::AstNode(AST::AST_MUL, range_right, AST::AstNode::mkconst_int(single_elem_size[i + 1], false));
if (result) {
range_right = new AST::AstNode(AST::AST_ADD, range_right, result->children[1]->clone());
+ delete range_left;
range_left = new AST::AstNode(AST::AST_SUB, new AST::AstNode(AST::AST_ADD, range_right->clone(), result->children[0]->clone()),
result->children[1]->clone());
delete result;
@@ -525,7 +529,8 @@
log_assert(wiretype_ast->type == AST::AST_TYPEDEF);
wire_node->attributes[ID::wiretype]->id2ast = wiretype_ast->children[0];
}
- if ((wire_node->children[0]->type == AST::AST_RANGE || (wire_node->children.size() > 1 && wire_node->children[1]->type == AST::AST_RANGE)) &&
+ if (((wire_node->children.size() > 0 && wire_node->children[0]->type == AST::AST_RANGE) ||
+ (wire_node->children.size() > 1 && wire_node->children[1]->type == AST::AST_RANGE)) &&
wire_node->multirange_dimensions.empty()) {
// We need to save order in which ranges appear in wiretype and add them before wire range
// We need to copy this ranges, so create new vector for them
@@ -1530,25 +1535,31 @@
if (is_signed) {
strValType += "s";
}
+ 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
@@ -1557,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;
}
@@ -1620,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;
@@ -1637,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;
@@ -1866,9 +1875,13 @@
wiretype_node->str = node->str;
current_node->children.push_back(wiretype_node);
current_node->is_custom_type = true;
- auto it = shared.param_types.find(current_node->str);
+ auto it = shared.param_types.find(wiretype_node->str);
if (it == shared.param_types.end())
- shared.param_types.insert(std::make_pair(current_node->str, node->clone()));
+ shared.param_types.insert(std::make_pair(wiretype_node->str, node));
+ else
+ delete node;
+ } else {
+ delete node;
}
}
});
@@ -4188,8 +4201,7 @@
current_node->children.push_back(node);
}
}
- // FIXME: If we release the handle here, visiting vpiStmt fails for some reason
- // vpi_release_handle(expr_h);
+ vpi_release_handle(expr_h);
}
vpi_release_handle(itr);
if (current_node->children.empty()) {