aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrey Ponomarenko <andrewponomarenko@yandex.ru>2016-09-27 18:27:08 +0300
committerAndrey Ponomarenko <andrewponomarenko@yandex.ru>2016-09-27 18:27:08 +0300
commit26742a8c630e5dd42838a8c2faf4bb4f8e59c393 (patch)
treea664732d4dd65b6a074c7a48ff35f735e0b85162
parent991da688af27e8e62a8ebbabf238bdb6b0e1582b (diff)
downloadabi-compliance-checker-26742a8c630e5dd42838a8c2faf4bb4f8e59c393.tar.gz
Added -disable-constants-check, -skip-added-constants and -skip-removed-constants options. Improved SysCheck.pm module. Move to secure HTTPS.
-rw-r--r--README2
-rw-r--r--abi-compliance-checker.pl41
-rw-r--r--doc/Changelog.html2
-rw-r--r--doc/Xml-Descriptor.html2
-rw-r--r--doc/index.html14
-rw-r--r--modules/Internals/RegTests.pm22
-rw-r--r--modules/Internals/Styles/CmpSystems.css2
-rw-r--r--modules/Internals/SysCheck.pm98
8 files changed, 133 insertions, 50 deletions
diff --git a/README b/README
index 28392fb..f44c5c7 100644
--- a/README
+++ b/README
@@ -5,7 +5,7 @@ NAME:
The tool is intended for developers of software libraries and Linux maintainers who are interested in ensuring backward compatibility, i.e. allow old applications to run or to be recompiled with newer library versions.
- The tool is developed by Andrey Ponomarenko. You can order additional reports for visualization of the ABI structure and high detailed binary compatibility analysis here: http://abi-laboratory.pro/
+ The tool is developed by Andrey Ponomarenko. You can order additional reports for visualization of the ABI structure and high detailed binary compatibility analysis here: https://abi-laboratory.pro/
INSTALL:
sudo make install prefix=/usr
diff --git a/abi-compliance-checker.pl b/abi-compliance-checker.pl
index 0dece16..40033c4 100644
--- a/abi-compliance-checker.pl
+++ b/abi-compliance-checker.pl
@@ -92,7 +92,8 @@ $ExtraInfo, $ExtraDump, $Force, $Tolerance, $Tolerant, $SkipSymbolsListPath,
$CheckInfo, $Quick, $AffectLimit, $AllAffected, $CxxIncompat,
$SkipInternalSymbols, $SkipInternalTypes, $TargetArch, $GccOptions,
$TypesListPath, $SkipTypesListPath, $CheckPrivateABI, $CountSymbols, $OldStyle,
-$DisableQuickEmptyReport, $SkipTypedefUncover, $MinGWCompat, $SkipUnidentified);
+$DisableQuickEmptyReport, $SkipTypedefUncover, $MinGWCompat, $SkipUnidentified,
+$DisableConstantsCheck, $SkipAddedConstants, $SkipRemovedConstants);
my $CmdName = get_filename($0);
my %OS_LibExt = (
@@ -145,7 +146,10 @@ my %ERROR_CODE = (
"Empty_Set"=>11
);
-my $HomePage = "http://lvc.github.io/abi-compliance-checker/";
+my %HomePage = (
+ "Dev"=>"https://github.com/lvc/abi-compliance-checker",
+ "Wiki"=>"https://lvc.github.io/abi-compliance-checker/"
+);
my $ShortUsage = "ABI Compliance Checker (ABICC) $TOOL_VERSION
A tool for checking backward compatibility of a C/C++ library API
@@ -200,6 +204,9 @@ GetOptions("h|help!" => \$Help,
"types-list=s" => \$TypesListPath,
"skip-symbols=s" => \$SkipSymbolsListPath,
"skip-types=s" => \$SkipTypesListPath,
+ "disable-constants-check!" => \$DisableConstantsCheck,
+ "skip-added-constants!" => \$SkipAddedConstants,
+ "skip-removed-constants!" => \$SkipRemovedConstants,
"headers-list=s" => \$TargetHeadersPath,
"skip-headers=s" => \$SkipHeadersPath,
"header=s" => \$TargetHeader,
@@ -471,6 +478,9 @@ EXTRA OPTIONS:
-skip-types PATH
The list of types that should not be checked.
+ -disable-constants-check
+ Do not check for changes in constants.
+
-headers-list PATH
The file with a list of headers, that should be checked/dumped.
@@ -805,7 +815,8 @@ EXIT CODES:
non-zero - Incompatible or the tool has run with errors.
MORE INFORMATION:
- ".$HomePage."\n");
+ ".$HomePage{"Wiki"}."
+ ".$HomePage{"Dev"}."\n\n";
}
my %Operator_Indication = (
@@ -17948,7 +17959,7 @@ sub getReportFooter()
$Footer .= "<hr/>\n";
$Footer .= "<div class='footer' align='right'>";
- $Footer .= "<i>Generated by <a href='".$HomePage."'>ABI Compliance Checker</a> $TOOL_VERSION &#160;</i>\n";
+ $Footer .= "<i>Generated by <a href='".$HomePage{"Dev"}."'>ABI Compliance Checker</a> $TOOL_VERSION &#160;</i>\n";
$Footer .= "</div>\n";
$Footer .= "<br/>\n";
@@ -18343,9 +18354,12 @@ sub mergeConstants($)
if(not defined $Constants{2}{$Constant}{"Value"})
{ # removed
- %{$CompatProblems_Constants{$Level}{$Constant}{"Removed_Constant"}} = (
- "Target"=>$Constant,
- "Old_Value"=>$Old_Value );
+ if(not defined $SkipRemovedConstants)
+ {
+ %{$CompatProblems_Constants{$Level}{$Constant}{"Removed_Constant"}} = (
+ "Target"=>$Constant,
+ "Old_Value"=>$Old_Value );
+ }
next;
}
@@ -18396,6 +18410,10 @@ sub mergeConstants($)
}
}
+ if(defined $SkipAddedConstants) {
+ return;
+ }
+
foreach my $Constant (keys(%{$Constants{2}}))
{
if(not defined $Constants{1}{$Constant}{"Value"})
@@ -22816,8 +22834,12 @@ sub compareAPIs($)
}
mergeSymbols($Level);
- if(keys(%{$CheckedSymbols{$Level}})) {
- mergeConstants($Level);
+
+ if(not defined $DisableConstantsCheck)
+ {
+ if(keys(%{$CheckedSymbols{$Level}})) {
+ mergeConstants($Level);
+ }
}
$Cache{"mergeTypes"} = (); # free memory
@@ -22865,6 +22887,7 @@ sub getSysOpts()
"NoStdInc"=>$NoStdInc,
"CxxIncompat"=>$CxxIncompat,
"SkipUnidentified"=>$SkipUnidentified,
+ "DisableConstantsCheck"=>$DisableConstantsCheck,
"BinaryOnly" => $BinaryOnly,
"SourceOnly" => $SourceOnly
diff --git a/doc/Changelog.html b/doc/Changelog.html
index aa03431..80a099d 100644
--- a/doc/Changelog.html
+++ b/doc/Changelog.html
@@ -36,7 +36,7 @@
</head>
<body>
-<a href="https://github.com/lvc/abi-compliance-checker"><img style="position: absolute; top: 0; right: 0; border: 0;" src="http://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" /></a>
+<a href="https://github.com/lvc/abi-compliance-checker"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" /></a>
<div id="container">
diff --git a/doc/Xml-Descriptor.html b/doc/Xml-Descriptor.html
index 8dd7da9..ca9c392 100644
--- a/doc/Xml-Descriptor.html
+++ b/doc/Xml-Descriptor.html
@@ -37,7 +37,7 @@
</head>
<body>
-<a href="https://github.com/lvc/abi-compliance-checker"><img style="position: absolute; top: 0; right: 0; border: 0;" src="http://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" /></a>
+<a href="https://github.com/lvc/abi-compliance-checker"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" /></a>
<div id="container">
diff --git a/doc/index.html b/doc/index.html
index 2816b1b..8eafd8a 100644
--- a/doc/index.html
+++ b/doc/index.html
@@ -37,7 +37,7 @@
</head>
<body>
- <a href="https://github.com/lvc/abi-compliance-checker"><img style="position: absolute; top: 0; right: 0; border: 0;" src="http://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" /></a>
+ <a href="https://github.com/lvc/abi-compliance-checker"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" /></a>
<div id="container">
@@ -61,7 +61,7 @@
Binary incompatibility may result in crashing or incorrect behavior of applications built with an old version of a library if they run on a new one. Source incompatibility may result in recompilation errors with a new library version. The tool is intended for developers of software libraries and Linux maintainers who are interested in ensuring backward compatibility, i.e. allow old applications to run or to be recompiled with newer library versions.
<p/>
- The tool is developed by Andrey Ponomarenko. You can order additional reports for visualization of the ABI structure and high detailed binary compatibility analysis here: <a href='http://abi-laboratory.pro/'>http://abi-laboratory.pro/</a>
+ The tool is developed by Andrey Ponomarenko. You can order additional reports for visualization of the ABI structure and high detailed binary compatibility analysis here: <a href='https://abi-laboratory.pro/'>https://abi-laboratory.pro/</a>
<table class='summary'><tr><td>
<div>Table of Contents</div>
@@ -349,7 +349,7 @@ See more report examples at <a href='http://abi-laboratory.pro/tracker/'>http://
</ul>
<p/>
-See <a href='http://techbase.kde.org/Policies/Binary_Compatibility_Issues_With_C++'>"Binary Compatibility Issues With C++"</a> article from KDE TechBase for more info.
+See <a href='https://community.kde.org/Policies/Binary_Compatibility_Issues_With_C++'>"Binary Compatibility Issues With C++"</a> article from KDE TechBase for more info.
<a name="SourceProblems"></a>
<h2>Detectable Source Compatibility Problems</h2>
@@ -598,7 +598,7 @@ Please post bug reports, feature requests and questions to the <a href="https://
<a name="Maintainers"></a>
<h2>Maintainers</h2>
-The tool is developed by <a href="http://www.linkedin.com/pub/andrey-ponomarenko/67/366/818">Andrey Ponomarenko</a>.
+The tool is developed by <a href="https://www.linkedin.com/in/andreyponomarenko">Andrey Ponomarenko</a>.
<a name="ChangeLog"></a>
<h2>Changes</h2>
@@ -609,13 +609,13 @@ You can find changelog <a href='Changelog.html'>here</a>.
<ul>
<li>
- <a href='http://techbase.kde.org/Policies/Binary_Compatibility_Issues_With_C++'>"Binary Compatibility Issues With C++"</a>, KDE TechBase
+ <a href='https://community.kde.org/Policies/Binary_Compatibility_Issues_With_C++'>"Binary Compatibility Issues With C++"</a>, KDE TechBase
</li>
<li>
- <a href='http://techbase.kde.org/Policies/Binary_Compatibility_Examples'>"Binary Compatibility Examples"</a>, KDE TechBase
+ <a href='https://community.kde.org/Policies/Binary_Compatibility_Examples'>"Binary Compatibility Examples"</a>, KDE TechBase
</li>
<li>
- <a href='http://doi.ieeecomputersociety.org/10.1109/VALID.2010.27'>"Automated Verification of Shared Libraries for Backward Binary Compatibility"</a>, A. Ponomarenko and V. Rubanov, VALID 2010
+ <a href='https://www.computer.org/csdl/proceedings/valid/2010/4146/00/4146a057-abs.html'>"Automated Verification of Shared Libraries for Backward Binary Compatibility"</a>, A. Ponomarenko and V. Rubanov, VALID 2010
</li>
<li>
<a href='http://www.springerlink.com/content/905067689q7n0166/'>"Backward compatibility of software interfaces: Steps towards automatic verification"</a>, A. Ponomarenko and V. Rubanov, Programming and Computer Software 2012
diff --git a/modules/Internals/RegTests.pm b/modules/Internals/RegTests.pm
index ab3fc1c..782e55f 100644
--- a/modules/Internals/RegTests.pm
+++ b/modules/Internals/RegTests.pm
@@ -4,7 +4,7 @@
# Copyright (C) 2009-2011 Institute for System Programming, RAS
# Copyright (C) 2011-2012 Nokia Corporation and/or its subsidiary(-ies)
# Copyright (C) 2011-2012 ROSA Laboratory
-# Copyright (C) 2012-2015 Andrey Ponomarenko's ABI Laboratory
+# Copyright (C) 2012-2016 Andrey Ponomarenko's ABI Laboratory
#
# Written by Andrey Ponomarenko
#
@@ -2973,6 +2973,26 @@ sub testC()
my $DECL_SPEC = ($OSgroup eq "windows")?"__declspec( dllexport )":"";
my $EXTERN = ($OSgroup eq "windows")?"extern ":""; # add "extern" for CL compiler
+ # Struct to union
+ $HEADER1 .= "
+ typedef struct StructToUnion {
+ unsigned char A[64];
+ } StructToUnion;
+
+ $DECL_SPEC int structToUnion(StructToUnion *p);";
+ $SOURCE1 .= "
+ int structToUnion(StructToUnion *p) { return 0; }";
+
+ $HEADER2 .= "
+ typedef union StructToUnion {
+ unsigned char A[64];
+ void *p;
+ } StructToUnion;
+
+ $DECL_SPEC int structToUnion(StructToUnion *p);";
+ $SOURCE2 .= "
+ int structToUnion(StructToUnion *p) { return 0; }";
+
# Typedef to function
$HEADER1 .= "
typedef int(TypedefToFunction)(int pX);
diff --git a/modules/Internals/Styles/CmpSystems.css b/modules/Internals/Styles/CmpSystems.css
index a499ccc..7552249 100644
--- a/modules/Internals/Styles/CmpSystems.css
+++ b/modules/Internals/Styles/CmpSystems.css
@@ -44,7 +44,7 @@ table.summary td.object {
white-space:normal;
word-wrap:break-word;
}
-table.summary td.ver {
+table.summary td.ver, table.summary th.ver {
max-width:10em;
white-space:normal;
word-wrap:break-word;
diff --git a/modules/Internals/SysCheck.pm b/modules/Internals/SysCheck.pm
index 96065c7..340db4d 100644
--- a/modules/Internals/SysCheck.pm
+++ b/modules/Internals/SysCheck.pm
@@ -4,7 +4,7 @@
# Copyright (C) 2009-2011 Institute for System Programming, RAS
# Copyright (C) 2011-2012 Nokia Corporation and/or its subsidiary(-ies)
# Copyright (C) 2011-2012 ROSA Laboratory
-# Copyright (C) 2012-2015 Andrey Ponomarenko's ABI Laboratory
+# Copyright (C) 2012-2016 Andrey Ponomarenko's ABI Laboratory
#
# Written by Andrey Ponomarenko
#
@@ -28,7 +28,8 @@ use Fcntl;
my ($Debug, $Quiet, $LogMode, $CheckHeadersOnly, $SystemRoot, $GCC_PATH,
$CrossPrefix, $TargetSysInfo, $TargetLibraryName, $CrossGcc, $UseStaticLibs,
-$NoStdInc, $CxxIncompat, $SkipUnidentified, $OStarget, $BinaryOnly, $SourceOnly);
+$NoStdInc, $CxxIncompat, $SkipUnidentified, $OStarget, $BinaryOnly,
+$SourceOnly, $DisableConstantsCheck);
my $OSgroup = get_OSgroup();
my $TMP_DIR = tempdir(CLEANUP=>1);
@@ -65,6 +66,13 @@ sub cmpSystems($$$)
# sys_dumps/<System>/<Arch>/...
my $SystemName1 = get_filename(get_dirname($SPath1));
my $SystemName2 = get_filename(get_dirname($SPath2));
+
+ my $SystemName1_P = $SystemName1;
+ my $SystemName2_P = $SystemName2;
+
+ $SystemName1=~s/_/ /g;
+ $SystemName2=~s/_/ /g;
+
# sys_dumps/<System>/<Arch>/...
my $ArchName = get_filename($SPath1);
if($ArchName ne get_filename($SPath2)) {
@@ -87,7 +95,7 @@ sub cmpSystems($$$)
$GroupByHeaders = 1;
}
}
- my $SYS_REPORT_PATH = "sys_compat_reports/".$SystemName1."_to_".$SystemName2."/$ArchName";
+ my $SYS_REPORT_PATH = "sys_compat_reports/".$SystemName1_P."_to_".$SystemName2_P."/$ArchName";
rmtree($SYS_REPORT_PATH);
my (%LibSoname1, %LibSoname2) = ();
foreach (split(/\n/, readFile($SPath1."/sonames.txt")))
@@ -364,6 +372,14 @@ sub cmpSystems($$$)
if($GroupByHeaders) {
$ACC_compare .= " -component header";
}
+
+ if($DisableConstantsCheck) {
+ $ACC_compare .= " -disable-constants-check";
+ }
+
+ $ACC_compare .= " -skip-added-constants";
+ $ACC_compare .= " -skip-removed-constants";
+
if($Quiet)
{ # quiet mode
$ACC_compare .= " -quiet";
@@ -450,7 +466,7 @@ sub cmpSystems($$$)
unlink($DiffOut);
}
- my $Cmd_R = $RfcDiff." --width 75 --stdout \"$Path1\" \"$Path2\" >$DiffOut 2>/dev/null";
+ my $Cmd_R = $RfcDiff." --width 80 --stdout \"$Path1\" \"$Path2\" >$DiffOut 2>/dev/null";
qx/$Cmd_R/; # execute
if(-s $DiffOut)
@@ -465,6 +481,11 @@ sub cmpSystems($$$)
$Content=~s/(<td colspan=\"5\"[^>]*>)(.+)(<\/td>)/$1$3/;
$Content=~s/(<table) /$1 class='diff_tbl' /g;
+ $Content=~s&<td class="lineno" valign="top"></td>&&g;
+ $Content=~s&<td class="lineno"></td>&&g;
+ $Content=~s&<th></th>&&g;
+ $Content=~s&<td></td>&&g;
+
$Content=~s/(\Q$N\E)(&nbsp;)/$1 ($LV1-$SystemName1)$2/;
$Content=~s/(\Q$N\E)(&nbsp;)/$1 ($LV2-$SystemName2)$2/;
@@ -475,24 +496,27 @@ sub cmpSystems($$$)
}
}
- my $Title = $LName.": headers diff between $LV1-$SystemName1 and $LV2-$SystemName2 versions";
- my $Keywords = $LName.", header, diff";
- my $Description = "Diff for header files between $LV1-$SystemName1 and $LV2-$SystemName2 versions of $LName";
- my $Styles = readModule("Styles", "HeadersDiff.css");
-
- my $Link = "This html diff was produced by <a href='http://tools.ietf.org/tools/rfcdiff/'>rfcdiff</a> 1.41.";
-
- $Diff .= "<br/>";
- $Diff .= "<div style='width:100%;' align='left'>$Link</div>\n";
-
- $Diff = "<h1>Headers diff for <span style='color:Blue;'>$LName</span> between <span style='color:Red;'>$LV1-$SystemName1</span> and <span style='color:Red;'>$LV2-$SystemName2</span> versions</h1><br/><br/>".$Diff;
-
- $Diff = "<table width='100%' cellpadding='0' cellspacing='0'><tr><td>$Diff</td></tr></table>";
-
- $Diff = composeHTML_Head($Title, $Keywords, $Description, $Styles, "")."\n<body>\n$Diff\n</body>\n</html>\n";
-
- my $Output = $SYS_REPORT_PATH."/headers_diff/$LName";
- writeFile($Output."/diff.html", $Diff);
+ if($Diff)
+ {
+ my $Title = $LName.": headers diff between $LV1-$SystemName1 and $LV2-$SystemName2 versions";
+ my $Keywords = $LName.", header, diff";
+ my $Description = "Diff for header files between $LV1-$SystemName1 and $LV2-$SystemName2 versions of $LName";
+ my $Styles = readModule("Styles", "HeadersDiff.css");
+
+ my $Link = "This html diff was produced by <a href='http://tools.ietf.org/tools/rfcdiff/'>rfcdiff</a> 1.41.";
+
+ $Diff .= "<br/>";
+ $Diff .= "<div style='width:100%;' align='left'>$Link</div>\n";
+
+ $Diff = "<h1>Headers diff for <span style='color:Blue;'>$LName</span> between <span style='color:Red;'>$LV1-$SystemName1</span> and <span style='color:Red;'>$LV2-$SystemName2</span> versions</h1><br/><br/>".$Diff;
+
+ $Diff = "<table width='100%' cellpadding='0' cellspacing='0'><tr><td>$Diff</td></tr></table>";
+
+ $Diff = composeHTML_Head($Title, $Keywords, $Description, $Styles, "")."\n<body>\n$Diff\n</body>\n</html>\n";
+
+ my $Output = $SYS_REPORT_PATH."/headers_diff/$LName";
+ writeFile($Output."/diff.html", $Diff);
+ }
}
}
@@ -648,7 +672,7 @@ sub cmpSystems($$$)
$SYS_REPORT .= "<tr>\n";
if(not $GroupByHeaders) {
- $SYS_REPORT .= "<th>$SystemName1</th><th>$SystemName2</th>\n";
+ $SYS_REPORT .= "<th class='ver'>$SystemName1</th><th class='ver'>$SystemName2</th>\n";
}
if($BinaryOnly and $SourceOnly) {
$SYS_REPORT .= "<th>Binary</th><th>Source</th>\n";
@@ -856,11 +880,17 @@ sub cmpSystems($$$)
}
}
- if(-d $HDiff."/".$LName) {
- $SYS_REPORT .= "<td><a href=\'headers_diff/$LName/diff.html\'>diff</a></td>\n";
- }
- else {
- $SYS_REPORT .= "<td>N/A</td>\n";
+ if(-d $HDiff)
+ {
+ if(-d $HDiff."/".$LName) {
+ $SYS_REPORT .= "<td><a href=\'headers_diff/$LName/diff.html\'>diff</a></td>\n";
+ }
+ elsif(defined $Added{$LName} or defined $Removed{$LName}) {
+ $SYS_REPORT .= "<td>N/A</td>\n";
+ }
+ else {
+ $SYS_REPORT .= "<td>Empty</td>\n";
+ }
}
$SYS_REPORT .= "</tr>\n";
@@ -1039,6 +1069,7 @@ sub initModule($)
$NoStdInc = $S->{"NoStdInc"};
$CxxIncompat = $S->{"CxxIncompat"};
$SkipUnidentified = $S->{"SkipUnidentified"};
+ $DisableConstantsCheck = $S->{"DisableConstantsCheck"};
$BinaryOnly = $S->{"BinaryOnly"};
$SourceOnly = $S->{"SourceOnly"};
@@ -1231,6 +1262,11 @@ sub get_binversion($)
my $VInfo = `$SigcheckCmd -nobanner -n $Path 2>$TMP_DIR/null`;
$VInfo=~s/\s*\(.*\)\s*//;
chomp($VInfo);
+
+ if($VInfo eq "n/a") {
+ $VInfo = uc($VInfo);
+ }
+
return $VInfo;
}
return "";
@@ -1250,7 +1286,11 @@ sub dumpSystem($)
# should be used with -sysroot and -cross-gcc options
my $Opts = $_[0];
initModule($Opts);
- my $SYS_DUMP_PATH = "sys_dumps/".$SysDescriptor{"Name"}."/".getArch(1);
+
+ my $SysName_P = $SysDescriptor{"Name"};
+ $SysName_P=~s/ /_/g;
+
+ my $SYS_DUMP_PATH = "sys_dumps/".$SysName_P."/".getArch(1);
if(not $TargetLibraryName) {
rmtree($SYS_DUMP_PATH);
}