Skip to content

Commit 20472f5

Browse files
authored
added --debug-lookup to log library loading (#6436)
1 parent ea2c390 commit 20472f5

File tree

12 files changed

+148
-43
lines changed

12 files changed

+148
-43
lines changed

.github/workflows/asan.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ jobs:
6969
# TODO: disable all warnings
7070
- name: CMake
7171
run: |
72-
cmake -S . -B cmake.output -DCMAKE_BUILD_TYPE=RelWithDebInfo -DHAVE_RULES=On -DBUILD_TESTS=On -DBUILD_GUI=Off -DWITH_QCHART=Off -DUSE_MATCHCOMPILER=Verify -DANALYZE_ADDRESS=On -DENABLE_CHECK_INTERNAL=On -DUSE_BOOST=On -DCPPCHK_GLIBCXX_DEBUG=Off -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=Off -DDISABLE_DMAKE=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache
72+
cmake -S . -B cmake.output -DCMAKE_BUILD_TYPE=RelWithDebInfo -DHAVE_RULES=On -DBUILD_TESTS=On -DBUILD_GUI=Off -DWITH_QCHART=Off -DUSE_MATCHCOMPILER=Verify -DANALYZE_ADDRESS=On -DENABLE_CHECK_INTERNAL=On -DUSE_BOOST=On -DCPPCHK_GLIBCXX_DEBUG=Off -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=Off -DDISABLE_DMAKE=On -DFILESDIR= -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache
7373
env:
7474
CC: clang-18
7575
CXX: clang++-18

.github/workflows/tsan.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ jobs:
6868
6969
- name: CMake
7070
run: |
71-
cmake -S . -B cmake.output -DCMAKE_BUILD_TYPE=RelWithDebInfo -DHAVE_RULES=On -DBUILD_TESTS=On -DBUILD_GUI=Off -DWITH_QCHART=Off -DUSE_MATCHCOMPILER=Verify -DANALYZE_THREAD=On -DENABLE_CHECK_INTERNAL=On -DUSE_BOOST=On -DCPPCHK_GLIBCXX_DEBUG=Off -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=Off -DDISABLE_DMAKE=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache
71+
cmake -S . -B cmake.output -DCMAKE_BUILD_TYPE=RelWithDebInfo -DHAVE_RULES=On -DBUILD_TESTS=On -DBUILD_GUI=Off -DWITH_QCHART=Off -DUSE_MATCHCOMPILER=Verify -DANALYZE_THREAD=On -DENABLE_CHECK_INTERNAL=On -DUSE_BOOST=On -DCPPCHK_GLIBCXX_DEBUG=Off -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=Off -DDISABLE_DMAKE=On -DFILESDIR= -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache
7272
env:
7373
CC: clang-18
7474
CXX: clang++-18

.github/workflows/ubsan.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ jobs:
6868
# TODO: disable warnings
6969
- name: CMake
7070
run: |
71-
cmake -S . -B cmake.output -DCMAKE_BUILD_TYPE=RelWithDebInfo -DHAVE_RULES=On -DBUILD_TESTS=On -DBUILD_GUI=ON -DWITH_QCHART=ON -DUSE_MATCHCOMPILER=Verify -DANALYZE_UNDEFINED=On -DENABLE_CHECK_INTERNAL=On -DUSE_BOOST=On -DCPPCHK_GLIBCXX_DEBUG=Off -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DDISABLE_DMAKE=On -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache
71+
cmake -S . -B cmake.output -DCMAKE_BUILD_TYPE=RelWithDebInfo -DHAVE_RULES=On -DBUILD_TESTS=On -DBUILD_GUI=ON -DWITH_QCHART=ON -DUSE_MATCHCOMPILER=Verify -DANALYZE_UNDEFINED=On -DENABLE_CHECK_INTERNAL=On -DUSE_BOOST=On -DCPPCHK_GLIBCXX_DEBUG=Off -DCMAKE_DISABLE_PRECOMPILE_HEADERS=On -DCMAKE_GLOBAL_AUTOGEN_TARGET=On -DDISABLE_DMAKE=On -DFILESDIR= -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache
7272
env:
7373
CC: clang-18
7474
CXX: clang++-18

cli/cmdlineparser.cpp

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -553,6 +553,10 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
553553
std::strcmp(argv[i], "--debug-normal") == 0)
554554
mSettings.debugnormal = true;
555555

