diff --git a/cfg/std.cfg b/cfg/std.cfg
new file mode 100644
index 000000000..5b7d4d415
--- /dev/null
+++ b/cfg/std.cfg
@@ -0,0 +1,17 @@
+
+
+
+ free
+
+ malloc
+ calloc
+ strdup
+ strndup
+
+
+
+ fclose
+ fopen
+
+
+
diff --git a/cli/cppcheckexecutor.cpp b/cli/cppcheckexecutor.cpp
index fa4f31a47..236f74b05 100644
--- a/cli/cppcheckexecutor.cpp
+++ b/cli/cppcheckexecutor.cpp
@@ -152,6 +152,8 @@ int CppCheckExecutor::check(int argc, const char* const argv[])
Settings& settings = cppCheck.settings();
_settings = &settings;
+ settings.library.load(argv[0], "std");
+
if (!parseFromArgs(&cppCheck, argc, argv)) {
return EXIT_FAILURE;
}
diff --git a/gui/mainwindow.cpp b/gui/mainwindow.cpp
index 408127ba6..15e51c003 100644
--- a/gui/mainwindow.cpp
+++ b/gui/mainwindow.cpp
@@ -516,6 +516,9 @@ Settings MainWindow::GetCppcheckSettings()
{
Settings result;
+ const QString applicationFilePath = QCoreApplication::applicationFilePath();
+ result.library.load(applicationFilePath.toLatin1(), "std");
+
// If project file loaded, read settings from it
if (mProject) {
ProjectFile *pfile = mProject->GetProjectFile();
diff --git a/lib/library.cpp b/lib/library.cpp
index c2451b6e9..904fc9100 100644
--- a/lib/library.cpp
+++ b/lib/library.cpp
@@ -17,20 +17,14 @@
*/
#include "library.h"
+#include "path.h"
#include "tinyxml2.h"
+#include
+#include
+
Library::Library() : allocid(0)
{
- while (!ismemory(++allocid));
- _alloc["malloc"] = allocid;
- _alloc["calloc"] = allocid;
- _alloc["strdup"] = allocid;
- _alloc["strndup"] = allocid;
- _dealloc["free"] = allocid;
-
- while (!isresource(++allocid));
- _alloc["fopen"] = allocid;
- _dealloc["fclose"] = allocid;
}
Library::Library(const Library &lib) :
@@ -43,7 +37,6 @@ Library::Library(const Library &lib) :
_dealloc(lib._dealloc),
_noreturn(lib._noreturn)
{
-
}
Library::~Library() { }
@@ -65,19 +58,27 @@ bool Library::load(const char exename[], const char path[])
return ret;
}
+ // open file..
FILE *fp = fopen(path, "rt");
if (fp == NULL) {
- std::string fullpath(exename);
- if (fullpath.find_first_of("/\\") != std::string::npos)
- fullpath = fullpath.substr(0, 1U + fullpath.find_last_of("/\\"));
- fullpath += path;
- fp = fopen(fullpath.c_str(), "rt");
- if (fp == NULL) {
- fullpath += ".cfg";
- fp = fopen(fullpath.c_str(), "rt");
- if (fp == NULL)
- return false;
+ // failed to open file.. is there no extension?
+ std::string fullfilename(path);
+ if (Path::getFilenameExtension(fullfilename) == "") {
+ fullfilename += ".cfg";
+ fp = fopen(fullfilename.c_str(), "rt");
}
+
+ if (fp==NULL) {
+ // Try to locate the library configuration in the installation folder..
+ std::string temp = exename;
+ std::replace(temp.begin(), temp.end(), '\\', '/');
+ const std::string installfolder = Path::getPathFromFilename(temp);
+ const std::string filename = installfolder + "cfg/" + fullfilename;
+ fp = fopen(filename.c_str(), "rt");
+ }
+
+ if (fp == NULL)
+ return false;
}
if (doc.LoadFile(fp) != tinyxml2::XML_NO_ERROR)
diff --git a/lib/library.h b/lib/library.h
index 043398edc..146aa51d2 100644
--- a/lib/library.h
+++ b/lib/library.h
@@ -48,6 +48,15 @@ public:
return getid(_dealloc, name);
}
+ /** set allocation id for function */
+ void setalloc(const std::string &functionname, int id) {
+ _alloc[functionname] = id;
+ }
+
+ void setdealloc(const std::string &functionname, int id) {
+ _dealloc[functionname] = id;
+ }
+
/** is allocation type memory? */
static bool ismemory(int id) {
return ((id > 0) && ((id & 1) == 0));
diff --git a/test/testleakautovar.cpp b/test/testleakautovar.cpp
index 2f9d20107..d2945e97a 100644
--- a/test/testleakautovar.cpp
+++ b/test/testleakautovar.cpp
@@ -111,6 +111,13 @@ private:
// Tokenize..
Settings settings;
+ int id = 0;
+ while (!settings.library.ismemory(++id));
+ settings.library.setalloc("malloc",id);
+ settings.library.setdealloc("free",id);
+ while (!settings.library.isresource(++id));
+ settings.library.setalloc("fopen",id);
+ settings.library.setdealloc("fclose",id);
Tokenizer tokenizer(&settings, this);
std::istringstream istr(code);
tokenizer.tokenize(istr, "test.c");