lvc / abi-compliance-checker

A tool for checking backward API/ABI compatibility of a C/C++ library
https://lvc.github.io/abi-compliance-checker/
GNU Lesser General Public License v2.1
625 stars 78 forks source link

Existing Symbols shown as removed in report #57

Open DonRomanos opened 7 years ago

DonRomanos commented 7 years ago

Hello,

I'm using the ABI-Compliance-Checker under Windows, to check some static libs compiled with Visual Studio 2008. The tool works fine, except it finds lots of removed Symbols in the Source report, which are in fact there. This includes Symbols from std-headers, or boost, which clearly have not changed, see the screenshot for an example.

image

I traced the issue and found out that the selectSymbol method returns false, because the header is not in $In::Desc{$V}{"TargetHeader"}.

So I checked where it is set in the Module SysFiles, Method addTargetHeaders there is the line 2317:

if( familiarDirs($RegDir, $Dir) or $RecursiveIncludes{$LVer}{$RegHeader}{$RecInc}!=1) { # in the same directory or included by #include "..." $In::Desc{$LVer}{"TargetHeader"}{getFilename($RecInc)} = 1; }

This returns false for headers containing the symbols which cause the errors. So I wondered if the "!=1" part in $RecursiveIncludes{$LVer}{$RegHeader}{$RecInc}!=1 might be a mistake, since when I remove it, the program seems to run fine and the false removed symbol errors disappear.

Except in one case which I'm currently investigating.

If you need more info, I can provide you with more details.

Thank you for the awesome tool!

Edit: Okay, it only fixed most of the errors not all, I still have some issues with standard headers: image I'm looking into this now.

Edit2: I checked the extended mode, then the issues also appear in the binary report. The issues now only concern standard headers like strings.h, cwchar, direct.h, io.h, process.h, stat.h, string.h, and a few others, but only std-headers.

noloader commented 7 years ago

Sorry to step into someone else's bug report. Regarding the math functions, see Jonathan Wakely's Why <cstdlib> is more complicated than you might think from the Red Hat blogs. Wakely is one of GCC's C++ standard library maintainers.

I know GCC changed some things recently with respect to <cstdlib> and <cmath>. See Macports Issue 53226, gcc5 @5.4: error: 'std::log2' has not been declared and GCC Issue 79017, Old PowerMac G5, MacPorts GCC 5.4, C++11 and "std::log2 has not been declared". Jonathan was kind enough to backport the changes to a bunch of different versions of GCC.

I realize Windows and Linux are different, but sometimes things cross-pollinate; and other times one project follows another's lead.