556+
// Show debug warnings for lookup for configuration files
557+
else if (std::strcmp(argv[i], "--debug-lookup") == 0)
558+
mSettings.debuglookup = true;
559+
556560
// Flag used for various purposes during debugging
557561
else if (std::strcmp(argv[i], "--debug-simplified") == 0)
558562
mSettings.debugSimplified = true;
@@ -1810,9 +1814,9 @@ bool CmdLineParser::isCppcheckPremium() const {
18101814
return startsWith(mSettings.cppcheckCfgProductName, "Cppcheck Premium");
18111815
}
18121816

1813-
bool CmdLineParser::tryLoadLibrary(Library& destination, const std::string& basepath, const char* filename)
1817+
bool CmdLineParser::tryLoadLibrary(Library& destination, const std::string& basepath, const char* filename, bool debug)
18141818
{
1815-
const Library::Error err = destination.load(basepath.c_str(), filename);
1819+
const Library::Error err = destination.load(basepath.c_str(), filename, debug);
18161820

18171821
if (err.errorcode == Library::ErrorCode::UNKNOWN_ELEMENT)
18181822
mLogger.printMessage("Found unknown elements in configuration file '" + std::string(filename) + "': " + err.reason); // TODO: print as errors
@@ -1859,7 +1863,7 @@ bool CmdLineParser::tryLoadLibrary(Library& destination, const std::string& base
18591863

18601864
bool CmdLineParser::loadLibraries(Settings& settings)
18611865
{
1862-
if (!tryLoadLibrary(settings.library, settings.exename, "std.cfg")) {
1866+
if (!tryLoadLibrary(settings.library, settings.exename, "std.cfg", settings.debuglookup)) {
18631867
const std::string msg("Failed to load std.cfg. Your Cppcheck installation is broken, please re-install.");
18641868
#ifdef FILESDIR
18651869
const std::string details("The Cppcheck binary was compiled with FILESDIR set to \""
@@ -1877,7 +1881,7 @@ bool CmdLineParser::loadLibraries(Settings& settings)
18771881

18781882
bool result = true;
18791883
for (const auto& lib : settings.libraries) {
1880-
if (!tryLoadLibrary(settings.library, settings.exename, lib.c_str())) {
1884+
if (!tryLoadLibrary(settings.library, settings.exename, lib.c_str(), settings.debuglookup)) {
18811885
result = false;
18821886
}
18831887
}

cli/cmdlineparser.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ class CmdLineParser {
137137
* Tries to load a library and prints warning/error messages
138138
* @return false, if an error occurred (except unknown XML elements)
139139
*/
140-
bool tryLoadLibrary(Library& destination, const std::string& basepath, const char* filename);
140+
bool tryLoadLibrary(Library& destination, const std::string& basepath, const char* filename, bool debug);
141141

142142
/**
143143
* @brief Load libraries

gui/mainwindow.cpp

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -836,35 +836,50 @@ void MainWindow::addIncludeDirs(const QStringList &includeDirs, Settings &result
836836
}
837837
}
838838

839-
Library::Error MainWindow::loadLibrary(Library &library, const QString &filename)
839+
Library::Error MainWindow::loadLibrary(Library &library, const QString &filename, bool debug)
840840
{
841841
Library::Error ret;
842842

843843
// Try to load the library from the project folder..
844844
if (mProjectFile) {
845845
QString path = QFileInfo(mProjectFile->getFilename()).canonicalPath();
846-
ret = library.load(nullptr, (path+"/"+filename).toLatin1());
846+
QString libpath = path+"/"+filename;
847+
if (debug)
848+
std::cout << "looking for library '" + libpath.toStdString() + "'" << std::endl;
849+
ret = library.load(nullptr, libpath.toLatin1());
847850
if (ret.errorcode != Library::ErrorCode::FILE_NOT_FOUND)
848851
return ret;
849852
}
850853

851854
// Try to load the library from the application folder..
852855
const QString appPath = QFileInfo(QCoreApplication::applicationFilePath()).canonicalPath();
853-
ret = library.load(nullptr, (appPath+"/"+filename).toLatin1());
856+
QString libpath = appPath+"/"+filename;
857+
if (debug)
858+
std::cout << "looking for library '" + libpath.toStdString() + "'" << std::endl;
859+
ret = library.load(nullptr, libpath.toLatin1());
854860
if (ret.errorcode != Library::ErrorCode::FILE_NOT_FOUND)
855861
return ret;
856-
ret = library.load(nullptr, (appPath+"/cfg/"+filename).toLatin1());
862+
libpath = appPath+"/cfg/"+filename;
863+
if (debug)
864+
std::cout << "looking for library '" + libpath.toStdString() + "'" << std::endl;
865+
ret = library.load(nullptr, libpath.toLatin1());
857866
if (ret.errorcode != Library::ErrorCode::FILE_NOT_FOUND)
858867
return ret;
859868

860869
#ifdef FILESDIR
861870
// Try to load the library from FILESDIR/cfg..
862871
const QString filesdir = FILESDIR;
863872
if (!filesdir.isEmpty()) {
864-
ret = library.load(nullptr, (filesdir+"/cfg/"+filename).toLatin1());
873+
libpath = filesdir+"/cfg/"+filename;
874+
if (debug)
875+
std::cout << "looking for library '" + libpath.toStdString() + "'" << std::endl;
876+
ret = library.load(nullptr, libpath.toLatin1());
865877
if (ret.errorcode != Library::ErrorCode::FILE_NOT_FOUND)
866878
return ret;
867-
ret = library.load(nullptr, (filesdir+filename).toLatin1());
879+
libpath = filesdir+filename;
880+
if (debug)
881+
std::cout << "looking for library '" + libpath.toStdString() + "'" << std::endl;
882+
ret = library.load(nullptr, libpath.toLatin1());
868883
if (ret.errorcode != Library::ErrorCode::FILE_NOT_FOUND)
869884
return ret;
870885
}
@@ -873,14 +888,23 @@ Library::Error MainWindow::loadLibrary(Library &library, const QString &filename
873888
// Try to load the library from the cfg subfolder..
874889
const QString datadir = getDataDir();
875890
if (!datadir.isEmpty()) {
876-
ret = library.load(nullptr, (datadir+"/"+filename).toLatin1());
891+
libpath = datadir+"/"+filename;
892+
if (debug)
893+
std::cout << "looking for library '" + libpath.toStdString() + "'" << std::endl;
894+
ret = library.load(nullptr, libpath.toLatin1());
877895
if (ret.errorcode != Library::ErrorCode::FILE_NOT_FOUND)
878896
return ret;
879-
ret = library.load(nullptr, (datadir+"/cfg/"+filename).toLatin1());
897+
libpath = datadir+"/cfg/"+filename;
898+
if (debug)
899+
std::cout << "looking for library '" + libpath.toStdString() + "'" << std::endl;
900+
ret = library.load(nullptr, libpath.toLatin1());
880901
if (ret.errorcode != Library::ErrorCode::FILE_NOT_FOUND)
881902
return ret;
882903
}
883904

905+
if (debug)
906+
std::cout << "library not found: '" + filename.toStdString() + "'" << std::endl;
907+
884908
return ret;
885909
}
886910

gui/mainwindow.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -392,7 +392,7 @@ private slots:
392392
* @param filename filename (no path)
393393
* @return error code
394394
*/
395-
Library::Error loadLibrary(Library &library, const QString &filename);
395+
Library::Error loadLibrary(Library &library, const QString &filename, bool debug = false);
396396

397397
/**
398398
* @brief Tries to load library file, prints message on error

lib/library.cpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include <cctype>
3434
#include <climits>
3535
#include <cstring>
36+
#include <iostream>
3637
#include <list>
3738
#include <memory>
3839
#include <sstream>
@@ -65,9 +66,12 @@ static void gettokenlistfromvalid(const std::string& valid, bool cpp, TokenList&
6566
}
6667
}
6768

68-
Library::Error Library::load(const char exename[], const char path[])
69+
Library::Error Library::load(const char exename[], const char path[], bool debug)
6970
{
71+
// TODO: remove handling of multiple libraries at once?
7072
if (std::strchr(path,',') != nullptr) {
73+
if (debug)
74+
std::cout << "handling multiple libraries '" + std::string(path) + "'" << std::endl;
7175
std::string p(path);
7276
for (;;) {
7377
const std::string::size_type pos = p.find(',');
@@ -86,15 +90,21 @@ Library::Error Library::load(const char exename[], const char path[])
8690
std::string absolute_path;
8791
// open file..
8892
tinyxml2::XMLDocument doc;
93+
if (debug)
94+
std::cout << "looking for library '" + std::string(path) + "'" << std::endl;
8995
tinyxml2::XMLError error = doc.LoadFile(path);
9096
if (error == tinyxml2::XML_ERROR_FILE_READ_ERROR && Path::getFilenameExtension(path).empty())
97+
{
9198
// Reading file failed, try again...
9299
error = tinyxml2::XML_ERROR_FILE_NOT_FOUND;
100+
}
93101
if (error == tinyxml2::XML_ERROR_FILE_NOT_FOUND) {
94102
// failed to open file.. is there no extension?
95103
std::string fullfilename(path);
96104
if (Path::getFilenameExtension(fullfilename).empty()) {
97105
fullfilename += ".cfg";
106+
if (debug)
107+
std::cout << "looking for library '" + std::string(fullfilename) + "'" << std::endl;
98108
error = doc.LoadFile(fullfilename.c_str());
99109
if (error != tinyxml2::XML_ERROR_FILE_NOT_FOUND)
100110
absolute_path = Path::getAbsoluteFilePath(fullfilename);
@@ -116,6 +126,8 @@ Library::Error Library::load(const char exename[], const char path[])
116126
cfgfolders.pop_back();
117127
const char *sep = (!cfgfolder.empty() && endsWith(cfgfolder,'/') ? "" : "/");
118128
const std::string filename(cfgfolder + sep + fullfilename);
129+
if (debug)
130+
std::cout << "looking for library '" + std::string(filename) + "'" << std::endl;
119131
error = doc.LoadFile(filename.c_str());
120132
if (error != tinyxml2::XML_ERROR_FILE_NOT_FOUND)
121133
absolute_path = Path::getAbsoluteFilePath(filename);
@@ -134,10 +146,13 @@ Library::Error Library::load(const char exename[], const char path[])
134146
return Error(ErrorCode::OK); // ignore duplicates
135147
}
136148

149+
if (debug)
150+
std::cout << "library not found: '" + std::string(path) + "'" << std::endl;
151+
137152
if (error == tinyxml2::XML_ERROR_FILE_NOT_FOUND)
138153
return Error(ErrorCode::FILE_NOT_FOUND);
139154

140-
doc.PrintError();
155+
doc.PrintError(); // TODO: do not print stray messages
141156
return Error(ErrorCode::BAD_XML);
142157
}
143158

lib/library.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ class CPPCHECKLIB Library {
7171
std::string reason;
7272
};
7373

74-
Error load(const char exename[], const char path[]);
74+
Error load(const char exename[], const char path[], bool debug = false);
7575

7676
struct AllocFunc {
7777
int groupId;

lib/settings.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,9 @@ class CPPCHECKLIB WARN_UNUSED Settings {
173173
/** @brief Are we running from DACA script? */
174174
bool daca{};
175175

176+
/** @brief Internal: Is --debug-lookup given? */
177+
bool debuglookup{};
178+
176179
/** @brief Is --debug-normal given? */
177180
bool debugnormal{};
178181

test/cli/other_test.py

Lines changed: 76 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,24 @@
66
import pytest
77
import json
88

9-
from testutils import cppcheck, assert_cppcheck
9+
from testutils import cppcheck, assert_cppcheck, cppcheck_ex
10+
11+
12+
def __remove_std_lookup_log(l : list, exepath):
13+
print(l)
14+
l.remove("looking for library 'std.cfg'")
15+
l.remove("looking for library '{}/std.cfg'".format(exepath))
16+
l.remove("looking for library '{}/../cfg/std.cfg'".format(exepath))
17+
l.remove("looking for library '{}/cfg/std.cfg'".format(exepath))
18+
return l
19+
20+
21+
def __remove_verbose_log(l : list):
22+
l.remove('Defines:')
23+
l.remove('Undefines:')
24+
l.remove('Includes:')
25+
l.remove('Platform:native')
26+
return l
1027

1128

1229
def test_missing_include(tmpdir): # #11283
@@ -452,13 +469,9 @@ class _clz {
452469

453470
exitcode, stdout, stderr = cppcheck(args)
454471
assert exitcode == 0
455-
lines = stdout.splitlines()
472+
lines = __remove_verbose_log(stdout.splitlines())
456473
assert lines == [
457-
'Checking {} ...'.format(test_file),
458-
'Defines:',
459-
'Undefines:',
460-
'Includes:',
461-
'Platform:native'
474+
'Checking {} ...'.format(test_file)
462475
]
463476
lines = [line for line in stderr.splitlines() if line != '']
464477
expect = [
@@ -585,13 +598,9 @@ def test_addon_namingng_config(tmpdir):
585598
exitcode, stdout, stderr = cppcheck(args)
586599
assert exitcode == 0
587600

588-
lines = stdout.splitlines()
601+
lines = __remove_verbose_log(stdout.splitlines())
589602
assert lines == [
590-
'Checking {} ...'.format(test_file),
591-
'Defines:',
592-
'Undefines:',
593-
'Includes:',
594-
'Platform:native'
603+
'Checking {} ...'.format(test_file)
595604
]
596605
lines = stderr.splitlines()
597606
# ignore the first line, stating that the addon failed to run properly
@@ -725,13 +734,9 @@ def test_invalid_addon_py_verbose(tmpdir):
725734

726735
exitcode, stdout, stderr = cppcheck(args)
727736
assert exitcode == 0 # TODO: needs to be 1
728-
lines = stdout.splitlines()
737+
lines = __remove_verbose_log(stdout.splitlines())
729738
assert lines == [
730-
'Checking {} ...'.format(test_file),
731-
'Defines:',
732-
'Undefines:',
733-
'Includes:',
734-
'Platform:native'
739+
'Checking {} ...'.format(test_file)
735740
]
736741
"""
737742
/tmp/pytest-of-user/pytest-11/test_invalid_addon_py_20/file.cpp:0:0: error: Bailing out from analysis: Checking file failed: Failed to execute addon 'addon1' - exitcode is 1: python3 /home/user/CLionProjects/cppcheck/addons/runaddon.py /tmp/pytest-of-user/pytest-11/test_invalid_addon_py_20/addon1.py --cli /tmp/pytest-of-user/pytest-11/test_invalid_addon_py_20/file.cpp.24762.dump
@@ -1497,13 +1502,17 @@ def test_cpp_probe(tmpdir):
14971502
])
14981503

14991504
args = ['-q', '--template=simple', '--cpp-header-probe', '--verbose', test_file]
1500-
err_lines = [
1505+
1506+
exitcode, stdout, stderr = cppcheck(args)
1507+
assert exitcode == 0, stdout
1508+
lines = stdout.splitlines()
1509+
assert lines == []
1510+
lines = stderr.splitlines()
1511+
assert lines == [
15011512
# TODO: fix that awkward format
15021513
"{}:1:1: error: Code 'classA{{' is invalid C code.: Use --std, -x or --language to enforce C++. Or --cpp-header-probe to identify C++ headers via the Emacs marker. [syntaxError]".format(test_file)
15031514
]
15041515

1505-
assert_cppcheck(args, ec_exp=0, err_exp=err_lines, out_exp=[])
1506-
15071516

15081517
def test_cpp_probe_2(tmpdir):
15091518
test_file = os.path.join(tmpdir, 'test.h')
@@ -1516,3 +1525,48 @@ def test_cpp_probe_2(tmpdir):
15161525
args = ['-q', '--template=simple', '--cpp-header-probe', test_file]
15171526

15181527
assert_cppcheck(args, ec_exp=0, err_exp=[], out_exp=[])
1528+
1529+
1530+
# TODO: test with FILESDIR
1531+
def test_lib_lookup(tmpdir):
1532+
test_file = os.path.join(tmpdir, 'test.c')
1533+
with open(test_file, 'wt'):
1534+
pass
1535+
1536+
exitcode, stdout, _, exe = cppcheck_ex(['--library=gnu', '--debug-lookup', test_file])
1537+
exepath = os.path.dirname(exe)
1538+
if sys.platform == 'win32':
1539+
exepath = exepath.replace('\\', '/')
1540+
assert exitcode == 0, stdout
1541+
lines = __remove_std_lookup_log(stdout.splitlines(), exepath)
1542+
assert lines == [
1543+
"looking for library 'gnu'",
1544+
"looking for library 'gnu.cfg'",
1545+
"looking for library '{}/gnu.cfg'".format(exepath),
1546+
"looking for library '{}/../cfg/gnu.cfg'".format(exepath),
1547+
"looking for library '{}/cfg/gnu.cfg'".format(exepath),
1548+
'Checking {} ...'.format(test_file)
1549+
]
1550+
1551+
1552+
# TODO: test with FILESDIR
1553+
def test_lib_lookup_notfound(tmpdir):
1554+
test_file = os.path.join(tmpdir, 'test.c')
1555+
with open(test_file, 'wt'):
1556+
pass
1557+
1558+
exitcode, stdout, _, exe = cppcheck_ex(['--library=none', '--debug-lookup', test_file])
1559+
exepath = os.path.dirname(exe)
1560+
if sys.platform == 'win32':
1561+
exepath = exepath.replace('\\', '/')
1562+
assert exitcode == 1, stdout
1563+
lines = __remove_std_lookup_log(stdout.splitlines(), exepath)
1564+
assert lines == [
1565+
"looking for library 'none'",
1566+
"looking for library 'none.cfg'",
1567+
"looking for library '{}/none.cfg'".format(exepath),
1568+
"looking for library '{}/../cfg/none.cfg'".format(exepath),
1569+
"looking for library '{}/cfg/none.cfg'".format(exepath),
1570+
"library not found: 'none'",
1571+
"cppcheck: Failed to load library configuration file 'none'. File not found"
1572+
]

0 commit comments

Comments
 (0)