@@ -481,9 +481,11 @@ names start with the string "private_data_member".
Suppresses change reports involving a type which has at least one
data member inserted at an offset specified by the property value
- ``offset-in-bit``. Please note that if a type has a change in which
- at least one of its data members is removed or its size is reduced,
- the type will *NOT* be suppressed by the evaluation of this property.
+ ``offset-in-bit``. Please note that if the size of the type changed,
+ then the type change will *NOT* be suppressed by the evaluation of
+ this property, unless the
+ :ref:`has_size_change<suppr_has_size_change_property_label>` property
+ is present and set to ``yes``.
The value ``offset-in-bit`` is either:
@@ -525,9 +527,16 @@ names start with the string "private_data_member".
the values ``range-begin`` and ``range-end`` can be of the same form
as the :ref:`has_data_member_inserted_at
<suppr_has_data_member_inserted_at_label>` property above. Please
- also note that if a type has a change in which at least one of its
- data members is removed or its size is reduced, the type will *NOT* be
- suppressed by the evaluation of this property.
+ also note that if the size of the type changed, then the type change
+ will *NOT* be suppressed by the evaluation of this property, unless
+ the :ref:`has_size_change<suppr_has_size_change_property_label>`
+ property is present and set to ``yes``. Note that data member
+ deletions happening in the range between ``range-begin`` and
+ ``range-end`` won't prevent the type change from being suppressed by
+ the evaluation of this property if the size of the type doesn't
+ change or if the
+ :ref:`has_size_change<suppr_has_size_change_property_label>` property
+ is present and set to ``yes``.
Usage examples of this properties are: ::
@@ -564,9 +573,15 @@ names start with the string "private_data_member".
the ranges are of the same kind as for the
:ref:`has_data_member_inserted_at
<suppr_has_data_member_inserted_at_label>` property above. Please
- note that if a type has a change in which at least one of its data
- members is removed or its size is reduced, the type will *NOT* be
- suppressed by the evaluation of this property.
+ also note that if the size of the type changed, then the type will
+ *NOT* be suppressed by the evaluation of this property, unless the
+ :ref:`has_size_change<suppr_has_size_change_property_label>` property
+ is present and set to ``yes``. Note that data member deletions
+ happening in the defined ranges won't prevent the type change from
+ being suppressed by the evaluation of this property if the size of
+ the type doesn't change or if the
+ :ref:`has_size_change<suppr_has_size_change_property_label>` property
+ is present and set to ``yes``.
Another usage example of this property is thus: ::
@@ -576,6 +591,23 @@ names start with the string "private_data_member".
{72, end}
}
+
+ .. _suppr_has_size_change_property_label:
+* ``has_size_change``
+
+ Usage:
+
+ ``has_size_change`` ``=`` yes | no
+
+
+This property is to be used in conjunction with the properties
+:ref:`has_data_member_inserted_between<suppr_has_data_member_inserted_between_label>`
+and
+:ref:`has_data_members_inserted_between<suppr_has_data_members_inserted_between_label>`.
+Those properties will not match a type change if the size of the type
+changes, unless the ``has_size_changes`` property is set to ``yes``.
+
+
.. _suppr_accessed_through_property_label:
* ``accessed_through``
@@ -243,6 +243,12 @@ public:
void
set_reach_kind(reach_kind k);
+ bool
+ get_has_size_change() const;
+
+ void
+ set_has_size_change(bool flag);
+
const string_set_type&
get_potential_data_member_names() const;
@@ -570,6 +570,7 @@ class type_suppression::priv
type_suppression::type_kind type_kind_;
bool consider_reach_kind_;
type_suppression::reach_kind reach_kind_;
+ bool has_size_change_;
// The data members a class needs to have to match this suppression
// specification. These might be selected by a regular expression.
string_set_type potential_data_members_;
@@ -599,7 +600,8 @@ public:
consider_type_kind_(consider_type_kind),
type_kind_(type_kind),
consider_reach_kind_(consider_reach_kind),
- reach_kind_(reach_kind)
+ reach_kind_(reach_kind),
+ has_size_change_(false)
{}
/// Get the regular expression object associated to the 'type_name_regex'
@@ -569,6 +569,20 @@ void
type_suppression::set_reach_kind(reach_kind k)
{priv_->reach_kind_ = k;}
+/// Getter of the "has_size_change" property.
+///
+/// @return the value of the "has_size_change" property.
+bool
+type_suppression::get_has_size_change() const
+{return priv_->has_size_change_;}
+
+/// Setter of the "has_size_change" property.
+///
+/// @param flag the new value of the "has_size_change" property.
+void
+type_suppression::set_has_size_change(bool flag)
+{priv_->has_size_change_ = flag;}
+
/// Getter of the "potential_data_member_names" property.
///
/// @return the set of potential data member names of this
@@ -855,12 +869,14 @@ type_suppression::suppresses_diff(const diff* diff) const
{
// ... and the suppr spec contains a
// "has_data_member_inserted_*" clause ...
- if (klass_diff->deleted_data_members().empty()
- && (klass_diff->first_class_decl()->get_size_in_bits()
- <= klass_diff->second_class_decl()->get_size_in_bits()))
+ if ((klass_diff->first_class_decl()->get_size_in_bits()
+ == klass_diff->second_class_decl()->get_size_in_bits())
+ || get_has_size_change())
{
// That "has_data_member_inserted_*" clause doesn't hold
- // if the class has deleted data members or shrunk.
+ // if the class changed size, unless the user specified
+ // that suppression applies to types that have size
+ // change.
const class_decl_sptr& first_type_decl =
klass_diff->first_class_decl();
@@ -881,6 +897,23 @@ type_suppression::suppresses_diff(const diff* diff) const
if (!matched)
return false;
}
+
+ // Similarly, all deleted data members must be in an
+ // allowed insertion range.
+ for (const auto& m : klass_diff->deleted_data_members())
+ {
+ decl_base_sptr member = m.second;
+ bool matched = false;
+
+ for (const auto& range : get_data_member_insertion_ranges())
+ if (is_data_member_offset_in_range(is_var_decl(member),
+ range,
+ first_type_decl.get()))
+ matched = true;
+
+ if (!matched)
+ return false;
+ }
}
else
return false;
@@ -1649,6 +1682,13 @@ read_type_suppression(const ini::config::section& section)
? drop_artifact->get_value()->as_string()
: "";
+ ini::simple_property_sptr has_size_change =
+ is_simple_property(section.find_property("has_size_change"));
+
+ string has_size_change_str = has_size_change
+ ? has_size_change->get_value()->as_string()
+ : "";
+
ini::simple_property_sptr label =
is_simple_property(section.find_property("label"));
string label_str = label ? label->get_value()->as_string() : "";
@@ -2030,6 +2070,9 @@ read_type_suppression(const ini::config::section& section)
|| !srcloc_not_in.empty())))
result->set_drops_artifact_from_ir(true);
+ if (has_size_change_str == "yes" || has_size_change_str == "true")
+ result->set_has_size_change(true);
+
if (result->get_type_kind() == type_suppression::ENUM_TYPE_KIND
&& !changed_enumerator_names.empty())
result->set_changed_enumerator_names(changed_enumerator_names);
@@ -1294,28 +1294,38 @@ test-diff-suppr/test10-changed-parm-c-v1.c \
test-diff-suppr/libtest11-add-data-member-v0.so \
test-diff-suppr/libtest11-add-data-member-v1.so \
test-diff-suppr/test11-add-data-member-0.suppr \
+test-diff-suppr/test11-add-data-member-0.1.suppr \
test-diff-suppr/test11-add-data-member-1.suppr \
+test-diff-suppr/test11-add-data-member-1.1.suppr \
test-diff-suppr/test11-add-data-member-2.suppr \
+test-diff-suppr/test11-add-data-member-2.1.suppr \
test-diff-suppr/test11-add-data-member-3.suppr \
+test-diff-suppr/test11-add-data-member-3.1.suppr \
test-diff-suppr/test11-add-data-member-4.suppr \
+test-diff-suppr/test11-add-data-member-4.1.suppr \
test-diff-suppr/test11-add-data-member-report-0.txt \
test-diff-suppr/test11-add-data-member-report-1.txt \
+test-diff-suppr/test11-add-data-member-report-1.1.txt \
test-diff-suppr/test11-add-data-member-v0.cc \
test-diff-suppr/test11-add-data-member-v1.cc \
test-diff-suppr/libtest12-add-data-member-v0.so \
test-diff-suppr/libtest12-add-data-member-v1.so \
test-diff-suppr/test12-add-data-member-0.suppr \
+test-diff-suppr/test12-add-data-member-0.1.suppr \
test-diff-suppr/test12-add-data-member-1.suppr \
test-diff-suppr/test12-add-data-member-report-0.txt \
test-diff-suppr/test12-add-data-member-report-1.txt \
+test-diff-suppr/test12-add-data-member-report-1.1.txt \
test-diff-suppr/test12-add-data-member-report-2.txt \
test-diff-suppr/test12-add-data-member-v0.cc \
test-diff-suppr/test12-add-data-member-v1.cc \
test-diff-suppr/libtest13-suppr-through-pointer-v0.so \
test-diff-suppr/libtest13-suppr-through-pointer-v1.so \
test-diff-suppr/test13-suppr-through-pointer-0.suppr \
+test-diff-suppr/test13-suppr-through-pointer-0.1.suppr \
test-diff-suppr/test13-suppr-through-pointer-report-0.txt \
test-diff-suppr/test13-suppr-through-pointer-report-1.txt \
+test-diff-suppr/test13-suppr-through-pointer-report-1.1.txt \
test-diff-suppr/test13-suppr-through-pointer-v0.cc \
test-diff-suppr/test13-suppr-through-pointer-v1.cc \
test-diff-suppr/test14-suppr-non-redundant-v0.o \
@@ -1618,9 +1628,11 @@ test-diff-suppr/test34-v1.c \
test-diff-suppr/libtest35-leaf-v0.so \
test-diff-suppr/libtest35-leaf-v1.so \
test-diff-suppr/test35-leaf-report-0.txt \
+test-diff-suppr/test35-leaf-report-0.1.txt \
test-diff-suppr/test35-leaf-v0.cc \
test-diff-suppr/test35-leaf-v1.cc \
test-diff-suppr/test35-leaf.suppr \
+test-diff-suppr/test35-leaf.1.suppr \
test-diff-suppr/libtest36-leaf-v0.so \
test-diff-suppr/libtest36-leaf-v1.so \
test-diff-suppr/test36-leaf-report-0.txt \
new file mode 100644
@@ -0,0 +1,3 @@
+[suppress_type]
+ name = S
+ has_data_member_inserted_between = {8, end}
\ No newline at end of file
@@ -1,3 +1,4 @@
[suppress_type]
name = S
has_data_member_inserted_between = {8, end}
+ has_size_change = true
new file mode 100644
@@ -0,0 +1,3 @@
+[suppress_type]
+ name = S
+ has_data_member_inserted_between = {offset_after(m0), end}
@@ -1,3 +1,4 @@
[suppress_type]
name = S
has_data_member_inserted_between = {offset_after(m0), end}
+ has_size_change = true
new file mode 100644
@@ -0,0 +1,3 @@
+[suppress_type]
+ name = S
+ has_data_member_inserted_at = 8
\ No newline at end of file
@@ -1,3 +1,4 @@
[suppress_type]
name = S
has_data_member_inserted_at = 8
+ has_size_change = true
new file mode 100644
@@ -0,0 +1,3 @@
+[suppress_type]
+ name = S
+ has_data_member_inserted_at = end
@@ -1,3 +1,4 @@
[suppress_type]
name = S
has_data_member_inserted_at = end
+ has_size_change = true
new file mode 100644
@@ -0,0 +1,3 @@
+[suppress_type]
+ name = S
+ has_data_member_inserted_at = offset_after(m0)
\ No newline at end of file
@@ -1,3 +1,4 @@
[suppress_type]
name = S
has_data_member_inserted_at = offset_after(m0)
+ has_size_change = true
new file mode 100644
@@ -0,0 +1,13 @@
+Functions changes summary: 0 Removed, 1 Changed, 0 Added function
+Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
+
+1 function with some indirect sub-type change:
+
+ [C] 'function int foo(S*)' has some indirect sub-type changes:
+ parameter 1 of type 'S*' has sub-type changes:
+ in pointed to type 'struct S':
+ type size changed from 8 to 64 (in bits)
+ 2 data member insertions:
+ 'char m1', at offset 8 (in bits)
+ 'int m2', at offset 32 (in bits)
+
new file mode 100644
@@ -0,0 +1,3 @@
+[suppress_type]
+ name = S
+ has_data_members_inserted_between = {{8, 31}, {64, end}}
\ No newline at end of file
@@ -1,3 +1,4 @@
[suppress_type]
name = S
has_data_members_inserted_between = {{8, 31}, {64, end}}
+ has_size_change = true;
new file mode 100644
@@ -0,0 +1,13 @@
+Functions changes summary: 0 Removed, 1 Changed, 0 Added function
+Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
+
+1 function with some indirect sub-type change:
+
+ [C] 'function int foo(S*)' has some indirect sub-type changes:
+ parameter 1 of type 'S*' has sub-type changes:
+ in pointed to type 'struct S':
+ type size changed from 64 to 96 (in bits)
+ 2 data member insertions:
+ 'char m_inserted1', at offset 8 (in bits)
+ 'char m_inserted2', at offset 64 (in bits)
+
new file mode 100644
@@ -0,0 +1,4 @@
+[suppress_type]
+ name = S
+ accessed_through = pointer
+ has_data_member_inserted_at = end
\ No newline at end of file
@@ -2,3 +2,4 @@
name = S
accessed_through = pointer
has_data_member_inserted_at = end
+ has_size_change = true
new file mode 100644
@@ -0,0 +1,16 @@
+Functions changes summary: 0 Removed, 2 Changed (1 filtered out), 0 Added functions
+Variables changes summary: 0 Removed, 0 Changed, 0 Added variable
+
+2 functions with some indirect sub-type change:
+
+ [C] 'function void bar(S*)' has some indirect sub-type changes:
+ parameter 1 of type 'S*' has sub-type changes:
+ in pointed to type 'struct S':
+ type size changed from 32 to 64 (in bits)
+ 1 data member insertion:
+ 'char m1', at offset 32 (in bits)
+
+ [C] 'function void foo(S)' has some indirect sub-type changes:
+ parameter 1 of type 'struct S' has sub-type changes:
+ details were reported earlier
+
new file mode 100644
@@ -0,0 +1,18 @@
+Leaf changes summary: 2 artifacts changed
+Changed leaf types summary: 2 leaf types changed
+Removed/Changed/Added functions summary: 0 Removed, 0 Changed, 0 Added function
+Removed/Changed/Added variables summary: 0 Removed, 0 Changed, 0 Added variable
+
+'struct leaf at test35-leaf-v0.cc:5:1' changed:
+ type size changed from 32 to 64 (in bits)
+ 1 data member insertion:
+ 'char m1', at offset 32 (in bits) at test35-leaf-v1.cc:8:1
+ one impacted interface:
+ function void fn(C&)
+
+'struct leaf_to_filter at test35-leaf-v0.cc:10:1' changed:
+ type size changed from 32 to 64 (in bits)
+ 1 data member insertion:
+ 'int added', at offset 32 (in bits) at test35-leaf-v1.cc:14:1
+ one impacted interface:
+ function void fn(C&)
new file mode 100644
@@ -0,0 +1,8 @@
+[suppress_type]
+
+ # Suppress the type that had a data member inserted after the data
+ # member named 'member0'. That would be the type named
+ # leaf_to_filter.
+
+ name_regexp = .*
+ has_data_member_inserted_between = {offset_after(member0), end}
@@ -6,3 +6,4 @@
name_regexp = .*
has_data_member_inserted_between = {offset_after(member0), end}
+ has_size_change = true
@@ -514,7 +514,17 @@ InOutSpec in_out_specs[] =
"data/test-diff-suppr/test11-add-data-member-0.suppr",
"--no-default-suppression --no-show-locs --no-redundant",
"data/test-diff-suppr/test11-add-data-member-report-1.txt",
- "output/test-diff-suppr/test11-add-data-member-report-1_0.txt"
+ "output/test-diff-suppr/test11-add-data-member-report-0_0.txt"
+ },
+ {
+ "data/test-diff-suppr/libtest11-add-data-member-v0.so",
+ "data/test-diff-suppr/libtest11-add-data-member-v1.so",
+ "",
+ "",
+ "data/test-diff-suppr/test11-add-data-member-0.1.suppr",
+ "--no-default-suppression --no-show-locs --no-redundant",
+ "data/test-diff-suppr/test11-add-data-member-report-1.1.txt",
+ "output/test-diff-suppr/test11-add-data-member-report-0.1_0.txt"
},
{
"data/test-diff-suppr/libtest11-add-data-member-v0.so",
@@ -526,6 +536,16 @@ InOutSpec in_out_specs[] =
"data/test-diff-suppr/test11-add-data-member-report-1.txt",
"output/test-diff-suppr/test11-add-data-member-report-1_1.txt"
},
+ {
+ "data/test-diff-suppr/libtest11-add-data-member-v0.so",
+ "data/test-diff-suppr/libtest11-add-data-member-v1.so",
+ "",
+ "",
+ "data/test-diff-suppr/test11-add-data-member-1.1.suppr",
+ "--no-default-suppression --no-show-locs --no-redundant",
+ "data/test-diff-suppr/test11-add-data-member-report-1.1.txt",
+ "output/test-diff-suppr/test11-add-data-member-report-1.1_1.txt"
+ },
{
"data/test-diff-suppr/libtest11-add-data-member-v0.so",
"data/test-diff-suppr/libtest11-add-data-member-v1.so",
@@ -536,6 +556,16 @@ InOutSpec in_out_specs[] =
"data/test-diff-suppr/test11-add-data-member-report-1.txt",
"output/test-diff-suppr/test11-add-data-member-report-1_2.txt"
},
+ {
+ "data/test-diff-suppr/libtest11-add-data-member-v0.so",
+ "data/test-diff-suppr/libtest11-add-data-member-v1.so",
+ "",
+ "",
+ "data/test-diff-suppr/test11-add-data-member-2.1.suppr",
+ "--no-default-suppression --no-show-locs --no-redundant",
+ "data/test-diff-suppr/test11-add-data-member-report-1.1.txt",
+ "output/test-diff-suppr/test11-add-data-member-report-1.1_2.txt"
+ },
{
"data/test-diff-suppr/libtest11-add-data-member-v0.so",
"data/test-diff-suppr/libtest11-add-data-member-v1.so",
@@ -546,6 +576,16 @@ InOutSpec in_out_specs[] =
"data/test-diff-suppr/test11-add-data-member-report-1.txt",
"output/test-diff-suppr/test11-add-data-member-report-1_3.txt"
},
+ {
+ "data/test-diff-suppr/libtest11-add-data-member-v0.so",
+ "data/test-diff-suppr/libtest11-add-data-member-v1.so",
+ "",
+ "",
+ "data/test-diff-suppr/test11-add-data-member-3.1.suppr",
+ "--no-default-suppression --no-show-locs --no-redundant",
+ "data/test-diff-suppr/test11-add-data-member-report-1.1.txt",
+ "output/test-diff-suppr/test11-add-data-member-report-1.1_3.txt"
+ },
{
"data/test-diff-suppr/libtest11-add-data-member-v0.so",
"data/test-diff-suppr/libtest11-add-data-member-v1.so",
@@ -556,6 +596,16 @@ InOutSpec in_out_specs[] =
"data/test-diff-suppr/test11-add-data-member-report-1.txt",
"output/test-diff-suppr/test11-add-data-member-report-1_4.txt"
},
+ {
+ "data/test-diff-suppr/libtest11-add-data-member-v0.so",
+ "data/test-diff-suppr/libtest11-add-data-member-v1.so",
+ "",
+ "",
+ "data/test-diff-suppr/test11-add-data-member-4.1.suppr",
+ "--no-default-suppression --no-show-locs --no-redundant",
+ "data/test-diff-suppr/test11-add-data-member-report-1.1.txt",
+ "output/test-diff-suppr/test11-add-data-member-report-1.1_4.txt"
+ },
{
"data/test-diff-suppr/libtest12-add-data-member-v0.so",
"data/test-diff-suppr/libtest12-add-data-member-v1.so",
@@ -576,6 +626,16 @@ InOutSpec in_out_specs[] =
"data/test-diff-suppr/test12-add-data-member-report-1.txt",
"output/test-diff-suppr/test12-add-data-member-report-1.txt"
},
+ {
+ "data/test-diff-suppr/libtest12-add-data-member-v0.so",
+ "data/test-diff-suppr/libtest12-add-data-member-v1.so",
+ "",
+ "",
+ "data/test-diff-suppr/test12-add-data-member-0.1.suppr",
+ "--no-default-suppression --no-show-locs --no-redundant",
+ "data/test-diff-suppr/test12-add-data-member-report-1.1.txt",
+ "output/test-diff-suppr/test12-add-data-member-report-1.1.txt"
+ },
{
"data/test-diff-suppr/libtest12-add-data-member-v0.so",
"data/test-diff-suppr/libtest12-add-data-member-v1.so",
@@ -605,6 +665,16 @@ InOutSpec in_out_specs[] =
"--no-default-suppression --no-show-locs --no-redundant",
"data/test-diff-suppr/test13-suppr-through-pointer-report-1.txt",
"output/test-diff-suppr/test13-suppr-through-pointer-report-1.txt"
+ },
+ {
+ "data/test-diff-suppr/libtest13-suppr-through-pointer-v0.so",
+ "data/test-diff-suppr/libtest13-suppr-through-pointer-v1.so",
+ "",
+ "",
+ "data/test-diff-suppr/test13-suppr-through-pointer-0.1.suppr",
+ "--no-default-suppression --no-show-locs --no-redundant",
+ "data/test-diff-suppr/test13-suppr-through-pointer-report-1.1.txt",
+ "output/test-diff-suppr/test13-suppr-through-pointer-report-1.1.txt"
},
{
"data/test-diff-suppr/test14-suppr-non-redundant-v0.o",
@@ -1706,6 +1776,16 @@ InOutSpec in_out_specs[] =
"data/test-diff-suppr/test35-leaf-report-0.txt",
"output/test-diff-suppr/test35-leaf-report-0.txt"
},
+ {
+ "data/test-diff-suppr/libtest35-leaf-v0.so",
+ "data/test-diff-suppr/libtest35-leaf-v1.so",
+ "",
+ "",
+ "data/test-diff-suppr/test35-leaf.1.suppr",
+ "--no-default-suppression --leaf-changes-only --impacted-interfaces",
+ "data/test-diff-suppr/test35-leaf-report-0.1.txt",
+ "output/test-diff-suppr/test35-leaf-report-0.1.txt"
+ },
{
"data/test-diff-suppr/libtest36-leaf-v0.so",
"data/test-diff-suppr/libtest36-leaf-v1.so",