cppcheck-verify: changed it into a Qt project
This commit is contained in:
parent
b0bb71ee20
commit
d3dcb5ab1c
|
@ -1,15 +0,0 @@
|
||||||
FILES = ../lib/errorlogger.cpp \
|
|
||||||
../lib/filelister.cpp \
|
|
||||||
../lib/filelister_win32.cpp \
|
|
||||||
../lib/filelister_unix.cpp \
|
|
||||||
../lib/mathlib.cpp \
|
|
||||||
../lib/path.cpp \
|
|
||||||
../lib/preprocessor.cpp \
|
|
||||||
../lib/settings.cpp \
|
|
||||||
../lib/token.cpp \
|
|
||||||
../lib/tokenize.cpp
|
|
||||||
|
|
||||||
HDRS = $(FILES:%.cpp=%.h)
|
|
||||||
|
|
||||||
cppcheck-verify: main.cpp $(FILES) $(HDRS)
|
|
||||||
g++ -Wall -I../lib -o cppcheck-verify main.cpp $(FILES)
|
|
|
@ -0,0 +1,31 @@
|
||||||
|
TARGET = cppcheck-verify
|
||||||
|
TEMPLATE = app
|
||||||
|
INCLUDEPATH += ../lib
|
||||||
|
|
||||||
|
SOURCES += main.cpp \
|
||||||
|
mainwindow.cpp \
|
||||||
|
../lib/tokenize.cpp \
|
||||||
|
../lib/token.cpp \
|
||||||
|
../lib/settings.cpp \
|
||||||
|
../lib/preprocessor.cpp \
|
||||||
|
../lib/path.cpp \
|
||||||
|
../lib/mathlib.cpp \
|
||||||
|
../lib/filelister_win32.cpp \
|
||||||
|
../lib/filelister_unix.cpp \
|
||||||
|
../lib/filelister.cpp \
|
||||||
|
../lib/errorlogger.cpp
|
||||||
|
|
||||||
|
HEADERS += mainwindow.h \
|
||||||
|
../lib/tokenize.h \
|
||||||
|
../lib/token.h \
|
||||||
|
../lib/settings.h \
|
||||||
|
../lib/preprocessor.h \
|
||||||
|
../lib/path.h \
|
||||||
|
../lib/mathlib.h \
|
||||||
|
../lib/filelister_win32.h \
|
||||||
|
../lib/filelister_unix.h \
|
||||||
|
../lib/filelister.h \
|
||||||
|
../lib/errorlogger.h
|
||||||
|
|
||||||
|
FORMS += mainwindow.ui
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/*
|
/*
|
||||||
* Cppcheck - A tool for static C/C++ code analysis
|
* Cppcheck - A tool for static C/C++ code analysis
|
||||||
* Copyright (C) 2007-2010 Daniel Marjamäki and Cppcheck team.
|
* Copyright (C) 2007-2010 Daniel Marjamäki and Cppcheck team.
|
||||||
*
|
*
|
||||||
* This program is free software: you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -16,80 +16,13 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "preprocessor.h"
|
#include <QtGui/QApplication>
|
||||||
#include "tokenize.h"
|
#include "mainwindow.h"
|
||||||
|
|
||||||
#include <fstream>
|
int main(int argc, char *argv[])
|
||||||
#include <iostream>
|
|
||||||
#include <sstream>
|
|
||||||
#include <string>
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Check that array indexes are within bounds
|
|
||||||
* 1. Locate array access through: [ .. ]
|
|
||||||
* 2. Try to determine if index is within bounds.
|
|
||||||
* 3. If it fails to determine that the index is within bounds then write warning
|
|
||||||
* \param tokenizer The tokenizer
|
|
||||||
* \param errout output stream to write warnings to
|
|
||||||
*/
|
|
||||||
|
|
||||||
static void arrayIndex(const Tokenizer &tokenizer, std::ostream &errout)
|
|
||||||
{
|
{
|
||||||
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())
|
QApplication a(argc, argv);
|
||||||
{
|
MainWindow w;
|
||||||
// 1. Locate array access through: [ .. ]
|
w.show();
|
||||||
if (tok->str() == "[")
|
return a.exec();
|
||||||
{
|
|
||||||
// 2. try to determine if the array index is within bounds
|
|
||||||
|
|
||||||
// array declaration
|
|
||||||
if (Token::simpleMatch(tok, "[ ]"))
|
|
||||||
continue;
|
|
||||||
if (Token::Match(tok->tokAt(-2), "%type% %var% [ %num% ] ;|="))
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// 3. If it fails to determine that the index is within bounds then write warning
|
|
||||||
errout << tokenizer.fileLine(tok)
|
|
||||||
<< " failed to determine if given array index is within bounds"
|
|
||||||
<< std::endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, const char *argv[])
|
|
||||||
{
|
|
||||||
if (argc != 2)
|
|
||||||
{
|
|
||||||
std::cerr << "syntax: cppcheck-verify file.cpp" << std::endl;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
const std::string fileName = argv[1];
|
|
||||||
|
|
||||||
Tokenizer tokenizer;
|
|
||||||
|
|
||||||
{
|
|
||||||
// Preprocess the file..
|
|
||||||
Preprocessor preprocessor;
|
|
||||||
std::ifstream fin(fileName.c_str());
|
|
||||||
std::string filedata;
|
|
||||||
std::list<std::string> configurations;
|
|
||||||
std::list<std::string> includePaths;
|
|
||||||
preprocessor.preprocess(fin,
|
|
||||||
filedata,
|
|
||||||
configurations,
|
|
||||||
fileName,
|
|
||||||
includePaths);
|
|
||||||
filedata = Preprocessor::getcode(filedata, "", fileName, NULL);
|
|
||||||
|
|
||||||
// Tokenize the preprocessed code..
|
|
||||||
std::istringstream istr(filedata);
|
|
||||||
tokenizer.tokenize(istr, fileName.c_str(), "");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check the tokens..
|
|
||||||
arrayIndex(tokenizer, std::cerr);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,140 @@
|
||||||
|
/*
|
||||||
|
* Cppcheck - A tool for static C/C++ code analysis
|
||||||
|
* Copyright (C) 2007-2010 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 "mainwindow.h"
|
||||||
|
#include "ui_mainwindow.h"
|
||||||
|
|
||||||
|
#include "preprocessor.h"
|
||||||
|
#include "tokenize.h"
|
||||||
|
|
||||||
|
#include <fstream>
|
||||||
|
#include <iostream>
|
||||||
|
#include <sstream>
|
||||||
|
#include <string>
|
||||||
|
#include <set>
|
||||||
|
|
||||||
|
static void arrayIndex(const Tokenizer &tokenizer, std::set<unsigned int> &errorlines);
|
||||||
|
|
||||||
|
static unsigned char readChar(std::istream &istr)
|
||||||
|
{
|
||||||
|
unsigned char ch = (unsigned char)istr.get();
|
||||||
|
|
||||||
|
// Handling of newlines..
|
||||||
|
if (ch == '\r')
|
||||||
|
{
|
||||||
|
ch = '\n';
|
||||||
|
if ((char)istr.peek() == '\n')
|
||||||
|
(void)istr.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
return ch;
|
||||||
|
}
|
||||||
|
|
||||||
|
MainWindow::MainWindow(QWidget *parent)
|
||||||
|
: QMainWindow(parent), ui(new Ui::MainWindow)
|
||||||
|
{
|
||||||
|
ui->setupUi(this);
|
||||||
|
|
||||||
|
const std::string fileName("../lib/tokenize.cpp");
|
||||||
|
|
||||||
|
setWindowTitle(fileName.c_str());
|
||||||
|
|
||||||
|
Tokenizer tokenizer;
|
||||||
|
|
||||||
|
{
|
||||||
|
// Preprocess the file..
|
||||||
|
Preprocessor preprocessor;
|
||||||
|
std::ifstream fin(fileName.c_str());
|
||||||
|
std::string filedata;
|
||||||
|
std::list<std::string> configurations;
|
||||||
|
std::list<std::string> includePaths;
|
||||||
|
preprocessor.preprocess(fin,
|
||||||
|
filedata,
|
||||||
|
configurations,
|
||||||
|
fileName,
|
||||||
|
includePaths);
|
||||||
|
filedata = Preprocessor::getcode(filedata, "", fileName, NULL, NULL);
|
||||||
|
|
||||||
|
// Tokenize the preprocessed code..
|
||||||
|
std::istringstream istr(filedata);
|
||||||
|
tokenizer.tokenize(istr, fileName.c_str(), "");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check the tokens..
|
||||||
|
std::set<unsigned int> errorlines;
|
||||||
|
arrayIndex(tokenizer, errorlines);
|
||||||
|
|
||||||
|
// show report..
|
||||||
|
{
|
||||||
|
std::ostringstream report;
|
||||||
|
report << std::string(8,' ');
|
||||||
|
unsigned int lineno = 1;
|
||||||
|
std::ifstream fin(fileName.c_str());
|
||||||
|
for (unsigned char c = readChar(fin); fin.good(); c = readChar(fin))
|
||||||
|
{
|
||||||
|
report << c;
|
||||||
|
if (c == '\n')
|
||||||
|
{
|
||||||
|
++lineno;
|
||||||
|
if (errorlines.find(lineno) != errorlines.end())
|
||||||
|
report << std::string(6,'!') << " ";
|
||||||
|
else
|
||||||
|
report << std::string(8,' ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ui->plainTextEdit->setPlainText(QString::fromStdString(report.str()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
MainWindow::~MainWindow()
|
||||||
|
{
|
||||||
|
delete ui;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check that array indexes are within bounds
|
||||||
|
* 1. Locate array access through: [ .. ]
|
||||||
|
* 2. Try to determine if index is within bounds.
|
||||||
|
* 3. If it fails to determine that the index is within bounds then write warning
|
||||||
|
* \param tokenizer The tokenizer
|
||||||
|
* \param errout output stream to write warnings to
|
||||||
|
*/
|
||||||
|
|
||||||
|
static void arrayIndex(const Tokenizer &tokenizer, std::set<unsigned int> &errorlines)
|
||||||
|
{
|
||||||
|
for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next())
|
||||||
|
{
|
||||||
|
// 1. Locate array access through: [ .. ]
|
||||||
|
if (tok->fileIndex() == 0 && tok->str() == "[")
|
||||||
|
{
|
||||||
|
// 2. try to determine if the array index is within bounds
|
||||||
|
|
||||||
|
// array declaration
|
||||||
|
if (Token::simpleMatch(tok, "[ ]"))
|
||||||
|
continue;
|
||||||
|
if (Token::Match(tok->tokAt(-2), "%type% %var% [ %num% ] ;|="))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// 3. If it fails to determine that the index is within bounds then write warning
|
||||||
|
errorlines.insert(tok->linenr());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,41 @@
|
||||||
|
/*
|
||||||
|
* Cppcheck - A tool for static C/C++ code analysis
|
||||||
|
* Copyright (C) 2007-2010 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef MAINWINDOW_H
|
||||||
|
#define MAINWINDOW_H
|
||||||
|
|
||||||
|
#include <QtGui/QMainWindow>
|
||||||
|
|
||||||
|
namespace Ui
|
||||||
|
{
|
||||||
|
class MainWindow;
|
||||||
|
}
|
||||||
|
|
||||||
|
class MainWindow : public QMainWindow
|
||||||
|
{
|
||||||
|
Q_OBJECT
|
||||||
|
|
||||||
|
public:
|
||||||
|
MainWindow(QWidget *parent = 0);
|
||||||
|
~MainWindow();
|
||||||
|
|
||||||
|
private:
|
||||||
|
Ui::MainWindow *ui;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // MAINWINDOW_H
|
|
@ -0,0 +1,50 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<ui version="4.0">
|
||||||
|
<class>MainWindow</class>
|
||||||
|
<widget class="QMainWindow" name="MainWindow">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>600</width>
|
||||||
|
<height>400</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
<property name="windowTitle">
|
||||||
|
<string>Cppcheck-Verify</string>
|
||||||
|
</property>
|
||||||
|
<widget class="QWidget" name="centralWidget">
|
||||||
|
<layout class="QVBoxLayout" name="verticalLayout">
|
||||||
|
<item>
|
||||||
|
<widget class="QPlainTextEdit" name="plainTextEdit">
|
||||||
|
<property name="plainText">
|
||||||
|
<string>ab</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</widget>
|
||||||
|
<widget class="QMenuBar" name="menuBar">
|
||||||
|
<property name="geometry">
|
||||||
|
<rect>
|
||||||
|
<x>0</x>
|
||||||
|
<y>0</y>
|
||||||
|
<width>600</width>
|
||||||
|
<height>25</height>
|
||||||
|
</rect>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
<widget class="QToolBar" name="mainToolBar">
|
||||||
|
<attribute name="toolBarArea">
|
||||||
|
<enum>TopToolBarArea</enum>
|
||||||
|
</attribute>
|
||||||
|
<attribute name="toolBarBreak">
|
||||||
|
<bool>false</bool>
|
||||||
|
</attribute>
|
||||||
|
</widget>
|
||||||
|
<widget class="QStatusBar" name="statusBar"/>
|
||||||
|
</widget>
|
||||||
|
<layoutdefault spacing="6" margin="11"/>
|
||||||
|
<resources/>
|
||||||
|
<connections/>
|
||||||
|
</ui>
|
Loading…
Reference in New Issue