Hello community,
here is the log from the commit of package abi-compliance-checker for openSUSE:Factory checked in at 2016-09-16 11:01:47
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/abi-compliance-checker (Old)
and /work/SRC/openSUSE:Factory/.abi-compliance-checker.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "abi-compliance-checker"
Changes:
--------
--- /work/SRC/openSUSE:Factory/abi-compliance-checker/abi-compliance-checker.changes 2016-07-18 21:25:18.000000000 +0200
+++ /work/SRC/openSUSE:Factory/.abi-compliance-checker.new/abi-compliance-checker.changes 2016-09-16 11:01:49.000000000 +0200
@@ -1,0 +2,9 @@
+Wed Sep 14 12:20:44 UTC 2016 - astieger@suse.com
+
+- update to 1.99.23:
+ * Fixed lists of affected symbols in the XML-format report
+ * Added -disable-quick-empty-report option
+ * Improved generation of quick empty reports
+ * Improved SysCheck.pm module for analysis of operating systems
+
+-------------------------------------------------------------------
Old:
----
abi-compliance-checker-1.99.22.tar.gz
New:
----
abi-compliance-checker-1.99.23.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ abi-compliance-checker.spec ++++++
--- /var/tmp/diff_new_pack.2Z0b8q/_old 2016-09-16 11:01:50.000000000 +0200
+++ /var/tmp/diff_new_pack.2Z0b8q/_new 2016-09-16 11:01:50.000000000 +0200
@@ -17,7 +17,7 @@
Name: abi-compliance-checker
-Version: 1.99.22
+Version: 1.99.23
Release: 0
Summary: A Compliance Checker For library ABIs
License: GPL-2.0+ or LGPL-2.0+
++++++ abi-compliance-checker-1.99.22.tar.gz -> abi-compliance-checker-1.99.23.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/abi-compliance-checker-1.99.22/INSTALL new/abi-compliance-checker-1.99.23/INSTALL
--- old/abi-compliance-checker-1.99.22/INSTALL 2016-07-04 18:12:19.000000000 +0200
+++ new/abi-compliance-checker-1.99.23/INSTALL 2016-08-15 18:29:35.000000000 +0200
@@ -9,8 +9,8 @@
RELEASE INFORMATION
Project: ABI Compliance Checker (ABICC)
-Version: 1.99.22
-Date: 2016-07-04
+Version: 1.99.23
+Date: 2016-08-15
This file explains how to install and setup environment
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/abi-compliance-checker-1.99.22/abi-compliance-checker.pl new/abi-compliance-checker-1.99.23/abi-compliance-checker.pl
--- old/abi-compliance-checker-1.99.22/abi-compliance-checker.pl 2016-07-04 18:12:19.000000000 +0200
+++ new/abi-compliance-checker-1.99.23/abi-compliance-checker.pl 2016-08-15 18:29:35.000000000 +0200
@@ -1,6 +1,6 @@
#!/usr/bin/perl
###########################################################################
-# ABI Compliance Checker (ABICC) 1.99.22
+# ABI Compliance Checker (ABICC) 1.99.23
# A tool for checking backward compatibility of a C/C++ library API
#
# Copyright (C) 2009-2011 Institute for System Programming, RAS
@@ -31,11 +31,11 @@
# - MinGW (3.0-4.7, 4.8.3, 4.9 or newer)
# - MS Visual C++ (dumpbin, undname, cl)
# - Active Perl 5 (5.8 or newer)
-# - Sigcheck v1.71 or newer
-# - Info-ZIP 3.0 (zip, unzip)
-# - Ctags (5.8 or newer)
+# - Sigcheck v2.52 or newer
+# - GnuWin Zip and UnZip
+# - Exuberant Ctags (5.8 or newer)
# - Add tool locations to the PATH environment variable
-# - Run vsvars32.bat (C:\Microsoft Visual Studio 9.0\Common7\Tools\)
+# - Run vcvars64.bat (C:\Microsoft Visual Studio 9.0\VC\bin\)
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License or the GNU Lesser
@@ -60,7 +60,7 @@
use Data::Dumper;
use Config;
-my $TOOL_VERSION = "1.99.22";
+my $TOOL_VERSION = "1.99.23";
my $ABI_DUMP_VERSION = "3.2";
my $XML_REPORT_VERSION = "1.2";
my $XML_ABI_DUMP_VERSION = "1.2";
@@ -91,7 +91,8 @@
$ExtraInfo, $ExtraDump, $Force, $Tolerance, $Tolerant, $SkipSymbolsListPath,
$CheckInfo, $Quick, $AffectLimit, $AllAffected, $CppIncompat,
$SkipInternalSymbols, $SkipInternalTypes, $TargetArch, $GccOptions,
-$TypesListPath, $SkipTypesListPath, $CheckPrivateABI, $CountSymbols, $OldStyle);
+$TypesListPath, $SkipTypesListPath, $CheckPrivateABI, $CountSymbols, $OldStyle,
+$DisableQuickEmptyReport);
my $CmdName = get_filename($0);
my %OS_LibExt = (
@@ -148,7 +149,7 @@
my $ShortUsage = "ABI Compliance Checker (ABICC) $TOOL_VERSION
A tool for checking backward compatibility of a C/C++ library API
-Copyright (C) 2015 Andrey Ponomarenko's ABI Laboratory
+Copyright (C) 2016 Andrey Ponomarenko's ABI Laboratory
License: GNU LGPL or GNU GPL
Usage: $CmdName [options]
@@ -187,7 +188,7 @@
"dump|dump-abi|dump_abi=s" => \$DumpAPI,
# extra options
"app|application=s" => \$AppPath,
- "static-libs!" => \$UseStaticLibs,
+ "static|static-libs!" => \$UseStaticLibs,
"gcc-path|cross-gcc=s" => \$CrossGcc,
"gcc-prefix|cross-prefix=s" => \$CrossPrefix,
"gcc-options=s" => \$GccOptions,
@@ -251,6 +252,7 @@
"tolerant!" => \$Tolerant,
"check!" => \$CheckInfo,
"quick!" => \$Quick,
+ "disable-quick-empty-report!" => \$DisableQuickEmptyReport,
"all-affected!" => \$AllAffected,
"skip-internal-symbols|skip-internal=s" => \$SkipInternalSymbols,
"skip-internal-types=s" => \$SkipInternalTypes,
@@ -401,7 +403,7 @@
This option allows to specify the application that should be checked
for portability to the new library version.
- -static-libs
+ -static
Check static libraries instead of the shared ones. The <libs> section
of the XML-descriptor should point to static libraries location.
@@ -754,6 +756,9 @@
-quick
Quick analysis. Disable check of some template instances.
+
+ -disable-quick-empty-report
+ Do not generate quick empty report if input ABI dumps are equal.
-skip-internal-symbols PATTERN
Do not check symbols matched by the pattern.
@@ -6742,7 +6747,7 @@
{ # for #include "..."
my $Candidate = join_P($AbsDir, $Include);
if(-f $Candidate) {
- $HPath = realpath($Candidate);
+ $HPath = realpath_F($Candidate);
}
}
elsif($IncType>0
@@ -7866,6 +7871,8 @@
{ # add options to MinGW compiler
# to simulate the MSVC compiler
my %MinGW_Opts = map {$_=>1} (
+ "-D__unaligned=\" \"",
+ "-D__nullptr=\"nullptr\"",
"-D_WIN32",
"-D_STDCALL_SUPPORTED",
"-D__int64=\"long long\"",
@@ -7904,11 +7911,14 @@
"-DDECLSPEC_DEPRECATED=\" \"",
"-D__builtin_alignof(x)=__alignof__(x)",
"-DSORTPP_PASS");
- if($Arch eq "x86") {
+ if($Arch eq "x86")
+ {
$MinGW_Opts{"-D_M_IX86=300"}=1;
}
- elsif($Arch eq "x86_64") {
+ elsif($Arch eq "x86_64")
+ {
$MinGW_Opts{"-D_M_AMD64=300"}=1;
+ $MinGW_Opts{"-D_M_X64=300"}=1;
}
elsif($Arch eq "ia64") {
$MinGW_Opts{"-D_M_IA64=300"}=1;
@@ -10445,7 +10455,7 @@
# by name in C language
# TODO: add other methods to detect private members
my $MName = $TypePtr->{"Memb"}{$FieldPos}{"name"};
- if($MName=~/priv|abidata|parent_object/i)
+ if($MName=~/priv|abidata|parent_object|impl/i)
{ # C-styled private data
return 0;
}
@@ -14626,6 +14636,10 @@
{ # from void* to something
return 0;
}
+ if($Type2_Pure{"Name"} eq "void")
+ { # from something to void*
+ return 0;
+ }
if($Type1_Pure{"Name"}=~/\*/
or $Type2_Pure{"Name"}=~/\*/)
{ # compared in detectTypeChange()
@@ -15459,7 +15473,7 @@
if(not is_abs($Path)) {
$Path = abs_path($Path);
}
- return $Path;
+ return path_format($Path, $OSgroup);
}
sub get_OSgroup()
@@ -17020,8 +17034,8 @@
$TYPE_PROBLEMS .= " </problem>\n";
}
}
- $TYPE_PROBLEMS .= getAffectedSymbols($Level, $TypeName, $Kinds_Locations{$TypeName});
- if($Level eq "Binary" and grep {$_=~/Virtual|Base_Class/} keys(%{$Kinds_Locations{$TypeName}})) {
+ $TYPE_PROBLEMS .= getAffectedSymbols($Level, $TypeName, \%Kinds_Locations);
+ if($Level eq "Binary" and grep {$_=~/Virtual|Base_Class/} keys(%Kinds_Locations)) {
$TYPE_PROBLEMS .= showVTables($TypeName);
}
$TYPE_PROBLEMS .= " </type>\n";
@@ -17401,9 +17415,11 @@
foreach my $Symbol (sort {lc($a) cmp lc($b)} keys(%SymSel))
{
+ my $Kind = $SymSel{$Symbol}{"Kind"};
my $Loc = $SymSel{$Symbol}{"Loc"};
+
my $PName = getParamName($Loc);
- my $Desc = getAffectDesc($Level, $Symbol, $SymSel{$Symbol}{"Kind"}, $Loc);
+ my $Desc = getAffectDesc($Level, $Symbol, $Kind, $Loc);
my $Target = "";
if($PName)
@@ -18711,7 +18727,6 @@
}
elsif(index($Symbol, "?")==0)
{
- next if($tr_name{$Symbol});
push(@MnglNames2, $Symbol);
}
else
@@ -19007,7 +19022,7 @@
my ($LibVersion, $Lib_Path, $IsNeededLib, $Weak, $Deps, $Vers) = @_;
return () if(not $LibVersion or not $Lib_Path);
- my $Real_Path = realpath($Lib_Path);
+ my $Real_Path = realpath_F($Lib_Path);
if(not $Real_Path)
{ # broken link
@@ -19152,15 +19167,32 @@
open(LIB, $DumpBinCmd." |");
}
while(<LIB>)
- { # 1197 4AC 0000A620 SetThreadStackGuarantee
- # 1198 4AD SetThreadToken (forwarded to ...)
- # 3368 _o2i_ECPublicKey
- # 1 0 00005B30 ??0?N = ... (with pdb)
- if(/\A\s*\d+\s+[a-f\d]+\s+[a-f\d]+\s+([\w\?\@]+)\s*(?:=.+)?\Z/i
- or /\A\s*\d+\s+[a-f\d]+\s+([\w\?\@]+)\s*\(\s*forwarded\s+/
- or /\A\s*\d+\s+_([\w\?\@]+)\s*(?:=.+)?\Z/)
- { # dynamic, static and forwarded symbols
- my $realname = $1;
+ {
+ my $realname = undef;
+ if($LIB_TYPE eq "dynamic")
+ {
+ # 1197 4AC 0000A620 SetThreadStackGuarantee
+ # 1198 4AD SetThreadToken (forwarded to ...)
+ # 3368 _o2i_ECPublicKey
+ # 1 0 00005B30 ??0?N = ... (with pdb)
+ if(/\A\s*\d+\s+[a-f\d]+\s+[a-f\d]+\s+([\w\?\@]+)\s*(?:=.+)?\Z/i
+ or /\A\s*\d+\s+[a-f\d]+\s+([\w\?\@]+)\s*\(\s*forwarded\s+/
+ or /\A\s*\d+\s+_([\w\?\@]+)\s*(?:=.+)?\Z/)
+ { # dynamic, static and forwarded symbols
+ $realname = $1;
+ }
+ }
+ else
+ { # static
+ if(/\A\s{10,}\d*\s+([\w\?\@]+)\s*\Z/i)
+ {
+ # 16 IID_ISecurityInformation
+ $realname = $1;
+ }
+ }
+
+ if($realname)
+ {
if($IsNeededLib)
{
if(not defined $RegisteredObjects_Short{$LibVersion}{$Lib_ShortName})
@@ -19872,7 +19904,7 @@
if(get_filename($Path)=~/\A(|lib)\Q$TargetLibraryName\E[\d\-]*\.$LIB_EXT[\d\.]*\Z/i)
{
registerObject($Path, $LibVersion);
- $Libs{realpath($Path)}=1;
+ $Libs{realpath_F($Path)} = 1;
}
}
}
@@ -19883,7 +19915,7 @@
next if(ignore_path($Path));
next if(skipLib($Path, $LibVersion));
registerObject($Path, $LibVersion);
- $Libs{realpath($Path)}=1;
+ $Libs{realpath_F($Path)} = 1;
}
if($OSgroup eq "macos")
{ # shared libraries on MacOS X may have no extension
@@ -19895,7 +19927,7 @@
and cmd_file($Path)=~/(shared|dynamic)\s+library/i)
{
registerObject($Path, $LibVersion);
- $Libs{realpath($Path)}=1;
+ $Libs{realpath_F($Path)} = 1;
}
}
}
@@ -19907,6 +19939,12 @@
}
}
+sub realpath_F($)
+{
+ my $Path = $_[0];
+ return path_format(realpath($Path), $OSgroup);
+}
+
sub isCyclical($$)
{
my ($Stack, $Value) = @_;
@@ -19976,10 +20014,16 @@
system($Cmd);
chdir($ORIG_DIR);
- $Arch = getArch_Object("$TMP_DIR/test");
+ my $EX = join_P($TMP_DIR, "test");
+
+ if($OSgroup eq "windows") {
+ $EX = join_P($TMP_DIR, "test.exe");
+ }
+
+ $Arch = getArch_Object($EX);
unlink("$TMP_DIR/test.c");
- unlink("$TMP_DIR/test");
+ unlink($EX);
}
if(not $Arch) {
@@ -20300,7 +20344,7 @@
$Descriptor{$LibVersion}{"Version"} = $ABI->{"LibraryVersion"};
}
- if(not $SkipTypes{$LibVersion})
+ if(not keys(%{$SkipTypes{$LibVersion}}))
{ # if not defined by -skip-types option
if(defined $ABI->{"SkipTypes"})
{
@@ -20318,14 +20362,16 @@
}
}
- if(not $SkipSymbols{$LibVersion})
+ if(not keys(%{$SkipSymbols{$LibVersion}}))
{ # if not defined by -skip-symbols option
- $SkipSymbols{$LibVersion} = $ABI->{"SkipSymbols"};
- if(not $SkipSymbols{$LibVersion})
+ if(defined $ABI->{"SkipSymbols"}) {
+ $SkipSymbols{$LibVersion} = $ABI->{"SkipSymbols"};
+ }
+ if(defined $ABI->{"SkipInterfaces"})
{ # support for old dumps
$SkipSymbols{$LibVersion} = $ABI->{"SkipInterfaces"};
}
- if(not $SkipSymbols{$LibVersion})
+ if(defined $ABI->{"InternalInterfaces"})
{ # support for old dumps
$SkipSymbols{$LibVersion} = $ABI->{"InternalInterfaces"};
}
@@ -20887,8 +20933,7 @@
if($Line=~/\A[ \t]*((\/|\w+:\\).+)[ \t]*\Z/)
{
- my $Path = realpath($1);
- $Path = path_format($Path, $OSgroup);
+ my $Path = realpath_F($1);
if(index($Path, "c++")!=-1
or index($Path, "/g++/")!=-1)
{
@@ -21543,6 +21588,9 @@
if(not $LName) {
return 0;
}
+ if($OSgroup eq "windows") {
+ $LName = lc($LName);
+ }
if($TargetLibraryName
and $LName!~/\Q$TargetLibraryName\E/) {
return 0;
@@ -21836,9 +21884,9 @@
sub check_win32_env()
{
- if(not $ENV{"DevEnvDir"}
- or not $ENV{"LIB"}) {
- exitStatus("Error", "can't start without VS environment (vsvars32.bat)");
+ if(not $ENV{"VCINSTALLDIR"}
+ or not $ENV{"INCLUDE"}) {
+ exitStatus("Error", "can't start without VC environment (vcvars64.bat)");
}
}
@@ -22078,13 +22126,14 @@
sub quickEmptyReports()
{ # Quick "empty" reports
- # 4 times faster than merging equal dumps
+ # ~4 times faster than merging equal dumps
# NOTE: the dump contains the "LibraryVersion" attribute
# if you change the version, then your dump will be different
# OVERCOME: use -v1 and v2 options for comparing dumps
# and don't change version in the XML descriptor (and dumps)
# OVERCOME 2: separate meta info from the dumps in ACC 2.0
- if(-s $Descriptor{1}{"Path"} == -s $Descriptor{2}{"Path"})
+ if($Descriptor{1}{"Path"} eq $Descriptor{2}{"Path"}
+ or -s $Descriptor{1}{"Path"} == -s $Descriptor{2}{"Path"})
{
my $FilePath1 = $Descriptor{1}{"Path"};
my $FilePath2 = $Descriptor{2}{"Path"};
@@ -22112,15 +22161,29 @@
my $Content1 = <DUMP1>;
close(DUMP1);
- open(DUMP2, $FilePath2);
- my $Content2 = <DUMP2>;
- close(DUMP2);
+ my $Eq = 0;
+
+ if($FilePath1 eq $FilePath2) {
+ $Eq = 1;
+ }
- if($Content1 eq $Content2)
+ if(not $Eq)
{
+ open(DUMP2, $FilePath2);
+ my $Content2 = <DUMP2>;
+ close(DUMP2);
+
+ if($Content1 eq $Content2) {
+ $Eq = 1;
+ }
+
# clean memory
undef $Content2;
-
+ }
+
+ if($Eq)
+ {
+ printMsg("INFO", "Input ABI dumps are equal, so generating quick empty report");
# read a number of headers, libs, symbols and types
my $ABIdump = eval($Content1);
@@ -22139,6 +22202,11 @@
$ABIdump->{"SymbolInfo"} = $ABIdump->{"FuncDescr"};
}
read_Source_DumpInfo($ABIdump, 1);
+
+ foreach (keys(%{$Registered_Headers{1}})) {
+ $TargetHeaders{1}{$_} = 1;
+ }
+
read_Libs_DumpInfo($ABIdump, 1);
read_Machine_DumpInfo($ABIdump, 1);
read_Machine_DumpInfo($ABIdump, 2);
@@ -22165,6 +22233,16 @@
$Descriptor{1}{"Version"} = $TargetVersion{1}?$TargetVersion{1}:$ABIdump->{"LibraryVersion"};
$Descriptor{2}{"Version"} = $TargetVersion{2}?$TargetVersion{2}:$ABIdump->{"LibraryVersion"};
+
+ if(defined $ABIdump->{"ABI_DUMPER_VERSION"})
+ {
+ $UsedDump{1}{"DWARF"} = 1;
+ $UsedDump{2}{"DWARF"} = 1;
+
+ $UsedDump{1}{"M"} = $ABIdump->{"LibraryName"};
+ $UsedDump{2}{"M"} = $ABIdump->{"LibraryName"};
+ }
+
exitReport();
}
}
@@ -22183,7 +22261,7 @@
if($LogMode ne "n") {
mkpath($LOG_DIR);
}
- $LOG_PATH{$LibVersion} = get_abs_path($LOG_DIR)."/".$LOG_FILE;
+ $LOG_PATH{$LibVersion} = join_P(get_abs_path($LOG_DIR), $LOG_FILE);
if($Debug)
{ # debug directory
$DEBUG_PATH{$LibVersion} = "debug/$TargetLibraryName/".$Descriptor{$LibVersion}{"Version"};
@@ -22259,10 +22337,14 @@
}
detect_default_paths("bin"); # to extract dumps
- if(isDump($Descriptor{1}{"Path"})
- and isDump($Descriptor{2}{"Path"}))
- { # optimization: equal ABI dumps
- quickEmptyReports();
+
+ if(not defined $DisableQuickEmptyReport)
+ {
+ if(isDump($Descriptor{1}{"Path"})
+ and isDump($Descriptor{2}{"Path"}))
+ { # optimization: equal ABI dumps
+ quickEmptyReports();
+ }
}
printMsg("INFO", "preparation, please wait ...");
@@ -22678,6 +22760,7 @@
"CrossGcc"=>$CrossGcc,
"UseStaticLibs"=>$UseStaticLibs,
"NoStdInc"=>$NoStdInc,
+ "CppCompat"=>$CppCompat,
"BinaryOnly" => $BinaryOnly,
"SourceOnly" => $SourceOnly
@@ -22817,7 +22900,7 @@
}
if($ShowVersion)
{
- printMsg("INFO", "ABI Compliance Checker (ABICC) $TOOL_VERSION\nCopyright (C) 2015 Andrey Ponomarenko's ABI Laboratory\nLicense: LGPL or GPL http://www.gnu.org/licenses/\nThis program is free software: you can redistribute it and/or modify it.\n\nWritten by Andrey Ponomarenko.");
+ printMsg("INFO", "ABI Compliance Checker (ABICC) $TOOL_VERSION\nCopyright (C) 2016 Andrey Ponomarenko's ABI Laboratory\nLicense: LGPL or GPL http://www.gnu.org/licenses/\nThis program is free software: you can redistribute it and/or modify it.\n\nWritten by Andrey Ponomarenko.");
exit(0);
}
if($DumpVersion)
@@ -22852,8 +22935,14 @@
if(not -f $TargetLibsPath) {
exitStatus("Access_Error", "can't access file \'$TargetLibsPath\'");
}
- foreach my $Lib (split(/\s*\n\s*/, readFile($TargetLibsPath))) {
- $TargetLibs{$Lib} = 1;
+ foreach my $Lib (split(/\s*\n\s*/, readFile($TargetLibsPath)))
+ {
+ if($OSgroup eq "windows") {
+ $TargetLibs{lc($Lib)} = 1;
+ }
+ else {
+ $TargetLibs{$Lib} = 1;
+ }
}
}
if($TargetHeadersPath)
@@ -22883,7 +22972,10 @@
}
if($DumpSystem)
{ # --dump-system
-
+ if(-d $MODULES_DIR."/Targets/"
+ and -d $MODULES_DIR."/Targets/".$OStarget) {
+ $TargetSysInfo = $MODULES_DIR."/Targets/".$OStarget;
+ }
if(not $TargetSysInfo) {
exitStatus("Error", "-sysinfo option should be specified to dump system ABI");
}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/abi-compliance-checker-1.99.22/doc/Changelog.html new/abi-compliance-checker-1.99.23/doc/Changelog.html
--- old/abi-compliance-checker-1.99.22/doc/Changelog.html 2016-07-04 18:12:19.000000000 +0200
+++ new/abi-compliance-checker-1.99.23/doc/Changelog.html 2016-08-15 18:29:35.000000000 +0200
@@ -44,6 +44,33 @@
<p/>
<br/>
+<b>Version 1.99.23 (August 15, 2016)</b><br/>
+<b>Improvements</b>
+<ul>
+ <li>
+ Improved generation of quick empty reports
+ </li>
+ <li>
+ Improved SysCheck.pm module for analysis of operating systems
+ </li>
+ <li>
+ Improved support for Windows 10
+ </li>
+</ul>
+<b>New Options</b>
+<ul>
+ <li>
+ -disable-quick-empty-report: do not generate quick empty report if input ABI dumps are equal
+ </li>
+</ul>
+<b>Bug Fixes</b>
+<ul>
+ <li>
+ Fixed lists of affected symbols in the XML-format report.
+ </li>
+</ul>
+<br/>
+
<b>Version 1.99.22 (July 04, 2016)</b><br/>
<b>Improvements</b>
<ul>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/abi-compliance-checker-1.99.22/modules/Internals/RegTests.pm new/abi-compliance-checker-1.99.23/modules/Internals/RegTests.pm
--- old/abi-compliance-checker-1.99.22/modules/Internals/RegTests.pm 2016-07-04 18:12:19.000000000 +0200
+++ new/abi-compliance-checker-1.99.23/modules/Internals/RegTests.pm 2016-08-15 18:29:35.000000000 +0200
@@ -72,33 +72,33 @@
$SOURCE2 .= "namespace TestNS {\n";
# Changed template internals
- $HEADER1 .= "
- template