GUI: Add support for project files.
GUI reads per-project settings (automatically deallocated classes) from XML project file. The project file format is described in projectfile.txt. Example project file is added for gui. See also forum discussion at: https://sourceforge.net/apps/phpbb/cppcheck/viewtopic.php?f=3&t=46
This commit is contained in:
parent
a0ba52ccf1
commit
1aafeebe7b
|
@ -0,0 +1,11 @@
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
|
||||||
|
<!-- cppcheck project file -->
|
||||||
|
|
||||||
|
<project version="1">
|
||||||
|
<autodealloc>
|
||||||
|
<class name="AboutDialog"/>
|
||||||
|
<class name="FileViewDialog"/>
|
||||||
|
<class name="ThreadHandler"/>
|
||||||
|
</autodealloc>
|
||||||
|
</project>
|
|
@ -4,6 +4,7 @@
|
||||||
|
|
||||||
TEMPLATE = app
|
TEMPLATE = app
|
||||||
TARGET =
|
TARGET =
|
||||||
|
QT += xml
|
||||||
DEPENDPATH += .
|
DEPENDPATH += .
|
||||||
INCLUDEPATH += .
|
INCLUDEPATH += .
|
||||||
MOC_DIR = temp
|
MOC_DIR = temp
|
||||||
|
@ -27,6 +28,7 @@ HEADERS += mainwindow.h \
|
||||||
aboutdialog.h \
|
aboutdialog.h \
|
||||||
common.h \
|
common.h \
|
||||||
fileviewdialog.h \
|
fileviewdialog.h \
|
||||||
|
projectfile.h \
|
||||||
../src/checkautovariables.h \
|
../src/checkautovariables.h \
|
||||||
../src/checkdangerousfunctions.h \
|
../src/checkdangerousfunctions.h \
|
||||||
../src/checkheaders.h \
|
../src/checkheaders.h \
|
||||||
|
@ -62,6 +64,7 @@ SOURCES += main.cpp \
|
||||||
applicationdialog.cpp \
|
applicationdialog.cpp \
|
||||||
aboutdialog.cpp \
|
aboutdialog.cpp \
|
||||||
fileviewdialog.cpp \
|
fileviewdialog.cpp \
|
||||||
|
projectfile.cpp \
|
||||||
../src/checkautovariables.cpp \
|
../src/checkautovariables.cpp \
|
||||||
../src/checkdangerousfunctions.cpp \
|
../src/checkdangerousfunctions.cpp \
|
||||||
../src/checkmemoryleak.cpp \
|
../src/checkmemoryleak.cpp \
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
#include "aboutdialog.h"
|
#include "aboutdialog.h"
|
||||||
#include "threadhandler.h"
|
#include "threadhandler.h"
|
||||||
#include "fileviewdialog.h"
|
#include "fileviewdialog.h"
|
||||||
|
#include "projectfile.h"
|
||||||
#include "../src/filelister.h"
|
#include "../src/filelister.h"
|
||||||
#include "../src/cppcheckexecutor.h"
|
#include "../src/cppcheckexecutor.h"
|
||||||
|
|
||||||
|
@ -230,6 +231,8 @@ void MainWindow::DoCheckFiles(QFileDialog::FileMode mode)
|
||||||
selected = QFileDialog::getOpenFileNames(this,
|
selected = QFileDialog::getOpenFileNames(this,
|
||||||
tr("Select files to check"),
|
tr("Select files to check"),
|
||||||
mSettings.value(tr("Check path"), "").toString());
|
mSettings.value(tr("Check path"), "").toString());
|
||||||
|
if (selected.isEmpty())
|
||||||
|
mCurrentDirectory.clear();
|
||||||
}
|
}
|
||||||
else if (mode == QFileDialog::DirectoryOnly)
|
else if (mode == QFileDialog::DirectoryOnly)
|
||||||
{
|
{
|
||||||
|
@ -237,7 +240,10 @@ void MainWindow::DoCheckFiles(QFileDialog::FileMode mode)
|
||||||
tr("Select directory to check"),
|
tr("Select directory to check"),
|
||||||
mSettings.value(tr("Check path"), "").toString());
|
mSettings.value(tr("Check path"), "").toString());
|
||||||
if (!dir.isEmpty())
|
if (!dir.isEmpty())
|
||||||
|
{
|
||||||
|
mCurrentDirectory = dir;
|
||||||
selected.append(dir);
|
selected.append(dir);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (selected.count() > 0)
|
if (selected.count() > 0)
|
||||||
|
@ -275,7 +281,9 @@ void MainWindow::DoCheckFiles(QFileDialog::FileMode mode)
|
||||||
EnableCheckButtons(false);
|
EnableCheckButtons(false);
|
||||||
mActionSettings.setEnabled(false);
|
mActionSettings.setEnabled(false);
|
||||||
mResults.SetCheckDirectory(absDirectory);
|
mResults.SetCheckDirectory(absDirectory);
|
||||||
mThread->Check(GetCppcheckSettings(), false);
|
|
||||||
|
Settings checkSettings = GetCppcheckSettings();
|
||||||
|
mThread->Check(checkSettings, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -291,7 +299,30 @@ void MainWindow::CheckDirectory()
|
||||||
|
|
||||||
Settings MainWindow::GetCppcheckSettings()
|
Settings MainWindow::GetCppcheckSettings()
|
||||||
{
|
{
|
||||||
|
ProjectFile pfile;
|
||||||
Settings result;
|
Settings result;
|
||||||
|
|
||||||
|
if (!mCurrentDirectory.isEmpty())
|
||||||
|
{
|
||||||
|
// Format project filename (directory name + .cppcheck) and load
|
||||||
|
// the project file if it is found.
|
||||||
|
QStringList parts = mCurrentDirectory.split("/");
|
||||||
|
QString projfile = parts[parts.count() - 1] + ".cppcheck";
|
||||||
|
bool projectRead = false;
|
||||||
|
if (QFile::exists(projfile))
|
||||||
|
projectRead = pfile.Read(mCurrentDirectory + "/" + projfile);
|
||||||
|
|
||||||
|
if (projectRead)
|
||||||
|
{
|
||||||
|
QStringList classes = pfile.GetDeAllocatedClasses();
|
||||||
|
QString classname;
|
||||||
|
foreach(classname, classes)
|
||||||
|
{
|
||||||
|
result.addAutoAllocClass(classname.toStdString());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
result._debug = false;
|
result._debug = false;
|
||||||
result._showAll = true;
|
result._showAll = true;
|
||||||
result._checkCodingStyle = true;
|
result._checkCodingStyle = true;
|
||||||
|
|
|
@ -197,7 +197,7 @@ protected:
|
||||||
QStringList GetFilesRecursively(const QString &path);
|
QStringList GetFilesRecursively(const QString &path);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Get our default cppcheck settings
|
* @brief Get our default cppcheck settings and read project file.
|
||||||
*
|
*
|
||||||
* @return Default cppcheck settings
|
* @return Default cppcheck settings
|
||||||
*/
|
*/
|
||||||
|
@ -368,6 +368,11 @@ protected:
|
||||||
ApplicationList mApplications;
|
ApplicationList mApplications;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Current checked directory.
|
||||||
|
*/
|
||||||
|
QString mCurrentDirectory;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // MAINWINDOW_H
|
#endif // MAINWINDOW_H
|
||||||
|
|
|
@ -0,0 +1,106 @@
|
||||||
|
/*
|
||||||
|
* Cppcheck - A tool for static C/C++ code analysis
|
||||||
|
* Copyright (C) 2007-2009 Daniel Marjamäki and Cppcheck team.
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QString>
|
||||||
|
#include <QXmlStreamReader>
|
||||||
|
#include <QFile>
|
||||||
|
#include "projectfile.h"
|
||||||
|
|
||||||
|
static const char ProjectElementName[] = "project";
|
||||||
|
static const char AllocElementName[] = "autodealloc";
|
||||||
|
static const char ClassElementName[] = "class";
|
||||||
|
static const char ClassNameAttrib[] = "name";
|
||||||
|
|
||||||
|
ProjectFile::ProjectFile(QObject *parent) :
|
||||||
|
QObject(parent)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
ProjectFile::ProjectFile(const QString &filename, QObject *parent) :
|
||||||
|
QObject(parent),
|
||||||
|
mFilename(filename)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ProjectFile::Read(const QString &filename)
|
||||||
|
{
|
||||||
|
if (!filename.isEmpty())
|
||||||
|
mFilename = filename;
|
||||||
|
|
||||||
|
QFile file(mFilename);
|
||||||
|
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
QXmlStreamReader xmlReader(&file);
|
||||||
|
bool insideProject = false;
|
||||||
|
while (!xmlReader.atEnd())
|
||||||
|
{
|
||||||
|
switch (xmlReader.readNext())
|
||||||
|
{
|
||||||
|
case QXmlStreamReader::StartElement:
|
||||||
|
if (xmlReader.name() == ProjectElementName)
|
||||||
|
insideProject = true;
|
||||||
|
if (insideProject && xmlReader.name() == AllocElementName)
|
||||||
|
ReadAutoAllocClasses(xmlReader);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case QXmlStreamReader::EndElement:
|
||||||
|
if (xmlReader.name() == ProjectElementName)
|
||||||
|
insideProject = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
file.close();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList ProjectFile::GetDeAllocatedClasses() const
|
||||||
|
{
|
||||||
|
return mDeAllocatedClasses;
|
||||||
|
}
|
||||||
|
|
||||||
|
void ProjectFile::ReadAutoAllocClasses(QXmlStreamReader &reader)
|
||||||
|
{
|
||||||
|
QXmlStreamReader::TokenType type;
|
||||||
|
bool allRead = false;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
type = reader.readNext();
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case QXmlStreamReader::StartElement:
|
||||||
|
if (reader.name().toString() == ClassElementName)
|
||||||
|
{
|
||||||
|
QXmlStreamAttributes attribs = reader.attributes();
|
||||||
|
QString name = attribs.value("", ClassNameAttrib).toString();
|
||||||
|
if (!name.isEmpty())
|
||||||
|
mDeAllocatedClasses << name;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case QXmlStreamReader::EndElement:
|
||||||
|
if (reader.name().toString() == AllocElementName)
|
||||||
|
allRead = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
while (!allRead);
|
||||||
|
}
|
|
@ -0,0 +1,63 @@
|
||||||
|
/*
|
||||||
|
* Cppcheck - A tool for static C/C++ code analysis
|
||||||
|
* Copyright (C) 2007-2009 Daniel Marjamäki and Cppcheck team.
|
||||||
|
*
|
||||||
|
* This program is free software: you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation, either version 3 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <QObject>
|
||||||
|
#include <QString>
|
||||||
|
#include <QStringList>
|
||||||
|
#include <QXmlStreamReader>
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief A class that reads and writes (TODO) project files.
|
||||||
|
* The project files contain project-specific settings for checking. For
|
||||||
|
* example a list of automatically deallocated classes.
|
||||||
|
*/
|
||||||
|
class ProjectFile : public QObject
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
ProjectFile(QObject *parent = 0);
|
||||||
|
ProjectFile(const QString &filename, QObject *parent = 0);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Read the project file.
|
||||||
|
* @param filename Filename (can be also given to constructor).
|
||||||
|
*/
|
||||||
|
bool Read(const QString &filename = QString());
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get list of automatically deallocated classes.
|
||||||
|
* @return list of classes.
|
||||||
|
*/
|
||||||
|
QStringList GetDeAllocatedClasses() const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void ReadAutoAllocClasses(QXmlStreamReader &reader);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Filename (+path) of the project file.
|
||||||
|
*/
|
||||||
|
QString mFilename;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief List of automatically deallocated classes.
|
||||||
|
*/
|
||||||
|
QStringList mDeAllocatedClasses;
|
||||||
|
};
|
|
@ -0,0 +1,27 @@
|
||||||
|
Project files
|
||||||
|
-------------
|
||||||
|
|
||||||
|
cppcheck GUI handles per-project settings in project files instead of global
|
||||||
|
program settings. This allows customizing cppcheck for each project's needs.
|
||||||
|
|
||||||
|
Currently there is no GUI to edit the project file. The cppcheck automatically
|
||||||
|
loads a project file which has same name than selected directory and extension
|
||||||
|
".cppcheck". For example in "gui"-directory cppcheck loads "gui.cppcheck"
|
||||||
|
project file.
|
||||||
|
|
||||||
|
The project file is simple XML file easy to edit with your favourite editor
|
||||||
|
program. The format is:
|
||||||
|
|
||||||
|
<?xml version="1.0"?>
|
||||||
|
<project version="1">
|
||||||
|
<autodealloc>
|
||||||
|
<class name="MyClass"/>
|
||||||
|
<class name="MyClass2"/>
|
||||||
|
</autodealloc>
|
||||||
|
<includedir>
|
||||||
|
<dir name="c:/projects/framework/" />
|
||||||
|
<dir name="c:/Program Files/Visual Studio 8/VC/include/" />
|
||||||
|
</includedir>
|
||||||
|
</project>
|
||||||
|
|
||||||
|
See also gui.cppcheck file in gui-directory of cppcheck sources.
|
|
@ -55,6 +55,10 @@ void Settings::autoDealloc(std::istream &istr)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Settings::addAutoAllocClass(const std::string &name)
|
||||||
|
{
|
||||||
|
_autoDealloc.push_back(name);
|
||||||
|
}
|
||||||
|
|
||||||
bool Settings::isAutoDealloc(const char classname[]) const
|
bool Settings::isAutoDealloc(const char classname[]) const
|
||||||
{
|
{
|
||||||
|
|
|
@ -67,6 +67,9 @@ public:
|
||||||
/** Fill list of automaticly deallocated classes */
|
/** Fill list of automaticly deallocated classes */
|
||||||
void autoDealloc(std::istream &istr);
|
void autoDealloc(std::istream &istr);
|
||||||
|
|
||||||
|
/** Add class to list of automatically deallocated classes */
|
||||||
|
void addAutoAllocClass(const std::string &name);
|
||||||
|
|
||||||
/** is a class automaticly deallocated? */
|
/** is a class automaticly deallocated? */
|
||||||
bool isAutoDealloc(const char classname[]) const;
|
bool isAutoDealloc(const char classname[]) const;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue