@@ -32,8 +32,9 @@ pointer_typet select_pointer_typet::convert_pointer_type(
32
32
// a generic parameter, specialize it with concrete types
33
33
if (!generic_parameter_specialization_map.empty ())
34
34
{
35
+ generic_parameter_recursion_trackingt visited;
35
36
return specialize_generics (
36
- pointer_type, generic_parameter_specialization_map);
37
+ pointer_type, generic_parameter_specialization_map, visited );
37
38
}
38
39
else
39
40
{
@@ -62,7 +63,8 @@ pointer_typet select_pointer_typet::convert_pointer_type(
62
63
pointer_typet select_pointer_typet::specialize_generics (
63
64
const pointer_typet &pointer_type,
64
65
const generic_parameter_specialization_mapt
65
- &generic_parameter_specialization_map) const
66
+ &generic_parameter_specialization_map,
67
+ generic_parameter_recursion_trackingt &visited_nodes) const
66
68
{
67
69
if (is_java_generic_parameter (pointer_type))
68
70
{
@@ -80,12 +82,21 @@ pointer_typet select_pointer_typet::specialize_generics(
80
82
const pointer_typet &type =
81
83
generic_parameter_specialization_map.find (parameter_name)->second .back ();
82
84
85
+ // if we have already seen this before, we will not learn any additional
86
+ // information from further recursion, only cause a segmentation fault.
87
+ if (visited_nodes.find (parameter_name) != visited_nodes.end ())
88
+ {
89
+ throw " no infinite recursion" ;
90
+ }
91
+
92
+ visited_nodes.insert (parameter_name);
93
+
83
94
// generic parameters can be adopted from outer classes or superclasses so
84
95
// we may need to search for the concrete type recursively
85
96
return is_java_generic_parameter (type)
86
97
? specialize_generics (
87
98
to_java_generic_parameter (type),
88
- generic_parameter_specialization_map)
99
+ generic_parameter_specialization_map, visited_nodes )
89
100
: type;
90
101
}
91
102
else if (pointer_type.subtype ().id () == ID_symbol)
@@ -99,7 +110,7 @@ pointer_typet select_pointer_typet::specialize_generics(
99
110
{
100
111
const pointer_typet &new_array_type = specialize_generics (
101
112
to_pointer_type (array_element_type),
102
- generic_parameter_specialization_map);
113
+ generic_parameter_specialization_map, visited_nodes );
103
114
104
115
pointer_typet replacement_array_type = java_array_type (' a' );
105
116
replacement_array_type.subtype ().set (ID_C_element_type, new_array_type);
0 commit comments