aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Ponomarenko <aponomarenko@rosalab.ru>2013-07-30 19:08:11 +0400
committerAndrey Ponomarenko <aponomarenko@rosalab.ru>2013-07-30 19:08:11 +0400
commitf442c17449649492e74594fcd3d7fc3b3965bfc4 (patch)
tree99c6087213924a15831ab661a1c38170d4b60eb3
parentbe558b873e36f8e28994af8fdacb08cf43b778f3 (diff)
downloadabi-compliance-checker-f442c17449649492e74594fcd3d7fc3b3965bfc4.tar.gz
ABI Compliance Checker 1.99.8
-rw-r--r--INSTALL4
-rw-r--r--README2
-rwxr-xr-xabi-compliance-checker.pl725
-rw-r--r--doc/Changes.html124
-rw-r--r--doc/Descriptor.html2
-rw-r--r--doc/Options.html12
-rw-r--r--doc/Readme.html6
-rw-r--r--doc/SysCheck/Descriptor.html2
-rw-r--r--doc/SysCheck/Examples.html2
-rw-r--r--doc/SysCheck/Usage.html2
10 files changed, 545 insertions, 336 deletions
diff --git a/INSTALL b/INSTALL
index 99f5959..a2156bf 100644
--- a/INSTALL
+++ b/INSTALL
@@ -9,8 +9,8 @@ All rights reserved.
RELEASE INFORMATION
Project: ABI Compliance Checker (ACC)
-Version: 1.99.7
-Date: 2013-07-01
+Version: 1.99.8
+Date: 2013-07-30
This file explains how to install and setup environment
diff --git a/README b/README
index f9665eb..c624b80 100644
--- a/README
+++ b/README
@@ -25,7 +25,7 @@ ADV. USAGE:
For advanced usage, see doc/Readme.html or output of --help option.
COMPATIBILITY:
- ABI Dumper >= 0.97 (https://github.com/lvc/abi-dumper)
+ ABI Dumper >= 0.98 (https://github.com/lvc/abi-dumper)
USAGE WITH ABI DUMPER:
diff --git a/abi-compliance-checker.pl b/abi-compliance-checker.pl
index 305ca0b..5d23dea 100755
--- a/abi-compliance-checker.pl
+++ b/abi-compliance-checker.pl
@@ -1,6 +1,6 @@
#!/usr/bin/perl
###########################################################################
-# ABI Compliance Checker (ACC) 1.99.7
+# ABI Compliance Checker (ACC) 1.99.8
# A tool for checking backward compatibility of a C/C++ library API
#
# Copyright (C) 2009-2010 The Linux Foundation
@@ -38,7 +38,7 @@
#
# COMPATIBILITY
# =============
-# ABI Dumper >= 0.97
+# ABI Dumper >= 0.98
#
#
# This program is free software: you can redistribute it and/or modify
@@ -64,7 +64,7 @@ use Storable qw(dclone);
use Data::Dumper;
use Config;
-my $TOOL_VERSION = "1.99.7";
+my $TOOL_VERSION = "1.99.8";
my $ABI_DUMP_VERSION = "3.2";
my $OLDEST_SUPPORTED_VERSION = "1.18";
my $XML_REPORT_VERSION = "1.1";
@@ -93,7 +93,7 @@ $SkipHeadersPath, $CppCompat, $LogMode, $StdOut, $ListAffected, $ReportFormat,
$UserLang, $TargetHeadersPath, $BinaryOnly, $SourceOnly, $BinaryReportPath,
$SourceReportPath, $UseXML, $Browse, $OpenReport, $SortDump, $DumpFormat,
$ExtraInfo, $ExtraDump, $Force, $Tolerance, $Tolerant, $SkipSymbolsListPath,
-$CheckInfo, $Quick);
+$CheckInfo, $Quick, $AffectLimit, $AllAffected);
my $CmdName = get_filename($0);
my %OS_LibExt = (
@@ -246,6 +246,7 @@ GetOptions("h|help!" => \$Help,
"lang=s" => \$UserLang,
"binary|bin|abi!" => \$BinaryOnly,
"source|src|api!" => \$SourceOnly,
+ "affected-limit=s" => \$AffectLimit,
# other options
"test!" => \$TestTool,
"test-dump!" => \$TestDump,
@@ -274,7 +275,8 @@ GetOptions("h|help!" => \$Help,
"tolerance=s" => \$Tolerance,
"tolerant!" => \$Tolerant,
"check!" => \$CheckInfo,
- "quick!" => \$Quick
+ "quick!" => \$Quick,
+ "all-affected!" => \$AllAffected
) or ERR_MESSAGE();
sub ERR_MESSAGE()
@@ -637,6 +639,10 @@ EXTRA OPTIONS:
Show \"Source\" compatibility problems only.
Generate report to:
compat_reports/LIB_NAME/V1_to_V2/src_compat_report.html
+
+ -affected-limit LIMIT
+ The maximum number of affected symbols listed under the description
+ of the changed type in the report.
OTHER OPTIONS:
-test
@@ -1123,6 +1129,7 @@ my $DEFAULT_STD_PARMS = "std::(allocator|less|char_traits|regex_traits|istreambu
my %DEFAULT_STD_ARGS = map {$_=>1} ("_Alloc", "_Compare", "_Traits", "_Rx_traits", "_InIter", "_OutIter");
my $ADD_TMPL_INSTANCES = 1;
+my $EMERGENCY_MODE_48 = 0;
my %ConstantSuffix = (
"unsigned int"=>"u",
@@ -1593,6 +1600,7 @@ my %ParamClass;
my %SourceAlternative;
my %SourceAlternative_B;
my %SourceReplacement;
+my $CurrentSymbol; # for debugging
# Calling Conventions
my %UseConv_Real = (
@@ -4287,8 +4295,16 @@ sub modelUnmangled($$)
foreach my $ParamPos (sort {int($a) <=> int($b)} @Params)
{ # checking parameters
my $PId = $SymbolInfo{$Version}{$InfoId}{"Param"}{$ParamPos}{"type"};
+ my $PName = $SymbolInfo{$Version}{$InfoId}{"Param"}{$ParamPos}{"name"};
my %PType = get_PureType($PId, $TypeInfo{$Version});
my $PTName = unmangledFormat($PType{"Name"}, $Version);
+
+ if($PName eq "this"
+ and $SymbolInfo{$Version}{$InfoId}{"Type"} eq "Method")
+ {
+ next;
+ }
+
$PTName=~s/\b(restrict|register)\b//g;
if($Compiler eq "MSVC") {
$PTName=~s/\blong long\b/__int64/;
@@ -4499,16 +4515,16 @@ sub correct_incharge($$$)
if($SymbolInfo{$LibVersion}{$InfoId}{"Constructor"})
{
if($MangledNames{$LibVersion}{$Mangled}) {
- $Mangled=~s/C1E/C2E/;
+ $Mangled=~s/C1([EI])/C2$1/;
}
}
elsif($SymbolInfo{$LibVersion}{$InfoId}{"Destructor"})
{
if($MangledNames{$LibVersion}{$Mangled}) {
- $Mangled=~s/D0E/D1E/;
+ $Mangled=~s/D0([EI])/D1$1/;
}
if($MangledNames{$LibVersion}{$Mangled}) {
- $Mangled=~s/D1E/D2E/;
+ $Mangled=~s/D1([EI])/D2$1/;
}
}
return $Mangled;
@@ -5030,9 +5046,11 @@ sub linkSymbol($)
my $InfoId = $_[0];
# try to mangle symbol
if((not check_gcc($GCC_PATH, "4") and $SymbolInfo{$Version}{$InfoId}{"Class"})
- or (check_gcc($GCC_PATH, "4") and not $SymbolInfo{$Version}{$InfoId}{"Class"}))
- { # 1. GCC 3.x doesn't mangle class methods names in the TU dump (only functions and global data)
- # 2. GCC 4.x doesn't mangle C++ functions in the TU dump (only class methods) except extern "C" functions
+ or (check_gcc($GCC_PATH, "4") and not $SymbolInfo{$Version}{$InfoId}{"Class"})
+ or $EMERGENCY_MODE_48)
+ { # GCC 3.x doesn't mangle class methods names in the TU dump (only functions and global data)
+ # GCC 4.x doesn't mangle C++ functions in the TU dump (only class methods) except extern "C" functions
+ # GCC 4.8 doesn't mangle anything
if(not $CheckHeadersOnly)
{
if(my $Mangled = $mangled_name_gcc{modelUnmangled($InfoId, "GCC")}) {
@@ -5040,7 +5058,8 @@ sub linkSymbol($)
}
}
if($CheckHeadersOnly
- or not $BinaryOnly)
+ or not $BinaryOnly
+ or $EMERGENCY_MODE_48)
{ # 1. --headers-only mode
# 2. not mangled src-only symbols
if(my $Mangled = mangle_symbol($InfoId, $Version, "GCC")) {
@@ -5370,7 +5389,7 @@ sub getSymbolInfo($)
}
}
}
- delete($SymbolInfo{$Version}{$InfoId}{"Type"});
+
if($SymbolInfo{$Version}{$InfoId}{"MnglName"}=~/\A_ZN(V|)K/) {
$SymbolInfo{$Version}{$InfoId}{"Const"} = 1;
}
@@ -5549,7 +5568,10 @@ sub setFuncParams($)
{
my $InfoId = $_[0];
my $ParamInfoId = getTreeAttr_Args($InfoId);
- if(getFuncType($InfoId) eq "Method")
+
+ my $FType = getFuncType($InfoId);
+
+ if($FType eq "Method")
{ # check type of "this" pointer
my $ObjectTypeId = getTreeAttr_Type($ParamInfoId);
if(my $ObjectName = $TypeInfo{$Version}{$ObjectTypeId}{"Name"})
@@ -5568,14 +5590,14 @@ sub setFuncParams($)
# skip "this"-parameter
# $ParamInfoId = getNextElem($ParamInfoId);
}
- my ($Pos, $Vtt_Pos) = (0, -1);
+ my ($Pos, $PPos, $Vtt_Pos) = (0, 0, -1);
while($ParamInfoId)
{ # formal args
my $ParamTypeId = getTreeAttr_Type($ParamInfoId);
my $ParamName = getTreeStr(getTreeAttr_Name($ParamInfoId));
if(not $ParamName)
{ # unnamed
- $ParamName = "p".($Pos+1);
+ $ParamName = "p".($PPos+1);
}
if(defined $MissedTypedef{$Version}{$ParamTypeId})
{
@@ -5614,15 +5636,15 @@ sub setFuncParams($)
if(my $Algn = getAlgn($ParamInfoId)) {
$SymbolInfo{$Version}{$InfoId}{"Param"}{$Pos}{"algn"} = $Algn/$BYTE_SIZE;
}
- if(not $SymbolInfo{$Version}{$InfoId}{"Param"}{$Pos}{"name"}) {
- $SymbolInfo{$Version}{$InfoId}{"Param"}{$Pos}{"name"} = "p".($Pos+1);
- }
if($LibInfo{$Version}{"info"}{$ParamInfoId}=~/spec:\s*register /)
{ # foo(register type arg)
$SymbolInfo{$Version}{$InfoId}{"Param"}{$Pos}{"reg"} = 1;
}
$ParamInfoId = getNextElem($ParamInfoId);
$Pos += 1;
+ if($ParamName ne "this" or $FType ne "Method") {
+ $PPos += 1;
+ }
}
if(setFuncArgs($InfoId, $Vtt_Pos)) {
$SymbolInfo{$Version}{$InfoId}{"Param"}{$Pos}{"type"} = "-1";
@@ -5635,7 +5657,11 @@ sub setFuncArgs($$)
my ($InfoId, $Vtt_Pos) = @_;
my $FuncTypeId = getFuncTypeId($InfoId);
my $ParamListElemId = getTreeAttr_Prms($FuncTypeId);
- if(getFuncType($InfoId) eq "Method") {
+ my $FType = getFuncType($InfoId);
+
+ if($FType eq "Method")
+ {
+ # skip "this"-parameter
# $ParamListElemId = getNextElem($ParamListElemId);
}
if(not $ParamListElemId)
@@ -5643,7 +5669,7 @@ sub setFuncArgs($$)
return 1;
}
my $HaveVoid = 0;
- my $Pos = 0;
+ my ($Pos, $PPos) = (0, 0);
while($ParamListElemId)
{ # actual params: may differ from formal args
# formal int*const
@@ -5667,7 +5693,7 @@ sub setFuncArgs($$)
$SymbolInfo{$Version}{$InfoId}{"Param"}{$Pos}{"type"} = $ParamTypeId;
if(not $SymbolInfo{$Version}{$InfoId}{"Param"}{$Pos}{"name"})
{ # unnamed
- $SymbolInfo{$Version}{$InfoId}{"Param"}{$Pos}{"name"} = "p".($Pos+1);
+ $SymbolInfo{$Version}{$InfoId}{"Param"}{$Pos}{"name"} = "p".($PPos+1);
}
}
elsif(my $OldId = $SymbolInfo{$Version}{$InfoId}{"Param"}{$Pos}{"type"})
@@ -5701,6 +5727,9 @@ sub setFuncArgs($$)
}
}
$ParamListElemId = getNextElem($ParamListElemId);
+ if($Pos!=0 or $FType ne "Method") {
+ $PPos += 1;
+ }
$Pos += 1;
}
return ($Pos>=1 and not $HaveVoid);
@@ -6223,6 +6252,7 @@ sub registerDir($$$)
$Dir=~s/[\/\\]+\Z//g;
return if(not $LibVersion or not $Dir or not -d $Dir);
$Dir = get_abs_path($Dir);
+
my $Mode = "All";
if($WithDeps)
{
@@ -7509,41 +7539,41 @@ sub get_ChargeLevel($$)
{
if($CompleteSignature{$LibVersion}{$Symbol}{"Constructor"})
{
- if($Symbol=~/C1E/) {
+ if($Symbol=~/C1[EI]/) {
return "[in-charge]";
}
- elsif($Symbol=~/C2E/) {
+ elsif($Symbol=~/C2[EI]/) {
return "[not-in-charge]";
}
}
elsif($CompleteSignature{$LibVersion}{$Symbol}{"Destructor"})
{
- if($Symbol=~/D1E/) {
+ if($Symbol=~/D1[EI]/) {
return "[in-charge]";
}
- elsif($Symbol=~/D2E/) {
+ elsif($Symbol=~/D2[EI]/) {
return "[not-in-charge]";
}
- elsif($Symbol=~/D0E/) {
+ elsif($Symbol=~/D0[EI]/) {
return "[in-charge-deleting]";
}
}
}
else
{
- if($Symbol=~/C1E/) {
+ if($Symbol=~/C1[EI]/) {
return "[in-charge]";
}
- elsif($Symbol=~/C2E/) {
+ elsif($Symbol=~/C2[EI]/) {
return "[not-in-charge]";
}
- elsif($Symbol=~/D1E/) {
+ elsif($Symbol=~/D1[EI]/) {
return "[in-charge]";
}
- elsif($Symbol=~/D2E/) {
+ elsif($Symbol=~/D2[EI]/) {
return "[not-in-charge]";
}
- elsif($Symbol=~/D0E/) {
+ elsif($Symbol=~/D0[EI]/) {
return "[in-charge-deleting]";
}
}
@@ -7615,10 +7645,12 @@ sub get_Signature($$)
}
if(my $ParamName = $CompleteSignature{$LibVersion}{$Symbol}{"Param"}{$Pos}{"name"})
{
- if($ParamName ne "this" or $Symbol!~/\A(_Z|\?)/)
+ if($ParamName eq "this"
+ and $Symbol=~/\A(_Z|\?)/)
{ # do NOT show first hidded "this"-parameter
- push(@ParamArray, create_member_decl($ParamTypeName, $ParamName));
+ next;
}
+ push(@ParamArray, create_member_decl($ParamTypeName, $ParamName));
}
else {
push(@ParamArray, $ParamTypeName);
@@ -8079,7 +8111,12 @@ sub getCompileCmd($$$)
if($OSgroup eq "macos") {
$GccCall .= "objective-";
}
- if(check_gcc($GCC_PATH, "4"))
+
+ if($EMERGENCY_MODE_48)
+ { # workaround for GCC 4.8 (C only)
+ $GccCall .= "c++";
+ }
+ elsif(check_gcc($GCC_PATH, "4"))
{ # compile as "C++" header
# to obtain complete dump using GCC 4.0
$GccCall .= "c++-header";
@@ -9818,6 +9855,7 @@ sub cleanDump($)
if(not keys(%{$SymbolInfo{$LibVersion}{$InfoId}{"TParam"}})) {
delete($SymbolInfo{$LibVersion}{$InfoId}{"TParam"});
}
+ delete($SymbolInfo{$LibVersion}{$InfoId}{"Type"});
}
foreach my $Tid (keys(%{$TypeInfo{$LibVersion}}))
{
@@ -11314,17 +11352,6 @@ my %Severity_Val=(
"Safe"=>-1
);
-sub maxSeverity($$)
-{
- my ($S1, $S2) = @_;
- if(cmpSeverities($S1, $S2)) {
- return $S1;
- }
- else {
- return $S2;
- }
-}
-
sub cmpSeverities($$)
{
my ($S1, $S2) = @_;
@@ -11337,12 +11364,6 @@ sub cmpSeverities($$)
return ($Severity_Val{$S1}>$Severity_Val{$S2});
}
-sub getProblemSeverity($$)
-{
- my ($Level, $Kind) = @_;
- return $CompatRules{$Level}{$Kind}{"Severity"};
-}
-
sub isRecurType($$$)
{
foreach (@{$_[2]})
@@ -11495,23 +11516,27 @@ sub removeVPtr($)
sub mergeTypes($$$)
{
my ($Type1_Id, $Type2_Id, $Level) = @_;
- return () if(not $Type1_Id or not $Type2_Id);
- my (%Sub_SubProblems, %SubProblems) = ();
+ return {} if(not $Type1_Id or not $Type2_Id);
+
if($Cache{"mergeTypes"}{$Level}{$Type1_Id}{$Type2_Id})
{ # already merged
- return %{$Cache{"mergeTypes"}{$Level}{$Type1_Id}{$Type2_Id}};
+ return $Cache{"mergeTypes"}{$Level}{$Type1_Id}{$Type2_Id};
}
+
my %Type1 = get_Type($Type1_Id, 1);
my %Type2 = get_Type($Type2_Id, 2);
if(not $Type1{"Name"} or not $Type2{"Name"}) {
- return ();
+ return {};
}
$CheckedTypes{$Level}{$Type1{"Name"}} = 1;
my %Type1_Pure = get_PureType($Type1_Id, $TypeInfo{1});
my %Type2_Pure = get_PureType($Type2_Id, $TypeInfo{2});
+
$CheckedTypes{$Level}{$Type1_Pure{"Name"}} = 1;
+ my %SubProblems = ();
+
if($Type1_Pure{"Name"} eq $Type2_Pure{"Name"})
{
if($Type1_Pure{"Type"}=~/Struct|Union/
@@ -11523,8 +11548,7 @@ sub mergeTypes($$$)
"Target"=>$Type1_Pure{"Name"},
"Type_Name"=>$Type1_Pure{"Name"} );
- %{$Cache{"mergeTypes"}{$Level}{$Type1_Id}{$Type2_Id}} = %SubProblems;
- return %SubProblems;
+ return ($Cache{"mergeTypes"}{$Level}{$Type1_Id}{$Type2_Id} = \%SubProblems);
}
}
}
@@ -11535,16 +11559,16 @@ sub mergeTypes($$$)
if(not defined $Type1_Pure{"Memb"} or not defined $Type2_Pure{"Memb"}
or index($Type1_Pure{"Name"}, "<")==-1 or index($Type2_Pure{"Name"}, "<")==-1)
{ # NOTE: template instances have no size
- return ();
+ return {};
}
}
if(isRecurType($Type1_Pure{"Tid"}, $Type2_Pure{"Tid"}, \@RecurTypes))
{ # skip recursive declarations
- return ();
+ return {};
}
- return () if(not $Type1_Pure{"Name"} or not $Type2_Pure{"Name"});
- return () if($SkipTypes{1}{$Type1_Pure{"Name"}});
- return () if($SkipTypes{1}{$Type1{"Name"}});
+ return {} if(not $Type1_Pure{"Name"} or not $Type2_Pure{"Name"});
+ return {} if($SkipTypes{1}{$Type1_Pure{"Name"}});
+ return {} if($SkipTypes{1}{$Type1{"Name"}});
if($Type1_Pure{"Type"}=~/Class|Struct/ and $Type2_Pure{"Type"}=~/Class|Struct/)
{ # support for old ABI dumps
@@ -11658,8 +11682,7 @@ sub mergeTypes($$$)
"New_Value"=>lc($Type2_Pure{"Type"}) );
}
}
- %{$Cache{"mergeTypes"}{$Level}{$Type1_Id}{$Type2_Id}} = %SubProblems;
- return %SubProblems;
+ return ($Cache{"mergeTypes"}{$Level}{$Type1_Id}{$Type2_Id} = \%SubProblems);
}
pushType($Type1_Pure{"Tid"}, $Type2_Pure{"Tid"}, \@RecurTypes);
if(($Type1_Pure{"Name"} eq $Type2_Pure{"Name"}
@@ -11692,22 +11715,17 @@ sub mergeTypes($$$)
"Target"=>$Type1_Pure{"Name"},
"Type_Name"=>$Type1_Pure{"Name"},
"Old_Size"=>$Type1_Pure{"Size"}*$BYTE_SIZE,
- "New_Size"=>$Type2_Pure{"Size"}*$BYTE_SIZE,
- "InitialType_Type"=>$Type1_Pure{"Type"} );
+ "New_Size"=>$Type2_Pure{"Size"}*$BYTE_SIZE);
}
}
if(defined $Type1_Pure{"BaseType"}
and defined $Type2_Pure{"BaseType"})
{ # checking base types
- %Sub_SubProblems = mergeTypes($Type1_Pure{"BaseType"}, $Type2_Pure{"BaseType"}, $Level);
- foreach my $Sub_SubProblemType (keys(%Sub_SubProblems))
+ my $Sub_SubProblems = mergeTypes($Type1_Pure{"BaseType"}, $Type2_Pure{"BaseType"}, $Level);
+ foreach my $Sub_SubProblemType (keys(%{$Sub_SubProblems}))
{
- foreach my $Sub_SubLocation (keys(%{$Sub_SubProblems{$Sub_SubProblemType}}))
- {
- foreach my $Attr (keys(%{$Sub_SubProblems{$Sub_SubProblemType}{$Sub_SubLocation}})) {
- $SubProblems{$Sub_SubProblemType}{$Sub_SubLocation}{$Attr} = $Sub_SubProblems{$Sub_SubProblemType}{$Sub_SubLocation}{$Attr};
- }
- $SubProblems{$Sub_SubProblemType}{$Sub_SubLocation}{"InitialType_Type"} = $Type1_Pure{"Type"};
+ foreach my $Sub_SubLocation (keys(%{$Sub_SubProblems->{$Sub_SubProblemType}})) {
+ $SubProblems{$Sub_SubProblemType}{$Sub_SubLocation} = $Sub_SubProblems->{$Sub_SubProblemType}{$Sub_SubLocation};
}
}
}
@@ -12098,11 +12116,11 @@ sub mergeTypes($$$)
"Type_Name"=>$Type1_Pure{"Name"});
}
}
- %Sub_SubProblems = detectTypeChange($MemberType1_Id, $MemberType2_Id, "Field", $Level);
- foreach my $ProblemType (keys(%Sub_SubProblems))
+ my %Sub_SubChanges = detectTypeChange($MemberType1_Id, $MemberType2_Id, "Field", $Level);
+ foreach my $ProblemType (keys(%Sub_SubChanges))
{
- my $Old_Value = $Sub_SubProblems{$ProblemType}{"Old_Value"};
- my $New_Value = $Sub_SubProblems{$ProblemType}{"New_Value"};
+ my $Old_Value = $Sub_SubChanges{$ProblemType}{"Old_Value"};
+ my $New_Value = $Sub_SubChanges{$ProblemType}{"New_Value"};
# quals
if($ProblemType eq "Field_Type"
@@ -12112,28 +12130,28 @@ sub mergeTypes($$$)
if(checkDump(1, "2.6") and checkDump(2, "2.6"))
{
if(addedQual($Old_Value, $New_Value, "volatile")) {
- %{$Sub_SubProblems{"Field_Became_Volatile"}} = %{$Sub_SubProblems{$ProblemType}};
+ %{$Sub_SubChanges{"Field_Became_Volatile"}} = %{$Sub_SubChanges{$ProblemType}};
}
elsif(removedQual($Old_Value, $New_Value, "volatile")) {
- %{$Sub_SubProblems{"Field_Became_Non_Volatile"}} = %{$Sub_SubProblems{$ProblemType}};
+ %{$Sub_SubChanges{"Field_Became_Non_Volatile"}} = %{$Sub_SubChanges{$ProblemType}};
}
}
if(my $RA = addedQual($Old_Value, $New_Value, "const"))
{
if($RA==2) {
- %{$Sub_SubProblems{"Field_Added_Const"}} = %{$Sub_SubProblems{$ProblemType}};
+ %{$Sub_SubChanges{"Field_Added_Const"}} = %{$Sub_SubChanges{$ProblemType}};
}
else {
- %{$Sub_SubProblems{"Field_Became_Const"}} = %{$Sub_SubProblems{$ProblemType}};
+ %{$Sub_SubChanges{"Field_Became_Const"}} = %{$Sub_SubChanges{$ProblemType}};
}
}
elsif(my $RR = removedQual($Old_Value, $New_Value, "const"))
{
if($RR==2) {
- %{$Sub_SubProblems{"Field_Removed_Const"}} = %{$Sub_SubProblems{$ProblemType}};
+ %{$Sub_SubChanges{"Field_Removed_Const"}} = %{$Sub_SubChanges{$ProblemType}};
}
else {
- %{$Sub_SubProblems{"Field_Became_Non_Const"}} = %{$Sub_SubProblems{$ProblemType}};
+ %{$Sub_SubChanges{"Field_Became_Non_Const"}} = %{$Sub_SubChanges{$ProblemType}};
}
}
}
@@ -12141,21 +12159,21 @@ sub mergeTypes($$$)
if($Level eq "Source")
{
- foreach my $ProblemType (keys(%Sub_SubProblems))
+ foreach my $ProblemType (keys(%Sub_SubChanges))
{
- my $Old_Value = $Sub_SubProblems{$ProblemType}{"Old_Value"};
- my $New_Value = $Sub_SubProblems{$ProblemType}{"New_Value"};
+ my $Old_Value = $Sub_SubChanges{$ProblemType}{"Old_Value"};
+ my $New_Value = $Sub_SubChanges{$ProblemType}{"New_Value"};
if($ProblemType eq "Field_Type")
{
if(cmpBTypes($Old_Value, $New_Value, 1, 2)) {
- delete($Sub_SubProblems{$ProblemType});
+ delete($Sub_SubChanges{$ProblemType});
}
}
}
}
- foreach my $ProblemType (keys(%Sub_SubProblems))
+ foreach my $ProblemType (keys(%Sub_SubChanges))
{
my $ProblemType_Init = $ProblemType;
if($ProblemType eq "Field_Type_And_Size")
@@ -12194,9 +12212,9 @@ sub mergeTypes($$$)
"Target"=>$Member_Name,
"Type_Name"=>$Type1_Pure{"Name"});
- foreach my $Attr (keys(%{$Sub_SubProblems{$ProblemType_Init}}))
+ foreach my $Attr (keys(%{$Sub_SubChanges{$ProblemType_Init}}))
{ # other properties
- $SubProblems{$ProblemType}{$Member_Name}{$Attr} = $Sub_SubProblems{$ProblemType_Init}{$Attr};
+ $SubProblems{$ProblemType}{$Member_Name}{$Attr} = $Sub_SubChanges{$ProblemType_Init}{$Attr};
}
}
if(not isPublic(\%Type1_Pure, $Member_Pos))
@@ -12204,22 +12222,33 @@ sub mergeTypes($$$)
next;
}
if($MemberType1_Id and $MemberType2_Id)
- {# checking member type changes (replace)
- %Sub_SubProblems = mergeTypes($MemberType1_Id, $MemberType2_Id, $Level);
- foreach my $Sub_SubProblemType (keys(%Sub_SubProblems))
+ { # checking member type changes
+ my $Sub_SubProblems = mergeTypes($MemberType1_Id, $MemberType2_Id, $Level);
+
+ my %DupProblems = ();
+
+ foreach my $Sub_SubProblemType (keys(%{$Sub_SubProblems}))
{
- foreach my $Sub_SubLocation (keys(%{$Sub_SubProblems{$Sub_SubProblemType}}))
+ foreach my $Sub_SubLocation (keys(%{$Sub_SubProblems->{$Sub_SubProblemType}}))
{
- my $NewLocation = ($Sub_SubLocation)?$Member_Name."->".$Sub_SubLocation:$Member_Name;
- $SubProblems{$Sub_SubProblemType}{$NewLocation}{"IsInTypeInternals"}=1;
- foreach my $Attr (keys(%{$Sub_SubProblems{$Sub_SubProblemType}{$Sub_SubLocation}})) {
- $SubProblems{$Sub_SubProblemType}{$NewLocation}{$Attr} = $Sub_SubProblems{$Sub_SubProblemType}{$Sub_SubLocation}{$Attr};
+ if(not defined $AllAffected)
+ {
+ if(defined $DupProblems{$Sub_SubProblems->{$Sub_SubProblemType}{$Sub_SubLocation}}) {
+ next;
+ }
}
- if($Sub_SubLocation!~/\-\>/) {
- $SubProblems{$Sub_SubProblemType}{$NewLocation}{"Start_Type_Name"} = $MemberType1_Name;
+
+ my $NewLocation = ($Sub_SubLocation)?$Member_Name."->".$Sub_SubLocation:$Member_Name;
+ $SubProblems{$Sub_SubProblemType}{$NewLocation} = $Sub_SubProblems->{$Sub_SubProblemType}{$Sub_SubLocation};
+
+ if(not defined $AllAffected)
+ {
+ $DupProblems{$Sub_SubProblems->{$Sub_SubProblemType}{$Sub_SubLocation}} = 1;
}
}
}
+
+ %DupProblems = ();
}
}
}
@@ -12291,9 +12320,9 @@ sub mergeTypes($$$)
}
}
}
- %{$Cache{"mergeTypes"}{$Level}{$Type1_Id}{$Type2_Id}} = %SubProblems;
+
pop(@RecurTypes);
- return %SubProblems;
+ return ($Cache{"mergeTypes"}{$Level}{$Type1_Id}{$Type2_Id} = \%SubProblems);
}
sub isUnnamed($) {
@@ -13024,7 +13053,7 @@ sub mergeHeaders($)
and $CompleteSignature{1}{$Symbol}{"Const"})
{
my $Cid = $CompleteSignature{1}{$Symbol}{"Class"};
- %{$CompatProblems{$Level}{$Symbol}{"Removed_Const_Overload"}{$tr_name{$Symbol}}}=(
+ %{$CompatProblems{$Level}{$Symbol}{"Removed_Const_Overload"}{"this"}}=(
"Type_Name"=>$TypeInfo{1}{$Cid}{"Name"},
"Target"=>get_Signature($Alt, 1));
}
@@ -13181,7 +13210,7 @@ sub mergeSymbols($)
{
my $Level = $_[0];
my %SubProblems = ();
-
+
mergeBases($Level);
my %AddedOverloads = ();
@@ -13331,18 +13360,18 @@ sub mergeSymbols($)
my $NewSym = $AddedOverloads{$Prefix}{$Overloads[0]};
if($CompleteSignature{1}{$Symbol}{"Constructor"})
{
- if($Symbol=~/(C1E|C2E)/)
+ if($Symbol=~/(C[1-2][EI])/)
{
my $CtorType = $1;
- $NewSym=~s/(C1E|C2E)/$CtorType/g;
+ $NewSym=~s/(C[1-2][EI])/$CtorType/g;
}
}
elsif($CompleteSignature{1}{$Symbol}{"Destructor"})
{
- if($Symbol=~/(D0E|D1E|D2E)/)
+ if($Symbol=~/(D[0-2][EI])/)
{
my $DtorType = $1;
- $NewSym=~s/(D0E|D1E|D2E)/$DtorType/g;
+ $NewSym=~s/(D[0-2][EI])/$DtorType/g;
}
}
my $NS1 = $CompleteSignature{1}{$Symbol}{"NameSpace"};
@@ -13401,6 +13430,8 @@ sub mergeSymbols($)
}
foreach my $Symbol (sort keys(%{$CompleteSignature{1}}))
{ # checking symbols
+ $CurrentSymbol = $Symbol;
+
my ($SN, $SS, $SV) = separate_symbol($Symbol);
if($Level eq "Source")
{ # remove symbol version
@@ -13629,7 +13660,7 @@ sub mergeSymbols($)
}
%{$CompatProblems{$Level}{$Symbol}{$ProblemType}{showPos($ParamPos)." Parameter"}}=(
"Target"=>$PName,
- "Param_Pos"=>$ParamPos,
+ "Param_Pos"=>adjustParamPos($ParamPos, $Symbol, 2),
"Param_Type"=>$PType2_Name,
"New_Signature"=>get_Signature($Symbol, 2) );
}
@@ -13645,7 +13676,7 @@ sub mergeSymbols($)
{
%{$CompatProblems{$Level}{$Symbol}{"Renamed_Parameter"}{showPos($ParamPos)." Parameter"}}=(
"Target"=>$PName_Old,
- "Param_Pos"=>$ParamPos,
+ "Param_Pos"=>adjustParamPos($ParamPos, $Symbol, 2),
"Param_Type"=>$PType2_Name,
"Old_Value"=>$PName_Old,
"New_Value"=>$PName,
@@ -13660,7 +13691,7 @@ sub mergeSymbols($)
}
%{$CompatProblems{$Level}{$Symbol}{$ProblemType}{showPos($ParamPos)." Parameter"}}=(
"Target"=>$PName,
- "Param_Pos"=>$ParamPos,
+ "Param_Pos"=>adjustParamPos($ParamPos, $Symbol, 2),
"Param_Type"=>$PType2_Name,
"New_Signature"=>get_Signature($Symbol, 2) );
}
@@ -13711,7 +13742,7 @@ sub mergeSymbols($)
}
%{$CompatProblems{$Level}{$Symbol}{$ProblemType}{showPos($ParamPos)." Parameter"}}=(
"Target"=>$PName,
- "Param_Pos"=>$ParamPos,
+ "Param_Pos"=>adjustParamPos($ParamPos, $Symbol, 2),
"Param_Type"=>$PType1_Name,
"New_Signature"=>get_Signature($Symbol, 2) );
}
@@ -13727,7 +13758,7 @@ sub mergeSymbols($)
{
%{$CompatProblems{$Level}{$Symbol}{"Renamed_Parameter"}{showPos($ParamPos)." Parameter"}}=(
"Target"=>$PName,
- "Param_Pos"=>$ParamPos,
+ "Param_Pos"=>adjustParamPos($ParamPos, $Symbol, 2),
"Param_Type"=>$PType1_Name,
"Old_Value"=>$PName,
"New_Value"=>$PName_New,
@@ -13742,7 +13773,7 @@ sub mergeSymbols($)
}
%{$CompatProblems{$Level}{$Symbol}{$ProblemType}{showPos($ParamPos)." Parameter"}}=(
"Target"=>$PName,
- "Param_Pos"=>$ParamPos,
+ "Param_Pos"=>adjustParamPos($ParamPos, $Symbol, 2),
"Param_Type"=>$PType1_Name,
"New_Signature"=>get_Signature($Symbol, 2) );
}
@@ -13753,12 +13784,12 @@ sub mergeSymbols($)
# checking return type
my $ReturnType1_Id = $CompleteSignature{1}{$Symbol}{"Return"};
my $ReturnType2_Id = $CompleteSignature{2}{$PSymbol}{"Return"};
- %SubProblems = detectTypeChange($ReturnType1_Id, $ReturnType2_Id, "Return", $Level);
+ my %RC_SubProblems = detectTypeChange($ReturnType1_Id, $ReturnType2_Id, "Return", $Level);
- foreach my $SubProblemType (keys(%SubProblems))
+ foreach my $SubProblemType (keys(%RC_SubProblems))
{
- my $New_Value = $SubProblems{$SubProblemType}{"New_Value"};
- my $Old_Value = $SubProblems{$SubProblemType}{"Old_Value"};
+ my $New_Value = $RC_SubProblems{$SubProblemType}{"New_Value"};
+ my $Old_Value = $RC_SubProblems{$SubProblemType}{"Old_Value"};
my %ProblemTypes = ();
if($CompleteSignature{1}{$Symbol}{"Data"})
@@ -13920,13 +13951,15 @@ sub mergeSymbols($)
foreach my $ProblemType (keys(%ProblemTypes))
{ # additional
- @{$CompatProblems{$Level}{$Symbol}{$ProblemType}{"retval"}}{keys(%{$SubProblems{$SubProblemType}})} = values %{$SubProblems{$SubProblemType}};
+ $CompatProblems{$Level}{$Symbol}{$ProblemType}{"retval"} = $RC_SubProblems{$SubProblemType};
}
}
if($ReturnType1_Id and $ReturnType2_Id)
{
@RecurTypes = ();
- %SubProblems = mergeTypes($ReturnType1_Id, $ReturnType2_Id, $Level);
+ my $Sub_SubProblems = mergeTypes($ReturnType1_Id, $ReturnType2_Id, $Level);
+
+ my $AddProblems = {};
if($CompleteSignature{1}{$Symbol}{"Data"})
{
@@ -13934,17 +13967,17 @@ sub mergeSymbols($)
{
if(get_PLevel($ReturnType1_Id, 1)==0)
{
- foreach my $SubProblemType (keys(%SubProblems))
+ foreach my $SubProblemType (keys(%{$Sub_SubProblems}))
{ # add "Global_Data_Size" problem
- my $New_Value = $SubProblems{$SubProblemType}{"New_Value"};
- my $Old_Value = $SubProblems{$SubProblemType}{"Old_Value"};
+ my $New_Value = $Sub_SubProblems->{$SubProblemType}{"New_Value"};
+ my $Old_Value = $Sub_SubProblems->{$SubProblemType}{"Old_Value"};
if($SubProblemType eq "DataType_Size")
{ # add a new problem
- %{$SubProblems{"Global_Data_Size"}} = %{$SubProblems{$SubProblemType}};
+ $AddProblems->{"Global_Data_Size"} = $Sub_SubProblems->{$SubProblemType};
}
}
}
- if(not defined $SubProblems{"Global_Data_Size"})
+ if(not defined $AddProblems->{"Global_Data_Size"})
{
if(defined $GlobalDataObject{1}{$Symbol}
and defined $GlobalDataObject{2}{$Symbol})
@@ -13953,25 +13986,30 @@ sub mergeSymbols($)
my $New_Size = $GlobalDataObject{2}{$Symbol};
if($Old_Size!=$New_Size)
{
- %{$SubProblems{"Global_Data_Size"}{"retval"}} = (
+ $AddProblems->{"Global_Data_Size"}{"retval"} = {
"Old_Size"=>$Old_Size*$BYTE_SIZE,
- "New_Size"=>$New_Size*$BYTE_SIZE );
+ "New_Size"=>$New_Size*$BYTE_SIZE };
}
}
}
}
}
- foreach my $SubProblemType (keys(%SubProblems))
+
+ foreach my $SubProblemType (keys(%{$AddProblems}))
{
- foreach my $SubLocation (keys(%{$SubProblems{$SubProblemType}}))
+ foreach my $SubLocation (keys(%{$AddProblems->{$SubProblemType}}))
{
my $NewLocation = ($SubLocation)?"retval->".$SubLocation:"retval";
- %{$CompatProblems{$Level}{$Symbol}{$SubProblemType}{$NewLocation}}=(
- "Return_Type_Name"=>$TypeInfo{1}{$ReturnType1_Id}{"Name"} );
- @{$CompatProblems{$Level}{$Symbol}{$SubProblemType}{$NewLocation}}{keys(%{$SubProblems{$SubProblemType}{$SubLocation}})} = values %{$SubProblems{$SubProblemType}{$SubLocation}};
- if($SubLocation!~/\-\>/) {
- $CompatProblems{$Level}{$Symbol}{$SubProblemType}{$NewLocation}{"Start_Type_Name"} = $TypeInfo{1}{$ReturnType1_Id}{"Name"};
- }
+ $CompatProblems{$Level}{$Symbol}{$SubProblemType}{$NewLocation} = $AddProblems->{$SubProblemType}{$SubLocation};
+ }
+ }
+
+ foreach my $SubProblemType (keys(%{$Sub_SubProblems}))
+ {
+ foreach my $SubLocation (keys(%{$Sub_SubProblems->{$SubProblemType}}))
+ {
+ my $NewLocation = ($SubLocation)?"retval->".$SubLocation:"retval";
+ $CompatProblems{$Level}{$Symbol}{$SubProblemType}{$NewLocation} = $Sub_SubProblems->{$SubProblemType}{$SubLocation};
}
}
}
@@ -13987,18 +14025,13 @@ sub mergeSymbols($)
if($ThisPtr1_Id and $ThisPtr2_Id)
{
@RecurTypes = ();
- %SubProblems = mergeTypes($ThisPtr1_Id, $ThisPtr2_Id, $Level);
- foreach my $SubProblemType (keys(%SubProblems))
+ my $Sub_SubProblems = mergeTypes($ThisPtr1_Id, $ThisPtr2_Id, $Level);
+ foreach my $SubProblemType (keys(%{$Sub_SubProblems}))
{
- foreach my $SubLocation (keys(%{$SubProblems{$SubProblemType}}))
+ foreach my $SubLocation (keys(%{$Sub_SubProblems->{$SubProblemType}}))
{
my $NewLocation = ($SubLocation)?"this->".$SubLocation:"this";
- %{$CompatProblems{$Level}{$Symbol}{$SubProblemType}{$NewLocation}}=(
- "Object_Type_Name"=>$TypeInfo{1}{$ObjTId1}{"Name"} );
- @{$CompatProblems{$Level}{$Symbol}{$SubProblemType}{$NewLocation}}{keys(%{$SubProblems{$SubProblemType}{$SubLocation}})} = values %{$SubProblems{$SubProblemType}{$SubLocation}};
- if($SubLocation!~/\-\>/) {
- $CompatProblems{$Level}{$Symbol}{$SubProblemType}{$NewLocation}{"Start_Type_Name"} = $TypeInfo{1}{$ObjTId1}{"Name"};
- }
+ $CompatProblems{$Level}{$Symbol}{$SubProblemType}{$NewLocation} = $Sub_SubProblems->{$SubProblemType}{$SubLocation};
}
}
}
@@ -14186,7 +14219,7 @@ sub mergeParameters($$$$$$)
return;
}
- if(index($Symbol, "_Z")==0)
+ if($Symbol=~/\A(_Z|\?)/)
{ # do not merge "this"
if($PName1 eq "this" or $PName2 eq "this") {
return;
@@ -14208,14 +14241,14 @@ sub mergeParameters($$$$$$)
{
%{$CompatProblems{$Level}{$Symbol}{"Parameter_Became_Non_Register"}{$Parameter_Location}}=(
"Target"=>$PName1,
- "Param_Pos"=>$ParamPos1 );
+ "Param_Pos"=>adjustParamPos($ParamPos1, $Symbol, 1) );
}
elsif(not $CompleteSignature{1}{$Symbol}{"Param"}{$ParamPos1}{"reg"}
and $CompleteSignature{2}{$PSymbol}{"Param"}{$ParamPos2}{"reg"})
{
%{$CompatProblems{$Level}{$Symbol}{"Parameter_Became_Register"}{$Parameter_Location}}=(
"Target"=>$PName1,
- "Param_Pos"=>$ParamPos1 );
+ "Param_Pos"=>adjustParamPos($ParamPos1, $Symbol, 1) );
}
}
@@ -14232,7 +14265,7 @@ sub mergeParameters($$$$$$)
{
%{$CompatProblems{$Level}{$Symbol}{"Parameter_Changed_Register"}{$Parameter_Location}}=(
"Target"=>$PName1,
- "Param_Pos"=>$ParamPos1,
+ "Param_Pos"=>adjustParamPos($ParamPos1, $Symbol, 1),
"Old_Value"=>$Old_Regs,
"New_Value"=>$New_Regs );
}
@@ -14241,14 +14274,14 @@ sub mergeParameters($$$$$$)
{
%{$CompatProblems{$Level}{$Symbol}{"Parameter_From_Register"}{$Parameter_Location}}=(
"Target"=>$PName1,
- "Param_Pos"=>$ParamPos1,
+ "Param_Pos"=>adjustParamPos($ParamPos1, $Symbol, 1),
"Old_Value"=>$Old_Regs );
}
elsif(not $Old_Regs and $New_Regs)
{
%{$CompatProblems{$Level}{$Symbol}{"Parameter_To_Register"}{$Parameter_Location}}=(
"Target"=>$PName1,
- "Param_Pos"=>$ParamPos1,
+ "Param_Pos"=>adjustParamPos($ParamPos1, $Symbol, 1),
"New_Value"=>$New_Regs );
}
if((my $Old_Offset = $CompleteSignature{1}{$Symbol}{"Param"}{$ParamPos1}{"offset"}) ne ""
@@ -14256,11 +14289,20 @@ sub mergeParameters($$$$$$)
{
if($Old_Offset ne $New_Offset)
{
- %{$CompatProblems{$Level}{$Symbol}{"Parameter_Changed_Offset"}{$Parameter_Location}}=(
- "Target"=>$PName1,
- "Param_Pos"=>$ParamPos1,
- "Old_Value"=>$Old_Offset,
- "New_Value"=>$New_Offset );
+ my $Start1 = $CompleteSignature{1}{$Symbol}{"Param"}{0}{"offset"};
+ my $Start2 = $CompleteSignature{2}{$Symbol}{"Param"}{0}{"offset"};
+
+ $Old_Offset = $Old_Offset - $Start1;
+ $New_Offset = $New_Offset - $Start2;
+
+ if($Old_Offset ne $New_Offset)
+ {
+ %{$CompatProblems{$Level}{$Symbol}{"Parameter_Changed_Offset"}{$Parameter_Location}}=(
+ "Target"=>$PName1,
+ "Param_Pos"=>adjustParamPos($ParamPos1, $Symbol, 1),
+ "Old_Value"=>$Old_Offset,
+ "New_Value"=>$New_Offset );
+ }
}
}
}
@@ -14304,7 +14346,7 @@ sub mergeParameters($$$$$$)
{ # FIXME: how to distinguish "0" and 0 (NULL)
%{$CompatProblems{$Level}{$Symbol}{"Parameter_Default_Value_Changed"}{$Parameter_Location}}=(
"Target"=>$PName1,
- "Param_Pos"=>$ParamPos1,
+ "Param_Pos"=>adjustParamPos($ParamPos1, $Symbol, 1),
"Old_Value"=>$Value_Old,
"New_Value"=>$Value_New );
}
@@ -14313,7 +14355,7 @@ sub mergeParameters($$$$$$)
{
%{$CompatProblems{$Level}{$Symbol}{"Parameter_Default_Value_Removed"}{$Parameter_Location}}=(
"Target"=>$PName1,
- "Param_Pos"=>$ParamPos1,
+ "Param_Pos"=>adjustParamPos($ParamPos1, $Symbol, 1),
"Old_Value"=>$Value_Old );
}
}
@@ -14322,7 +14364,7 @@ sub mergeParameters($$$$$$)
$Value_New = showVal($Value_New, $PType2_Id, 2);
%{$CompatProblems{$Level}{$Symbol}{"Parameter_Default_Value_Added"}{$Parameter_Location}}=(
"Target"=>$PName1,
- "Param_Pos"=>$ParamPos1,
+ "Param_Pos"=>adjustParamPos($ParamPos1, $Symbol, 1),
"New_Value"=>$Value_New );
}
}
@@ -14335,7 +14377,7 @@ sub mergeParameters($$$$$$)
{ # except unnamed "..." value list (Id=-1)
%{$CompatProblems{$Level}{$Symbol}{"Renamed_Parameter"}{showPos($ParamPos1)." Parameter"}}=(
"Target"=>$PName1,
- "Param_Pos"=>$ParamPos1,
+ "Param_Pos"=>adjustParamPos($ParamPos1, $Symbol, 1),
"Param_Type"=>$TypeInfo{1}{$PType1_Id}{"Name"},
"Old_Value"=>$PName1,
"New_Value"=>$PName2,
@@ -14345,6 +14387,7 @@ sub mergeParameters($$$$$$)
# checking type change (replace)
my %SubProblems = detectTypeChange($PType1_Id, $PType2_Id, "Parameter", $Level);
+
foreach my $SubProblemType (keys(%SubProblems))
{ # add new problems, remove false alarms
my $New_Value = $SubProblems{$SubProblemType}{"New_Value"};
@@ -14482,35 +14525,29 @@ sub mergeParameters($$$$$$)
}
%{$CompatProblems{$Level}{$Symbol}{$NewProblemType}{$Parameter_Location}}=(
"Target"=>$PName1,
- "Param_Pos"=>$ParamPos1,
+ "Param_Pos"=>adjustParamPos($ParamPos1, $Symbol, 1),
"New_Signature"=>get_Signature($Symbol, 2) );
@{$CompatProblems{$Level}{$Symbol}{$NewProblemType}{$Parameter_Location}}{keys(%{$SubProblems{$SubProblemType}})} = values %{$SubProblems{$SubProblemType}};
}
+
@RecurTypes = ();
+
# checking type definition changes
- my %SubProblems_Merge = mergeTypes($PType1_Id, $PType2_Id, $Level);
- foreach my $SubProblemType (keys(%SubProblems_Merge))
+ my $Sub_SubProblems = mergeTypes($PType1_Id, $PType2_Id, $Level);
+ foreach my $SubProblemType (keys(%{$Sub_SubProblems}))
{
- foreach my $SubLocation (keys(%{$SubProblems_Merge{$SubProblemType}}))
+ foreach my $SubLocation (keys(%{$Sub_SubProblems->{$SubProblemType}}))
{
my $NewProblemType = $SubProblemType;
if($SubProblemType eq "DataType_Size")
{
- my $InitialType_Type = $SubProblems_Merge{$SubProblemType}{$SubLocation}{"InitialType_Type"};
- if($InitialType_Type!~/\A(Pointer|Ref)\Z/ and $SubLocation!~/\-\>/)
+ if($Type1{"Type"}!~/\A(Pointer|Ref)\Z/ and $SubLocation!~/\-\>/)
{ # stack has been affected
$NewProblemType = "DataType_Size_And_Stack";
}
}
my $NewLocation = ($SubLocation)?$Parameter_Location."->".$SubLocation:$Parameter_Location;
- %{$CompatProblems{$Level}{$Symbol}{$NewProblemType}{$NewLocation}}=(
- "Param_Type"=>$TypeInfo{1}{$PType1_Id}{"Name"},
- "Param_Pos"=>$ParamPos1,
- "Param_Name"=>$PName1 );
- @{$CompatProblems{$Level}{$Symbol}{$NewProblemType}{$NewLocation}}{keys(%{$SubProblems_Merge{$SubProblemType}{$SubLocation}})} = values %{$SubProblems_Merge{$SubProblemType}{$SubLocation}};
- if($SubLocation!~/\-\>/) {
- $CompatProblems{$Level}{$Symbol}{$NewProblemType}{$NewLocation}{"Start_Type_Name"} = $TypeInfo{1}{$PType1_Id}{"Name"};
- }
+ $CompatProblems{$Level}{$Symbol}{$NewProblemType}{$NewLocation} = $Sub_SubProblems->{$SubProblemType}{$SubLocation};
}
}
}
@@ -14766,8 +14803,7 @@ sub detectTypeChange($$$$)
"Old_Value"=>$Type1_Base{"Name"},
"New_Value"=>$Type2_Base{"Name"},
"Old_Size"=>$Type1_Base{"Size"}*$BYTE_SIZE,
- "New_Size"=>$Type2_Base{"Size"}*$BYTE_SIZE,
- "InitialType_Type"=>$Type1_Pure{"Type"});
+ "New_Size"=>$Type2_Base{"Size"}*$BYTE_SIZE);
}
else
{
@@ -14777,8 +14813,7 @@ sub detectTypeChange($$$$)
"Old_Value"=>$Type1_Base{"Name"},
"New_Value"=>$Type2_Base{"Name"},
"Old_Size"=>$Type1_Base{"Size"}*$BYTE_SIZE,
- "New_Size"=>$Type2_Base{"Size"}*$BYTE_SIZE,
- "InitialType_Type"=>$Type1_Pure{"Type"});
+ "New_Size"=>$Type2_Base{"Size"}*$BYTE_SIZE);
}
elsif(tNameLock($Type1_Base{"Tid"}, $Type2_Base{"Tid"}))
{
@@ -14786,8 +14821,7 @@ sub detectTypeChange($$$$)
"Old_Value"=>$Type1_Base{"Name"},
"New_Value"=>$Type2_Base{"Name"},
"Old_Size"=>$Type1_Base{"Size"}*$BYTE_SIZE,
- "New_Size"=>$Type2_Base{"Size"}*$BYTE_SIZE,
- "InitialType_Type"=>$Type1_Pure{"Type"});
+ "New_Size"=>$Type2_Base{"Size"}*$BYTE_SIZE);
}
}
}
@@ -14801,16 +14835,14 @@ sub detectTypeChange($$$$)
{
%{$LocalProblems{"Return_Type_From_Void"}}=(
"New_Value"=>$Type2{"Name"},
- "New_Size"=>$Type2{"Size"}*$BYTE_SIZE,
- "InitialType_Type"=>$Type1_Pure{"Type"});
+ "New_Size"=>$Type2{"Size"}*$BYTE_SIZE);
}
elsif($Prefix eq "Return"
and $Type2_Pure{"Name"} eq "void")
{
%{$LocalProblems{"Return_Type_Became_Void"}}=(
"Old_Value"=>$Type1{"Name"},
- "Old_Size"=>$Type1{"Size"}*$BYTE_SIZE,
- "InitialType_Type"=>$Type1_Pure{"Type"});
+ "Old_Size"=>$Type1{"Size"}*$BYTE_SIZE);
}
else
{
@@ -14822,8 +14854,7 @@ sub detectTypeChange($$$$)
"Old_Value"=>$Type1{"Name"},
"New_Value"=>$Type2{"Name"},
"Old_Size"=>$Type1{"Size"}*$BYTE_SIZE,
- "New_Size"=>$Type2{"Size"}*$BYTE_SIZE,
- "InitialType_Type"=>$Type1_Pure{"Type"});
+ "New_Size"=>$Type2{"Size"}*$BYTE_SIZE);
}
else
{
@@ -14833,8 +14864,7 @@ sub detectTypeChange($$$$)
"Old_Value"=>$Type1{"Name"},
"New_Value"=>$Type2{"Name"},
"Old_Size"=>$Type1{"Size"}*$BYTE_SIZE,
- "New_Size"=>$Type2{"Size"}*$BYTE_SIZE,
- "InitialType_Type"=>$Type1_Pure{"Type"});
+ "New_Size"=>$Type2{"Size"}*$BYTE_SIZE);
}
elsif(tNameLock($Type1_Id, $Type2_Id))
{ # FIXME: correct this condition
@@ -14842,8 +14872,7 @@ sub detectTypeChange($$$$)
"Old_Value"=>$Type1{"Name"},
"New_Value"=>$Type2{"Name"},
"Old_Size"=>$Type1{"Size"}*$BYTE_SIZE,
- "New_Size"=>$Type2{"Size"}*$BYTE_SIZE,
- "InitialType_Type"=>$Type1_Pure{"Type"});
+ "New_Size"=>$Type2{"Size"}*$BYTE_SIZE);
}
}
}
@@ -15581,7 +15610,7 @@ sub get_TypeProblems_Count($$$)
foreach my $Location (keys(%{$TypeChanges->{$Type_Name}{$Kind}}))
{
my $Target = $TypeChanges->{$Type_Name}{$Kind}{$Location}{"Target"};
- my $Priority = getProblemSeverity($Level, $Kind);
+ my $Priority = $CompatRules{$Level}{$Kind}{"Severity"};
next if($Priority ne $TargetPriority);
if($Kinds_Target{$Kind}{$Target}) {
next;
@@ -15646,7 +15675,7 @@ sub get_Summary($)
{
foreach my $Location (sort keys(%{$CompatProblems{$Level}{$Interface}{$Kind}}))
{
- my $Priority = getProblemSeverity($Level, $Kind);
+ my $Priority = $CompatRules{$Level}{$Kind}{"Severity"};
if($Kind eq "Added_Symbol") {
$Added += 1;
}
@@ -15685,21 +15714,43 @@ sub get_Summary($)
{
if($CompatRules{$Level}{$Kind}{"Kind"} eq "Types")
{
- foreach my $Location (sort {cmp_locations($b, $a)} sort keys(%{$CompatProblems{$Level}{$Interface}{$Kind}}))
+ foreach my $Location (sort {cmpLocations($b, $a)} sort keys(%{$CompatProblems{$Level}{$Interface}{$Kind}}))
{
my $Type_Name = $CompatProblems{$Level}{$Interface}{$Kind}{$Location}{"Type_Name"};
my $Target = $CompatProblems{$Level}{$Interface}{$Kind}{$Location}{"Target"};
- my $Priority = getProblemSeverity($Level, $Kind);
- if(cmpSeverities($Type_MaxSeverity{$Level}{$Type_Name}{$Kind}{$Target}, $Priority))
+ my $Priority = $CompatRules{$Level}{$Kind}{"Severity"};
+ my $MaxSeverity = $Type_MaxSeverity{$Level}{$Type_Name}{$Kind}{$Target};
+
+ if($MaxSeverity and $Severity_Val{$MaxSeverity}>$Severity_Val{$Priority})
{ # select a problem with the highest priority
next;
}
+
if(($Priority ne "Low" or $StrictCompat)
- and $Priority ne "Safe") {
- $TotalAffected{$Level}{$Interface} = maxSeverity($TotalAffected{$Level}{$Interface}, $Priority);
+ and $Priority ne "Safe")
+ {
+ if(defined $TotalAffected{$Level}{$Interface})
+ {
+ if($Severity_Val{$Priority}>$Severity_Val{$TotalAffected{$Level}{$Interface}}) {
+ $TotalAffected{$Level}{$Interface} = $Priority;
+ }
+ }
+ else {
+ $TotalAffected{$Level}{$Interface} = $Priority;
+ }
+ }
+
+ $TypeChanges{$Type_Name}{$Kind}{$Location} = $CompatProblems{$Level}{$Interface}{$Kind}{$Location};
+
+ if($MaxSeverity)
+ {
+ if($Severity_Val{$Priority}>$Severity_Val{$MaxSeverity}) {
+ $Type_MaxSeverity{$Level}{$Type_Name}{$Kind}{$Target} = $Priority;
+ }
+ }
+ else {
+ $Type_MaxSeverity{$Level}{$Type_Name}{$Kind}{$Target} = $Priority;
}
- %{$TypeChanges{$Type_Name}{$Kind}{$Location}} = %{$CompatProblems{$Level}{$Interface}{$Kind}{$Location}};
- $Type_MaxSeverity{$Level}{$Type_Name}{$Kind}{$Target} = maxSeverity($Type_MaxSeverity{$Level}{$Type_Name}{$Kind}{$Target}, $Priority);
}
}
}
@@ -15710,6 +15761,8 @@ sub get_Summary($)
$T_Problems_Low = get_TypeProblems_Count(\%TypeChanges, "Low", $Level);
$T_Other = get_TypeProblems_Count(\%TypeChanges, "Safe", $Level);
+ %TypeChanges = (); # free memory
+
if($CheckObjectsOnly)
{ # only removed exported symbols
$RESULT{$Level}{"Affected"} = $Removed*100/keys(%{$Symbol_Library{1}});
@@ -15756,7 +15809,7 @@ sub get_Summary($)
{
foreach my $Kind (keys(%{$CompatProblems_Constants{$Level}{$Constant}}))
{
- my $Severity = getProblemSeverity($Level, $Kind);
+ my $Severity = $CompatRules{$Level}{$Kind}{"Severity"};
if($Severity eq "Safe")
{
$C_Other+=1;
@@ -16189,7 +16242,7 @@ sub get_Report_ChangedConstants($$)
if(not defined $CompatRules{$Level}{$Kind}) {
next;
}
- if($TargetSeverity ne getProblemSeverity($Level, $Kind)) {
+ if($TargetSeverity ne $CompatRules{$Level}{$Kind}{"Severity"}) {
next;
}
$ReportMap{$Header}{$Constant}{$Kind} = 1;
@@ -16685,7 +16738,7 @@ sub get_Report_SymbolProblems($$)
%{$SymbolChanges{$Symbol}{$Kind}} = %{$CompatProblems{$Level}{$Symbol}{$Kind}};
foreach my $Location (sort keys(%{$SymbolChanges{$Symbol}{$Kind}}))
{
- my $Priority = getProblemSeverity($Level, $Kind);
+ my $Priority = $CompatRules{$Level}{$Kind}{"Severity"};
if($Priority ne $TargetSeverity) {
delete($SymbolChanges{$Symbol}{$Kind}{$Location});
}
@@ -16719,6 +16772,7 @@ sub get_Report_SymbolProblems($$)
{
my %Problem = %{$SymbolChanges{$Symbol}{$Kind}{$Location}};
$Problem{"Param_Pos"} = showPos($Problem{"Param_Pos"});
+
$INTERFACE_PROBLEMS .= " <problem id=\"$Kind\">\n";
my $Change = $CompatRules{$Level}{$Kind}{"Change"};
$INTERFACE_PROBLEMS .= " <change".getXmlParams($Change, \%Problem).">$Change</change>\n";
@@ -16830,11 +16884,11 @@ sub get_Report_TypeProblems($$)
{
if($CompatRules{$Level}{$Kind}{"Kind"} eq "Types")
{
- foreach my $Location (sort {cmp_locations($b, $a)} sort keys(%{$CompatProblems{$Level}{$Interface}{$Kind}}))
+ foreach my $Location (sort {cmpLocations($b, $a)} sort keys(%{$CompatProblems{$Level}{$Interface}{$Kind}}))
{
my $TypeName = $CompatProblems{$Level}{$Interface}{$Kind}{$Location}{"Type_Name"};
my $Target = $CompatProblems{$Level}{$Interface}{$Kind}{$Location}{"Target"};
- my $Severity = getProblemSeverity($Level, $Kind);
+ my $Severity = $CompatRules{$Level}{$Kind}{"Severity"};
if($Severity eq "Safe"
and $TargetSeverity ne "Safe") {
next;
@@ -16855,9 +16909,9 @@ sub get_Report_TypeProblems($$)
my %Kinds_Target = ();
foreach my $Kind (sort keys(%{$TypeChanges{$TypeName}}))
{
- foreach my $Location (sort {cmp_locations($b, $a)} sort keys(%{$TypeChanges{$TypeName}{$Kind}}))
+ foreach my $Location (sort {cmpLocations($b, $a)} sort keys(%{$TypeChanges{$TypeName}{$Kind}}))
{
- my $Severity = getProblemSeverity($Level, $Kind);
+ my $Severity = $CompatRules{$Level}{$Kind}{"Severity"};
if($Severity ne $TargetSeverity)
{ # other priority
delete($TypeChanges{$TypeName}{$Kind}{$Location});
@@ -16893,7 +16947,7 @@ sub get_Report_TypeProblems($$)
$TYPE_PROBLEMS .= " <type name=\"".xmlSpecChars($TypeName)."\">\n";
foreach my $Kind (sort {$b=~/Size/ <=> $a=~/Size/} sort keys(%{$TypeChanges{$TypeName}}))
{
- foreach my $Location (sort {cmp_locations($b, $a)} sort keys(%{$TypeChanges{$TypeName}{$Kind}}))
+ foreach my $Location (sort {cmpLocations($b, $a)} sort keys(%{$TypeChanges{$TypeName}{$Kind}}))
{
my %Problem = %{$TypeChanges{$TypeName}{$Kind}{$Location}};
$TYPE_PROBLEMS .= " <problem id=\"$Kind\">\n";
@@ -16935,7 +16989,7 @@ sub get_Report_TypeProblems($$)
my $TYPE_REPORT = "";
foreach my $Kind (sort {$b=~/Size/ <=> $a=~/Size/} sort keys(%{$TypeChanges{$TypeName}}))
{
- foreach my $Location (sort {cmp_locations($b, $a)} sort keys(%{$TypeChanges{$TypeName}{$Kind}}))
+ foreach my $Location (sort {cmpLocations($b, $a)} sort keys(%{$TypeChanges{$TypeName}{$Kind}}))
{
my %Problem = %{$TypeChanges{$TypeName}{$Kind}{$Location}};
if(my $Change = applyMacroses($Level, $Kind, $CompatRules{$Level}{$Kind}{"Change"}, \%Problem))
@@ -17111,13 +17165,65 @@ sub simpleVEntry($)
return $VEntry;
}
+sub adjustParamPos($$$)
+{
+ my ($Pos, $Symbol, $LibVersion) = @_;
+ if(defined $CompleteSignature{$LibVersion}{$Symbol})
+ {
+ if(not $CompleteSignature{$LibVersion}{$Symbol}{"Static"}
+ and $CompleteSignature{$LibVersion}{$Symbol}{"Class"})
+ {
+ return $Pos-1;
+ }
+
+ return $Pos;
+ }
+
+ return undef;
+}
+
+sub getParamPos($$$)
+{
+ my ($Name, $Symbol, $LibVersion) = @_;
+
+ if(defined $CompleteSignature{$LibVersion}{$Symbol}
+ and defined $CompleteSignature{$LibVersion}{$Symbol}{"Param"})
+ {
+ my $Info = $CompleteSignature{$LibVersion}{$Symbol};
+ foreach (keys(%{$Info->{"Param"}}))
+ {
+ if($Info->{"Param"}{$_}{"name"} eq $Name)
+ {
+ return $_;
+ }
+ }
+ }
+
+ return undef;
+}
+
+sub getParamName($)
+{
+ my $Loc = $_[0];
+ $Loc=~s/\->.*//g;
+ return $Loc;
+}
+
sub getAffectedSymbols($$$$)
{
my ($Level, $Target_TypeName, $Kinds_Locations, $Syms) = @_;
my $LIMIT = 1000;
- if($#{$Syms}>=10000)
- { # reduce size of the report
- $LIMIT = 10;
+
+ if(defined $AffectLimit)
+ {
+ $LIMIT = $AffectLimit;
+ }
+ else
+ {
+ if($#{$Syms}>=10000)
+ { # reduce size of the report
+ $LIMIT = 10;
+ }
}
my %SProblems = ();
foreach my $Symbol (@{$Syms})
@@ -17125,7 +17231,7 @@ sub getAffectedSymbols($$$$)
if(keys(%SProblems)>$LIMIT) {
last;
}
- if(($Symbol=~/C2E|D2E|D0E/))
+ if(($Symbol=~/(C2|D2|D0)[EI]/))
{ # duplicated problems for C2 constructors, D2 and D0 destructors
next;
}
@@ -17153,9 +17259,10 @@ sub getAffectedSymbols($$$$)
my $Type_Name = $CompatProblems{$Level}{$Symbol}{$Kind}{$Location}{"Type_Name"};
next if($Type_Name ne $Target_TypeName);
- my $Position = $CompatProblems{$Level}{$Symbol}{$Kind}{$Location}{"Param_Pos"};
- my $Param_Name = $CompatProblems{$Level}{$Symbol}{$Kind}{$Location}{"Param_Name"};
- my $Severity = getProblemSeverity($Level, $Kind);
+ my $PName = getParamName($Location);
+ my $PPos = adjustParamPos(getParamPos($PName, $Symbol, 1), $Symbol, 1);
+
+ my $Severity = $CompatRules{$Level}{$Kind}{"Severity"};
my $Path_Length = 0;
my $ProblemLocation = $Location;
if($Type_Name) {
@@ -17165,17 +17272,17 @@ sub getAffectedSymbols($$$$)
$Path_Length += 1;
}
if($MinPath_Length==-1 or ($Path_Length<=$MinPath_Length and $Severity_Val{$Severity}>$Severity_Max)
- or (cmp_locations($ProblemLocation, $ProblemLocation_Last) and $Severity_Val{$Severity}==$Severity_Max))
+ or (cmpLocations($ProblemLocation, $ProblemLocation_Last) and $Severity_Val{$Severity}==$Severity_Max))
{
$MinPath_Length = $Path_Length;
$Severity_Max = $Severity_Val{$Severity};
$ProblemLocation_Last = $ProblemLocation;
%{$SProblems{$Symbol}} = (
- "Descr"=>getAffectDescription($Level, $Symbol, $Kind, $Location),
+ "Descr"=>getAffectDesc($Level, $Symbol, $Kind, $Location),
"Severity_Max"=>$Severity_Max,
"Signature"=>$Signature,
- "Position"=>$Position,
- "Param_Name"=>$Param_Name,
+ "Position"=>$PPos,
+ "Param_Name"=>$PName,
"Location"=>$Location
);
}
@@ -17236,37 +17343,46 @@ sub getAffectedSymbols($$$$)
return $Affected;
}
-sub cmp_locations($$)
+sub cmpLocations($$)
{
my ($L1, $L2) = @_;
- if($L2=~/\b(retval|this)\b/
- and $L1!~/\b(retval|this)\b/ and $L1!~/\-\>/) {
- return 1;
- }
- if($L2=~/\b(retval|this)\b/ and $L2=~/\-\>/
- and $L1!~/\b(retval|this)\b/ and $L1=~/\-\>/) {
- return 1;
+ if($L2=~/\A(retval|this)\b/
+ and $L1!~/\A(retval|this)\b/)
+ {
+ if($L1!~/\-\>/) {
+ return 1;
+ }
+ elsif($L2=~/\-\>/) {
+ return 1;
+ }
}
return 0;
}
-sub getAffectDescription($$$$)
+sub getAffectDesc($$$$)
{
my ($Level, $Symbol, $Kind, $Location) = @_;
+
my %Problem = %{$CompatProblems{$Level}{$Symbol}{$Kind}{$Location}};
- my $PPos = showPos($Problem{"Param_Pos"});
+
+ my $Location_I = $Location;
+ $Location=~s/\A(.*)\-\>(.+?)\Z/$1/; # without the latest affected field
+
my @Sentence = ();
- $Location=~s/\A(.*)\-\>.+?\Z/$1/;
+
if($Kind eq "Overridden_Virtual_Method"
or $Kind eq "Overridden_Virtual_Method_B") {
push(@Sentence, "The method '".$Problem{"New_Value"}."' will be called instead of this method.");
}
elsif($CompatRules{$Level}{$Kind}{"Kind"} eq "Types")
{
+ my %SymInfo = %{$CompleteSignature{1}{$Symbol}};
+
if($Location eq "this" or $Kind=~/(\A|_)Virtual(_|\Z)/)
{
- my $METHOD_TYPE = $CompleteSignature{1}{$Symbol}{"Constructor"}?"constructor":"method";
- my $ClassName = $TypeInfo{1}{$CompleteSignature{1}{$Symbol}{"Class"}}{"Name"};
+ my $METHOD_TYPE = $SymInfo{"Constructor"}?"constructor":"method";
+ my $ClassName = $TypeInfo{1}{$SymInfo{"Class"}}{"Name"};
+
if($ClassName eq $Problem{"Type_Name"}) {
push(@Sentence, "This $METHOD_TYPE is from \'".$Problem{"Type_Name"}."\' class.");
}
@@ -17276,63 +17392,81 @@ sub getAffectDescription($$$$)
}
else
{
+ my $TypeID = undef;
+
if($Location=~/retval/)
{ # return value
- if($Location=~/\-\>/) {
+ if(index($Location, "->")!=-1) {
push(@Sentence, "Field \'".$Location."\' in return value");
}
else {
push(@Sentence, "Return value");
}
- if(my $Init = $Problem{"InitialType_Type"})
- {
- if($Init eq "Pointer") {
- push(@Sentence, "(pointer)");
- }
- elsif($Init eq "Ref") {
- push(@Sentence, "(reference)");
- }
- }
+
+ $TypeID = $SymInfo{"Return"};
}
elsif($Location=~/this/)
{ # "this" pointer
- if($Location=~/\-\>/) {
+ if(index($Location, "->")!=-1) {
push(@Sentence, "Field \'".$Location."\' in the object of this method");
}
else {
push(@Sentence, "\'this\' pointer");
}
+
+ $TypeID = $SymInfo{"Class"};
}
else
{ # parameters
- if($Location=~/\-\>/) {
- push(@Sentence, "Field \'".$Location."\' in $PPos parameter");
+
+ my $PName = getParamName($Location);
+ my $PPos = getParamPos($PName, $Symbol, 1);
+
+ if(index($Location, "->")!=-1) {
+ push(@Sentence, "Field \'".$Location."\' in ".showPos(adjustParamPos($PPos, $Symbol, 1))." parameter");
}
else {
- push(@Sentence, "$PPos parameter");
+ push(@Sentence, showPos(adjustParamPos($PPos, $Symbol, 1))." parameter");
}
- if($Problem{"Param_Name"}) {
- push(@Sentence, "\'".$Problem{"Param_Name"}."\'");
+ if($PName) {
+ push(@Sentence, "\'".$PName."\'");
}
- if(my $Init = $Problem{"InitialType_Type"})
+
+ $TypeID = $SymInfo{"Param"}{$PPos}{"type"};
+ }
+
+ if($Location!~/this/)
+ {
+ if(my %PureType = get_PureType($TypeID, $TypeInfo{1}))
{
- if($Init eq "Pointer") {
+ if($PureType{"Type"} eq "Pointer") {
push(@Sentence, "(pointer)");
}
- elsif($Init eq "Ref") {
+ elsif($PureType{"Type"} eq "Ref") {
push(@Sentence, "(reference)");
}
}
}
+
if($Location eq "this") {
push(@Sentence, "has base type \'".$Problem{"Type_Name"}."\'.");
}
- elsif(defined $Problem{"Start_Type_Name"}
- and $Problem{"Start_Type_Name"} eq $Problem{"Type_Name"}) {
- push(@Sentence, "has type \'".$Problem{"Type_Name"}."\'.");
- }
- else {
- push(@Sentence, "has base type \'".$Problem{"Type_Name"}."\'.");
+ else
+ {
+ my $Location_T = $Location;
+ $Location_T=~s/\A\w+(\->|\Z)//; # location in type
+
+ my $TypeID_Problem = $TypeID;
+ if($Location_T) {
+ $TypeID_Problem = getFieldType($Location_T, $TypeID, 1);
+ }
+
+ if($TypeInfo{1}{$TypeID_Problem}{"Name"} eq $Problem{"Type_Name"}) {
+ push(@Sentence, "has type \'".$Problem{"Type_Name"}."\'.");
+ }
+ else {
+ push(@Sentence, "has base type \'".$Problem{"Type_Name"}."\'.");
+ }
}
}
}
@@ -17342,6 +17476,29 @@ sub getAffectDescription($$$$)
return join(" ", @Sentence);
}
+sub getFieldType($$$)
+{
+ my ($Location, $TypeId, $LibVersion) = @_;
+
+ my @Fields = split("->", $Location);
+
+ foreach my $Name (@Fields)
+ {
+ my %Info = get_BaseType($TypeId, $LibVersion);
+
+ foreach my $Pos (keys(%{$Info{"Memb"}}))
+ {
+ if($Info{"Memb"}{$Pos}{"name"} eq $Name)
+ {
+ $TypeId = $Info{"Memb"}{$Pos}{"type"};
+ last;
+ }
+ }
+ }
+
+ return $TypeId;
+}
+
sub get_XmlSign($$)
{
my ($Symbol, $LibVersion) = @_;
@@ -18658,7 +18815,7 @@ sub readSymbols_App($)
if(not $ReadelfCmd) {
exitStatus("Not_Found", "can't find \"readelf\"");
}
- open(APP, "$ReadelfCmd -WhlSsdA \"$Path\" 2>\"$TMP_DIR/null\" |");
+ open(APP, "$ReadelfCmd -Ws \"$Path\" 2>\"$TMP_DIR/null\" |");
my $symtab = undef; # indicates that we are processing 'symtab' section of 'readelf' output
while(<APP>)
{
@@ -19003,6 +19160,7 @@ sub readSymbols_Lib($$$$$$)
}
}
close(LIB);
+
if($Deps)
{
if($LIB_TYPE eq "dynamic")
@@ -19026,16 +19184,16 @@ sub readSymbols_Lib($$$$$$)
if(not $ReadelfCmd) {
exitStatus("Not_Found", "can't find \"readelf\"");
}
- $ReadelfCmd .= " -WhlSsdA \"$Lib_Path\" 2>\"$TMP_DIR/null\"";
+ my $Cmd = $ReadelfCmd." -Ws \"$Lib_Path\" 2>\"$TMP_DIR/null\"";
if($DebugPath)
{ # debug mode
# write to file
- system($ReadelfCmd." >\"$DebugPath\"");
+ system($Cmd." >\"$DebugPath\"");
open(LIB, $DebugPath);
}
else
{ # write to pipe
- open(LIB, $ReadelfCmd." |");
+ open(LIB, $Cmd." |");
}
my $symtab = undef; # indicates that we are processing 'symtab' section of 'readelf' output
while(<LIB>)
@@ -19116,19 +19274,25 @@ sub readSymbols_Lib($$$$$$)
}
}
}
- elsif($LIB_TYPE eq "dynamic")
- { # dynamic library specifics
- if($Deps)
- {
- if(/NEEDED.+\[([^\[\]]+)\]/)
- { # dependencies:
- # 0x00000001 (NEEDED) Shared library: [libc.so.6]
- $NeededLib{$1} = 1;
- }
+ }
+ close(LIB);
+
+ if($Deps and $LIB_TYPE eq "dynamic")
+ { # dynamic library specifics
+ $Cmd = $ReadelfCmd." -Wd \"$Lib_Path\" 2>\"$TMP_DIR/null\"";
+ open(LIB, $Cmd." |");
+
+ while(<LIB>)
+ {
+ if(/NEEDED.+\[([^\[\]]+)\]/)
+ { # dependencies:
+ # 0x00000001 (NEEDED) Shared library: [libc.so.6]
+ $NeededLib{$1} = 1;
}
}
+
+ close(LIB);
}
- close(LIB);
}
if($Vers)
{
@@ -19449,7 +19613,8 @@ sub skipHeader_I($$)
if(my $Kind = $SkipHeaders{$LibVersion}{"Name"}{$Name}) {
return $Kind;
}
- foreach my $D (keys(%{$SkipHeaders{$LibVersion}{"Path"}}))
+ foreach my $D (sort {$SkipHeaders{$LibVersion}{"Path"}{$a} cmp $SkipHeaders{$LibVersion}{"Path"}{$b}}
+ keys(%{$SkipHeaders{$LibVersion}{"Path"}}))
{
if(index($Path, $D)!=-1)
{
@@ -19458,7 +19623,8 @@ sub skipHeader_I($$)
}
}
}
- foreach my $P (keys(%{$SkipHeaders{$LibVersion}{"Pattern"}}))
+ foreach my $P (sort {$SkipHeaders{$LibVersion}{"Pattern"}{$a} cmp $SkipHeaders{$LibVersion}{"Pattern"}{$b}}
+ keys(%{$SkipHeaders{$LibVersion}{"Pattern"}}))
{
if(my $Kind = $SkipHeaders{$LibVersion}{"Pattern"}{$P})
{
@@ -20637,6 +20803,7 @@ sub detect_default_paths($)
if(not $GCC_PATH) {
exitStatus("Not_Found", "can't find GCC>=3.0 in PATH");
}
+
if(not $CheckObjectsOnly_Opt)
{
if(my $GCC_Ver = get_dumpversion($GCC_PATH))
@@ -20648,6 +20815,13 @@ sub detect_default_paths($)
$OStarget = "symbian";
$LIB_EXT = $OS_LibExt{$LIB_TYPE}{$OStarget};
}
+
+ # check GCC version
+ if($GCC_Ver=~/\A4\.8(|\.0|\.1)\Z/)
+ { # bug http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57850
+ printMsg("WARNING", "Not working properly with GCC $GCC_Ver. Please update or downgrade GCC or use a local installation by --gcc-path=PATH option.");
+ $EMERGENCY_MODE_48 = 1;
+ }
}
else {
exitStatus("Error", "something is going wrong with the GCC compiler");
@@ -22261,6 +22435,9 @@ sub compareAPIs($)
mergeConstants($Level);
}
}
+
+ $Cache{"mergeTypes"} = (); # free memory
+
if($CheckHeadersOnly
or $Level eq "Source")
{ # added/removed in headers
diff --git a/doc/Changes.html b/doc/Changes.html
index bbe7de1..a0e83ad 100644
--- a/doc/Changes.html
+++ b/doc/Changes.html
@@ -21,7 +21,7 @@
</style>
<script src="/load.php?debug=false&amp;lang=en&amp;modules=startup&amp;only=scripts&amp;skin=monobook&amp;*"></script>
<script>if(window.mw){
- mw.config.set({"wgCanonicalNamespace": "", "wgCanonicalSpecialPageName": false, "wgNamespaceNumber": 0, "wgPageName": "ABI_compliance_checker_Downloads", "wgTitle": "ABI Compliance Checker Downloads", "wgCurRevisionId": 8301, "wgArticleId": 2293, "wgIsArticle": true, "wgAction": "view", "wgUserName": null, "wgUserGroups": ["*"], "wgCategories": ["ABI Compliance Checker"], "wgBreakFrames": false, "wgRestrictionEdit": [], "wgRestrictionMove": []});
+ mw.config.set({"wgCanonicalNamespace": "", "wgCanonicalSpecialPageName": false, "wgNamespaceNumber": 0, "wgPageName": "ABI_compliance_checker_Downloads", "wgTitle": "ABI Compliance Checker Downloads", "wgCurRevisionId": 8305, "wgArticleId": 2293, "wgIsArticle": true, "wgAction": "view", "wgUserName": null, "wgUserGroups": ["*"], "wgCategories": ["ABI Compliance Checker"], "wgBreakFrames": false, "wgRestrictionEdit": [], "wgRestrictionMove": []});
}
</script><script>if(window.mw){
mw.loader.load(["mediawiki.page.startup"]);
@@ -43,54 +43,80 @@
</p>
<table id="toc" class="toc"><tr><td><div id="toctitle"><h2>Contents</h2></div>
<ul>
-<li class="toclevel-1 tocsection-1"><a href="#Version_1.99.7_.28July_01.2C_2013.29"><span class="tocnumber">1</span> <span class="toctext">Version 1.99.7 (July 01, 2013)</span></a></li>
-<li class="toclevel-1 tocsection-2"><a href="#Version_1.99.1_.28June_07.2C_2013.29"><span class="tocnumber">2</span> <span class="toctext">Version 1.99.1 (June 07, 2013)</span></a></li>
-<li class="toclevel-1 tocsection-3"><a href="#Version_1.99_.28May_24.2C_2013.29"><span class="tocnumber">3</span> <span class="toctext">Version 1.99 (May 24, 2013)</span></a></li>
-<li class="toclevel-1 tocsection-4"><a href="#Version_1.98.8_.28February_07.2C_2013.29"><span class="tocnumber">4</span> <span class="toctext">Version 1.98.8 (February 07, 2013)</span></a></li>
-<li class="toclevel-1 tocsection-5"><a href="#Version_1.98.7_.28December_14.2C_2012.29"><span class="tocnumber">5</span> <span class="toctext">Version 1.98.7 (December 14, 2012)</span></a></li>
-<li class="toclevel-1 tocsection-6"><a href="#Version_1.98.6_.28December_04.2C_2012.29"><span class="tocnumber">6</span> <span class="toctext">Version 1.98.6 (December 04, 2012)</span></a></li>
-<li class="toclevel-1 tocsection-7"><a href="#Version_1.98.5_.28November_30.2C_2012.29"><span class="tocnumber">7</span> <span class="toctext">Version 1.98.5 (November 30, 2012)</span></a></li>
-<li class="toclevel-1 tocsection-8"><a href="#Version_1.98.4_.28October_18.2C_2012.29"><span class="tocnumber">8</span> <span class="toctext">Version 1.98.4 (October 18, 2012)</span></a></li>
-<li class="toclevel-1 tocsection-9"><a href="#Version_1.98.3_.28July_19.2C_2012.29"><span class="tocnumber">9</span> <span class="toctext">Version 1.98.3 (July 19, 2012)</span></a></li>
-<li class="toclevel-1 tocsection-10"><a href="#Version_1.98.2_.28June_26.2C_2012.29"><span class="tocnumber">10</span> <span class="toctext">Version 1.98.2 (June 26, 2012)</span></a></li>
-<li class="toclevel-1 tocsection-11"><a href="#Version_1.98.1_.28June_18.2C_2012.29"><span class="tocnumber">11</span> <span class="toctext">Version 1.98.1 (June 18, 2012)</span></a></li>
-<li class="toclevel-1 tocsection-12"><a href="#Version_1.98.0_.28June_14.2C_2012.29"><span class="tocnumber">12</span> <span class="toctext">Version 1.98.0 (June 14, 2012)</span></a></li>
-<li class="toclevel-1 tocsection-13"><a href="#Version_1.97.8_.28June_08.2C_2012.29"><span class="tocnumber">13</span> <span class="toctext">Version 1.97.8 (June 08, 2012)</span></a></li>
-<li class="toclevel-1 tocsection-14"><a href="#Version_1.97.5_.28May_14.2C_2012.29"><span class="tocnumber">14</span> <span class="toctext">Version 1.97.5 (May 14, 2012)</span></a></li>
-<li class="toclevel-1 tocsection-15"><a href="#Version_1.97.4_.28April_16.2C_2012.29"><span class="tocnumber">15</span> <span class="toctext">Version 1.97.4 (April 16, 2012)</span></a></li>
-<li class="toclevel-1 tocsection-16"><a href="#Version_1.97.3_.28April_03.2C_2012.29"><span class="tocnumber">16</span> <span class="toctext">Version 1.97.3 (April 03, 2012)</span></a></li>
-<li class="toclevel-1 tocsection-17"><a href="#Version_1.96.8_.28February_17.2C_2012.29"><span class="tocnumber">17</span> <span class="toctext">Version 1.96.8 (February 17, 2012)</span></a></li>
-<li class="toclevel-1 tocsection-18"><a href="#Version_1.94_.28September_09.2C_2011.29"><span class="tocnumber">18</span> <span class="toctext">Version 1.94 (September 09, 2011)</span></a></li>
-<li class="toclevel-1 tocsection-19"><a href="#Version_1.93.8_.28September_08.2C_2011.29"><span class="tocnumber">19</span> <span class="toctext">Version 1.93.8 (September 08, 2011)</span></a></li>
-<li class="toclevel-1 tocsection-20"><a href="#Version_1.23.5_.28July_01.2C_2011.29"><span class="tocnumber">20</span> <span class="toctext">Version 1.23.5 (July 01, 2011)</span></a></li>
-<li class="toclevel-1 tocsection-21"><a href="#Version_1.23_.28June_07.2C_2011.29"><span class="tocnumber">21</span> <span class="toctext">Version 1.23 (June 07, 2011)</span></a></li>
-<li class="toclevel-1 tocsection-22"><a href="#Version_1.21.12_.28April_29.2C_2011.29"><span class="tocnumber">22</span> <span class="toctext">Version 1.21.12 (April 29, 2011)</span></a></li>
-<li class="toclevel-1 tocsection-23"><a href="#Version_1.21_.28August_19.2C_2010.29"><span class="tocnumber">23</span> <span class="toctext">Version 1.21 (August 19, 2010)</span></a></li>
-<li class="toclevel-1 tocsection-24"><a href="#Version_1.20_.28August_30.2C_2010.29"><span class="tocnumber">24</span> <span class="toctext">Version 1.20 (August 30, 2010)</span></a></li>
-<li class="toclevel-1 tocsection-25"><a href="#Version_1.19_.28July_22.2C_2010.29"><span class="tocnumber">25</span> <span class="toctext">Version 1.19 (July 22, 2010)</span></a></li>
-<li class="toclevel-1 tocsection-26"><a href="#Version_1.18_.28June_25.2C_2010.29"><span class="tocnumber">26</span> <span class="toctext">Version 1.18 (June 25, 2010)</span></a></li>
-<li class="toclevel-1 tocsection-27"><a href="#Version_1.17.2_.28June_16.2C_2010.29"><span class="tocnumber">27</span> <span class="toctext">Version 1.17.2 (June 16, 2010)</span></a></li>
-<li class="toclevel-1 tocsection-28"><a href="#Version_1.17.1_.28June_09.2C_2010.29"><span class="tocnumber">28</span> <span class="toctext">Version 1.17.1 (June 09, 2010)</span></a></li>
-<li class="toclevel-1 tocsection-29"><a href="#Version_1.17_.28June_08.2C_2010.29"><span class="tocnumber">29</span> <span class="toctext">Version 1.17 (June 08, 2010)</span></a></li>
-<li class="toclevel-1 tocsection-30"><a href="#Version_1.16_.28May_05.2C_2010.29"><span class="tocnumber">30</span> <span class="toctext">Version 1.16 (May 05, 2010)</span></a></li>
-<li class="toclevel-1 tocsection-31"><a href="#Version_1.15_.28March_26.2C_2010.29"><span class="tocnumber">31</span> <span class="toctext">Version 1.15 (March 26, 2010)</span></a></li>
-<li class="toclevel-1 tocsection-32"><a href="#Version_1.14_.28March_03.2C_2010.29"><span class="tocnumber">32</span> <span class="toctext">Version 1.14 (March 03, 2010)</span></a></li>
-<li class="toclevel-1 tocsection-33"><a href="#Version_1.13_.28February_16.2C_2010.29"><span class="tocnumber">33</span> <span class="toctext">Version 1.13 (February 16, 2010)</span></a></li>
-<li class="toclevel-1 tocsection-34"><a href="#Version_1.12_.28December_04.2C_2009.29"><span class="tocnumber">34</span> <span class="toctext">Version 1.12 (December 04, 2009)</span></a></li>
-<li class="toclevel-1 tocsection-35"><a href="#Version_1.11_.28November_10.2C_2009.29"><span class="tocnumber">35</span> <span class="toctext">Version 1.11 (November 10, 2009)</span></a></li>
-<li class="toclevel-1 tocsection-36"><a href="#Version_1.10_.28November_02.2C_2009.29"><span class="tocnumber">36</span> <span class="toctext">Version 1.10 (November 02, 2009)</span></a></li>
-<li class="toclevel-1 tocsection-37"><a href="#Version_1.9_.28October_12.2C_2009.29"><span class="tocnumber">37</span> <span class="toctext">Version 1.9 (October 12, 2009)</span></a></li>
-<li class="toclevel-1 tocsection-38"><a href="#Version_1.8_.28September_29.2C_2009.29"><span class="tocnumber">38</span> <span class="toctext">Version 1.8 (September 29, 2009)</span></a></li>
-<li class="toclevel-1 tocsection-39"><a href="#Version_1.7_.28September_11.2C_2009.29"><span class="tocnumber">39</span> <span class="toctext">Version 1.7 (September 11, 2009)</span></a></li>
-<li class="toclevel-1 tocsection-40"><a href="#Version_1.6_.28August_31.2C_2009.29"><span class="tocnumber">40</span> <span class="toctext">Version 1.6 (August 31, 2009)</span></a></li>
-<li class="toclevel-1 tocsection-41"><a href="#Version_1.5_.28August_25.2C_2009.29"><span class="tocnumber">41</span> <span class="toctext">Version 1.5 (August 25, 2009)</span></a></li>
-<li class="toclevel-1 tocsection-42"><a href="#Version_1.4_.28August_18.2C_2009.29"><span class="tocnumber">42</span> <span class="toctext">Version 1.4 (August 18, 2009)</span></a></li>
-<li class="toclevel-1 tocsection-43"><a href="#Version_1.3_.28August_14.2C_2009.29"><span class="tocnumber">43</span> <span class="toctext">Version 1.3 (August 14, 2009)</span></a></li>
-<li class="toclevel-1 tocsection-44"><a href="#Version_1.2_.28August_07.2C_2009.29"><span class="tocnumber">44</span> <span class="toctext">Version 1.2 (August 07, 2009)</span></a></li>
-<li class="toclevel-1 tocsection-45"><a href="#Version_1.1_.28August_06.2C_2009.29"><span class="tocnumber">45</span> <span class="toctext">Version 1.1 (August 06, 2009)</span></a></li>
-<li class="toclevel-1 tocsection-46"><a href="#Version_1.0_.28July_31.2C_2009.29"><span class="tocnumber">46</span> <span class="toctext">Version 1.0 (July 31, 2009)</span></a></li>
+<li class="toclevel-1 tocsection-1"><a href="#Version_1.99.8_.28July_30.2C_2013.29"><span class="tocnumber">1</span> <span class="toctext">Version 1.99.8 (July 30, 2013)</span></a></li>
+<li class="toclevel-1 tocsection-2"><a href="#Version_1.99.7_.28July_01.2C_2013.29"><span class="tocnumber">2</span> <span class="toctext">Version 1.99.7 (July 01, 2013)</span></a></li>
+<li class="toclevel-1 tocsection-3"><a href="#Version_1.99.1_.28June_07.2C_2013.29"><span class="tocnumber">3</span> <span class="toctext">Version 1.99.1 (June 07, 2013)</span></a></li>
+<li class="toclevel-1 tocsection-4"><a href="#Version_1.99_.28May_24.2C_2013.29"><span class="tocnumber">4</span> <span class="toctext">Version 1.99 (May 24, 2013)</span></a></li>
+<li class="toclevel-1 tocsection-5"><a href="#Version_1.98.8_.28February_07.2C_2013.29"><span class="tocnumber">5</span> <span class="toctext">Version 1.98.8 (February 07, 2013)</span></a></li>
+<li class="toclevel-1 tocsection-6"><a href="#Version_1.98.7_.28December_14.2C_2012.29"><span class="tocnumber">6</span> <span class="toctext">Version 1.98.7 (December 14, 2012)</span></a></li>
+<li class="toclevel-1 tocsection-7"><a href="#Version_1.98.6_.28December_04.2C_2012.29"><span class="tocnumber">7</span> <span class="toctext">Version 1.98.6 (December 04, 2012)</span></a></li>
+<li class="toclevel-1 tocsection-8"><a href="#Version_1.98.5_.28November_30.2C_2012.29"><span class="tocnumber">8</span> <span class="toctext">Version 1.98.5 (November 30, 2012)</span></a></li>
+<li class="toclevel-1 tocsection-9"><a href="#Version_1.98.4_.28October_18.2C_2012.29"><span class="tocnumber">9</span> <span class="toctext">Version 1.98.4 (October 18, 2012)</span></a></li>
+<li class="toclevel-1 tocsection-10"><a href="#Version_1.98.3_.28July_19.2C_2012.29"><span class="tocnumber">10</span> <span class="toctext">Version 1.98.3 (July 19, 2012)</span></a></li>
+<li class="toclevel-1 tocsection-11"><a href="#Version_1.98.2_.28June_26.2C_2012.29"><span class="tocnumber">11</span> <span class="toctext">Version 1.98.2 (June 26, 2012)</span></a></li>
+<li class="toclevel-1 tocsection-12"><a href="#Version_1.98.1_.28June_18.2C_2012.29"><span class="tocnumber">12</span> <span class="toctext">Version 1.98.1 (June 18, 2012)</span></a></li>
+<li class="toclevel-1 tocsection-13"><a href="#Version_1.98.0_.28June_14.2C_2012.29"><span class="tocnumber">13</span> <span class="toctext">Version 1.98.0 (June 14, 2012)</span></a></li>
+<li class="toclevel-1 tocsection-14"><a href="#Version_1.97.8_.28June_08.2C_2012.29"><span class="tocnumber">14</span> <span class="toctext">Version 1.97.8 (June 08, 2012)</span></a></li>
+<li class="toclevel-1 tocsection-15"><a href="#Version_1.97.5_.28May_14.2C_2012.29"><span class="tocnumber">15</span> <span class="toctext">Version 1.97.5 (May 14, 2012)</span></a></li>
+<li class="toclevel-1 tocsection-16"><a href="#Version_1.97.4_.28April_16.2C_2012.29"><span class="tocnumber">16</span> <span class="toctext">Version 1.97.4 (April 16, 2012)</span></a></li>
+<li class="toclevel-1 tocsection-17"><a href="#Version_1.97.3_.28April_03.2C_2012.29"><span class="tocnumber">17</span> <span class="toctext">Version 1.97.3 (April 03, 2012)</span></a></li>
+<li class="toclevel-1 tocsection-18"><a href="#Version_1.96.8_.28February_17.2C_2012.29"><span class="tocnumber">18</span> <span class="toctext">Version 1.96.8 (February 17, 2012)</span></a></li>
+<li class="toclevel-1 tocsection-19"><a href="#Version_1.94_.28September_09.2C_2011.29"><span class="tocnumber">19</span> <span class="toctext">Version 1.94 (September 09, 2011)</span></a></li>
+<li class="toclevel-1 tocsection-20"><a href="#Version_1.93.8_.28September_08.2C_2011.29"><span class="tocnumber">20</span> <span class="toctext">Version 1.93.8 (September 08, 2011)</span></a></li>
+<li class="toclevel-1 tocsection-21"><a href="#Version_1.23.5_.28July_01.2C_2011.29"><span class="tocnumber">21</span> <span class="toctext">Version 1.23.5 (July 01, 2011)</span></a></li>
+<li class="toclevel-1 tocsection-22"><a href="#Version_1.23_.28June_07.2C_2011.29"><span class="tocnumber">22</span> <span class="toctext">Version 1.23 (June 07, 2011)</span></a></li>
+<li class="toclevel-1 tocsection-23"><a href="#Version_1.21.12_.28April_29.2C_2011.29"><span class="tocnumber">23</span> <span class="toctext">Version 1.21.12 (April 29, 2011)</span></a></li>
+<li class="toclevel-1 tocsection-24"><a href="#Version_1.21_.28August_19.2C_2010.29"><span class="tocnumber">24</span> <span class="toctext">Version 1.21 (August 19, 2010)</span></a></li>
+<li class="toclevel-1 tocsection-25"><a href="#Version_1.20_.28August_30.2C_2010.29"><span class="tocnumber">25</span> <span class="toctext">Version 1.20 (August 30, 2010)</span></a></li>
+<li class="toclevel-1 tocsection-26"><a href="#Version_1.19_.28July_22.2C_2010.29"><span class="tocnumber">26</span> <span class="toctext">Version 1.19 (July 22, 2010)</span></a></li>
+<li class="toclevel-1 tocsection-27"><a href="#Version_1.18_.28June_25.2C_2010.29"><span class="tocnumber">27</span> <span class="toctext">Version 1.18 (June 25, 2010)</span></a></li>
+<li class="toclevel-1 tocsection-28"><a href="#Version_1.17.2_.28June_16.2C_2010.29"><span class="tocnumber">28</span> <span class="toctext">Version 1.17.2 (June 16, 2010)</span></a></li>
+<li class="toclevel-1 tocsection-29"><a href="#Version_1.17.1_.28June_09.2C_2010.29"><span class="tocnumber">29</span> <span class="toctext">Version 1.17.1 (June 09, 2010)</span></a></li>
+<li class="toclevel-1 tocsection-30"><a href="#Version_1.17_.28June_08.2C_2010.29"><span class="tocnumber">30</span> <span class="toctext">Version 1.17 (June 08, 2010)</span></a></li>
+<li class="toclevel-1 tocsection-31"><a href="#Version_1.16_.28May_05.2C_2010.29"><span class="tocnumber">31</span> <span class="toctext">Version 1.16 (May 05, 2010)</span></a></li>
+<li class="toclevel-1 tocsection-32"><a href="#Version_1.15_.28March_26.2C_2010.29"><span class="tocnumber">32</span> <span class="toctext">Version 1.15 (March 26, 2010)</span></a></li>
+<li class="toclevel-1 tocsection-33"><a href="#Version_1.14_.28March_03.2C_2010.29"><span class="tocnumber">33</span> <span class="toctext">Version 1.14 (March 03, 2010)</span></a></li>
+<li class="toclevel-1 tocsection-34"><a href="#Version_1.13_.28February_16.2C_2010.29"><span class="tocnumber">34</span> <span class="toctext">Version 1.13 (February 16, 2010)</span></a></li>
+<li class="toclevel-1 tocsection-35"><a href="#Version_1.12_.28December_04.2C_2009.29"><span class="tocnumber">35</span> <span class="toctext">Version 1.12 (December 04, 2009)</span></a></li>
+<li class="toclevel-1 tocsection-36"><a href="#Version_1.11_.28November_10.2C_2009.29"><span class="tocnumber">36</span> <span class="toctext">Version 1.11 (November 10, 2009)</span></a></li>
+<li class="toclevel-1 tocsection-37"><a href="#Version_1.10_.28November_02.2C_2009.29"><span class="tocnumber">37</span> <span class="toctext">Version 1.10 (November 02, 2009)</span></a></li>
+<li class="toclevel-1 tocsection-38"><a href="#Version_1.9_.28October_12.2C_2009.29"><span class="tocnumber">38</span> <span class="toctext">Version 1.9 (October 12, 2009)</span></a></li>
+<li class="toclevel-1 tocsection-39"><a href="#Version_1.8_.28September_29.2C_2009.29"><span class="tocnumber">39</span> <span class="toctext">Version 1.8 (September 29, 2009)</span></a></li>
+<li class="toclevel-1 tocsection-40"><a href="#Version_1.7_.28September_11.2C_2009.29"><span class="tocnumber">40</span> <span class="toctext">Version 1.7 (September 11, 2009)</span></a></li>
+<li class="toclevel-1 tocsection-41"><a href="#Version_1.6_.28August_31.2C_2009.29"><span class="tocnumber">41</span> <span class="toctext">Version 1.6 (August 31, 2009)</span></a></li>
+<li class="toclevel-1 tocsection-42"><a href="#Version_1.5_.28August_25.2C_2009.29"><span class="tocnumber">42</span> <span class="toctext">Version 1.5 (August 25, 2009)</span></a></li>
+<li class="toclevel-1 tocsection-43"><a href="#Version_1.4_.28August_18.2C_2009.29"><span class="tocnumber">43</span> <span class="toctext">Version 1.4 (August 18, 2009)</span></a></li>
+<li class="toclevel-1 tocsection-44"><a href="#Version_1.3_.28August_14.2C_2009.29"><span class="tocnumber">44</span> <span class="toctext">Version 1.3 (August 14, 2009)</span></a></li>
+<li class="toclevel-1 tocsection-45"><a href="#Version_1.2_.28August_07.2C_2009.29"><span class="tocnumber">45</span> <span class="toctext">Version 1.2 (August 07, 2009)</span></a></li>
+<li class="toclevel-1 tocsection-46"><a href="#Version_1.1_.28August_06.2C_2009.29"><span class="tocnumber">46</span> <span class="toctext">Version 1.1 (August 06, 2009)</span></a></li>
+<li class="toclevel-1 tocsection-47"><a href="#Version_1.0_.28July_31.2C_2009.29"><span class="tocnumber">47</span> <span class="toctext">Version 1.0 (July 31, 2009)</span></a></li>
</ul>
</td></tr></table>
+<h2> <span class="mw-headline" id="Version_1.99.8_.28July_30.2C_2013.29"> Version 1.99.8 (July 30, 2013) </span></h2>
+<p><a rel="nofollow" class="external text" href="https://github.com/lvc/abi-compliance-checker/archive/1.99.8.tar.gz">abi-compliance-checker-1.99.8.tar.gz</a><br />
+</p><p><b>ACC 2.0</b> pre-release.
+</p><p>This is a bug-fix release with a few new features.
+</p>
+<ul><li> <b>Improvements</b>
+<ul><li> Optimized performance and memory usage (up to 90%) on input objects with a huge number of changes and deep data type trees (e.g. Linux kernel)
+</li><li> Partial support for GCC 4.8.{0-1}, waiting for a fix for the bug <a rel="nofollow" class="external text" href="http://gcc.gnu.org/bugzilla/show_bug.cgi?id=57850">57850</a> in the next GCC versions
+</li></ul>
+</li></ul>
+<ul><li> <b>New Options</b>
+<ul><li> <a href="Options.html" title="ABI Compliance Checker Options">-affected-limit</a>
+</li></ul>
+</li></ul>
+<ul><li> <b>Bug Fixes</b>
+<ul><li> Fixed identification of template constructors and destructors
+</li><li> Do not show "this" first argument of methods in the report
+</li><li> Corrected descriptions of affected symbols in the report
+</li><li> Fixed false alarms on changed offset of parameters
+</li></ul>
+</li></ul>
+<ul><li> <b>Other</b>
+<ul><li> Code refactoring
+</li></ul>
+</li></ul>
<h2> <span class="mw-headline" id="Version_1.99.7_.28July_01.2C_2013.29"> Version 1.99.7 (July 01, 2013) </span></h2>
<p><a rel="nofollow" class="external text" href="https://github.com/lvc/abi-compliance-checker/archive/1.99.7.tar.gz">abi-compliance-checker-1.99.7.tar.gz</a><br />
</p><p><b>ACC 2.0</b> pre-release.
@@ -1031,11 +1057,11 @@ Initial prototype of the tool.
</p>
<!--
NewPP limit report
-Preprocessor node count: 183/1000000
+Preprocessor node count: 187/1000000
Post-expand include size: 0/2097152 bytes
Template argument size: 0/2097152 bytes
Expensive parser function count: 0/100
-->
-<!-- Saved in parser cache with key rasispdb:pcache:idhash:2293-0!*!0!!en!*!* and timestamp 20130701072418 -->
+<!-- Saved in parser cache with key rasispdb:pcache:idhash:2293-0!*!0!!en!*!* and timestamp 20130730145937 -->
</div></div></div></div></div></body></html> \ No newline at end of file
diff --git a/doc/Descriptor.html b/doc/Descriptor.html
index 80dd0b2..dda9ae0 100644
--- a/doc/Descriptor.html
+++ b/doc/Descriptor.html
@@ -510,5 +510,5 @@ Template argument size: 0/2097152 bytes
Expensive parser function count: 0/100
-->
-<!-- Saved in parser cache with key rasispdb:pcache:idhash:2415-0!*!*!!en!*!* and timestamp 20130630094106 -->
+<!-- Saved in parser cache with key rasispdb:pcache:idhash:2415-0!*!*!!en!*!* and timestamp 20130730150600 -->
</div></div></div></div></div></body></html> \ No newline at end of file
diff --git a/doc/Options.html b/doc/Options.html
index 857b9d6..1910ada 100644
--- a/doc/Options.html
+++ b/doc/Options.html
@@ -21,7 +21,7 @@
</style>
<script src="/load.php?debug=false&amp;lang=en&amp;modules=startup&amp;only=scripts&amp;skin=monobook&amp;*"></script>
<script>if(window.mw){
- mw.config.set({"wgCanonicalNamespace": "", "wgCanonicalSpecialPageName": false, "wgNamespaceNumber": 0, "wgPageName": "ABI_compliance_checker_Options", "wgTitle": "ABI Compliance Checker Options", "wgCurRevisionId": 8290, "wgArticleId": 2442, "wgIsArticle": true, "wgAction": "view", "wgUserName": null, "wgUserGroups": ["*"], "wgCategories": ["ABI Compliance Checker"], "wgBreakFrames": false, "wgRestrictionEdit": [], "wgRestrictionMove": []});
+ mw.config.set({"wgCanonicalNamespace": "", "wgCanonicalSpecialPageName": false, "wgNamespaceNumber": 0, "wgPageName": "ABI_compliance_checker_Options", "wgTitle": "ABI Compliance Checker Options", "wgCurRevisionId": 8307, "wgArticleId": 2442, "wgIsArticle": true, "wgAction": "view", "wgUserName": null, "wgUserGroups": ["*"], "wgCategories": ["ABI Compliance Checker"], "wgBreakFrames": false, "wgRestrictionEdit": [], "wgRestrictionMove": []});
}
</script><script>if(window.mw){
mw.loader.load(["mediawiki.page.startup"]);
@@ -179,6 +179,9 @@
<ul><li><b>-source|-src|-api</b>
</li></ul>
<div style="padding-left:40px;">Show source-compatibility problems only. Generate report to: compat_reports/LIB_NAME/V1_to_V2/src_compat_report.html</div><br />
+<ul><li><b>-affected-limit LIMIT</b>
+</li></ul>
+<div style="padding-left:40px;">The maximum number of affected symbols listed under the description of the changed type in the report.</div><br />
<h2> <span class="mw-headline" id="Other_Options"> Other Options </span></h2>
<ul><li><b>-test</b>
</li></ul>
@@ -268,14 +271,17 @@
<ul><li><b>-check</b>
</li></ul>
<div style="padding-left:40px;">Check completeness of the ABI dump.</div><br />
+<ul><li><b>-quick</b>
+</li></ul>
+<div style="padding-left:40px;">Quick analysis. Disable check of some template instances.</div><br />
<!--
NewPP limit report
-Preprocessor node count: 86/1000000
+Preprocessor node count: 88/1000000
Post-expand include size: 0/2097152 bytes
Template argument size: 0/2097152 bytes
Expensive parser function count: 0/100
-->
-<!-- Saved in parser cache with key rasispdb:pcache:idhash:2442-0!*!0!!en!*!* and timestamp 20130630174627 -->
+<!-- Saved in parser cache with key rasispdb:pcache:idhash:2442-0!*!0!!en!*!* and timestamp 20130730150352 -->
</div></div></div></div></div></body></html> \ No newline at end of file
diff --git a/doc/Readme.html b/doc/Readme.html
index 6cb1714..a22d380 100644
--- a/doc/Readme.html
+++ b/doc/Readme.html
@@ -21,7 +21,7 @@
</style>
<script src="/load.php?debug=false&amp;lang=en&amp;modules=startup&amp;only=scripts&amp;skin=monobook&amp;*"></script>
<script>if(window.mw){
- mw.config.set({"wgCanonicalNamespace": "", "wgCanonicalSpecialPageName": false, "wgNamespaceNumber": 0, "wgPageName": "ABI_compliance_checker", "wgTitle": "ABI Compliance Checker", "wgCurRevisionId": 8302, "wgArticleId": 2292, "wgIsArticle": true, "wgAction": "view", "wgUserName": null, "wgUserGroups": ["*"], "wgCategories": ["ABI Compliance Checker"], "wgBreakFrames": false, "wgRestrictionEdit": [], "wgRestrictionMove": []});
+ mw.config.set({"wgCanonicalNamespace": "", "wgCanonicalSpecialPageName": false, "wgNamespaceNumber": 0, "wgPageName": "ABI_compliance_checker", "wgTitle": "ABI Compliance Checker", "wgCurRevisionId": 8308, "wgArticleId": 2292, "wgIsArticle": true, "wgAction": "view", "wgUserName": null, "wgUserGroups": ["*"], "wgCategories": ["ABI Compliance Checker"], "wgBreakFrames": false, "wgRestrictionEdit": [], "wgRestrictionMove": []});
}
</script><script>if(window.mw){
mw.loader.load(["mediawiki.page.startup"]);
@@ -93,7 +93,7 @@
<h2> <span class="mw-headline" id="Downloads"> Downloads </span></h2>
<h3> <span class="mw-headline" id="Releases"> Releases </span></h3>
<p>All releases can be downloaded from <b><a href="Changes.html" title="ABI Compliance Checker Downloads">this page</a></b> or <b><a rel="nofollow" class="external text" href="https://github.com/lvc/abi-compliance-checker/">github.com</a></b>.
-</p><p>Latest release: <a rel="nofollow" class="external text" href="https://github.com/lvc/abi-compliance-checker/archive/1.99.7.tar.gz">1.99.7</a>
+</p><p>Latest release: <a rel="nofollow" class="external text" href="https://github.com/lvc/abi-compliance-checker/archive/1.99.8.tar.gz">1.99.8</a>
</p>
<h3> <span class="mw-headline" id="Git"> Git </span></h3>
<p>Read-only access to the latest development version:<br />
@@ -499,5 +499,5 @@ Template argument size: 0/2097152 bytes
Expensive parser function count: 0/100
-->
-<!-- Saved in parser cache with key rasispdb:pcache:idhash:2292-0!*!0!!en!*!* and timestamp 20130701072437 -->
+<!-- Saved in parser cache with key rasispdb:pcache:idhash:2292-0!*!0!!en!*!* and timestamp 20130730150425 -->
</div></div></div></div></div></body></html> \ No newline at end of file
diff --git a/doc/SysCheck/Descriptor.html b/doc/SysCheck/Descriptor.html
index d216632..b214dc6 100644
--- a/doc/SysCheck/Descriptor.html
+++ b/doc/SysCheck/Descriptor.html
@@ -233,5 +233,5 @@ Template argument size: 0/2097152 bytes
Expensive parser function count: 0/100
-->
-<!-- Saved in parser cache with key rasispdb:pcache:idhash:2657-0!*!*!!*!*!* and timestamp 20130630123950 -->
+<!-- Saved in parser cache with key rasispdb:pcache:idhash:2657-0!*!*!!*!*!* and timestamp 20130730150604 -->
</div></div></div></div></div></body></html> \ No newline at end of file
diff --git a/doc/SysCheck/Examples.html b/doc/SysCheck/Examples.html
index 3e315f2..c23e5be 100644
--- a/doc/SysCheck/Examples.html
+++ b/doc/SysCheck/Examples.html
@@ -239,5 +239,5 @@ Template argument size: 0/2097152 bytes
Expensive parser function count: 0/100
-->
-<!-- Saved in parser cache with key rasispdb:pcache:idhash:2656-0!*!*!!en!*!* and timestamp 20130630095600 -->
+<!-- Saved in parser cache with key rasispdb:pcache:idhash:2656-0!*!*!!en!*!* and timestamp 20130730150605 -->
</div></div></div></div></div></body></html> \ No newline at end of file
diff --git a/doc/SysCheck/Usage.html b/doc/SysCheck/Usage.html
index 444a096..8e78d45 100644
--- a/doc/SysCheck/Usage.html
+++ b/doc/SysCheck/Usage.html
@@ -116,5 +116,5 @@ Template argument size: 0/2097152 bytes
Expensive parser function count: 0/100
-->
-<!-- Saved in parser cache with key rasispdb:pcache:idhash:2655-0!*!0!!en!*!* and timestamp 20130630174636 -->
+<!-- Saved in parser cache with key rasispdb:pcache:idhash:2655-0!*!0!!en!*!* and timestamp 20130730150602 -->
</div></div></div></div></div></body></html> \ No newline at end of file