1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154
|
/* -*- C++ -*-
* Cppcheck - A tool for static C/C++ code analysis
* Copyright (C) 2007-2025 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 CHECKTHREAD_H
#define CHECKTHREAD_H
#include "filesettings.h"
#include "settings.h"
#include "suppressions.h"
#include <atomic>
#include <cstdint>
#include <list>
#include <memory>
#include <string>
#include <vector>
#include <QList>
#include <QObject>
#include <QString>
#include <QStringList>
#include <QThread>
class ThreadResult;
/// @addtogroup GUI
/// @{
/**
* @brief Thread to run cppcheck
*
*/
class CheckThread : public QThread {
Q_OBJECT
public:
explicit CheckThread(ThreadResult &result);
/**
* @brief Set settings for cppcheck
*
* @param settings settings for cppcheck
* @param supprs suppressions for cppcheck
*/
void setSettings(const Settings &settings, std::shared_ptr<Suppressions> supprs);
/**
* @brief Run whole program analysis
* @param files All files
* @param ctuInfo Ctu info for addons
*/
void analyseWholeProgram(const std::list<FileWithDetails> &files, const std::string& ctuInfo);
void setAddonsAndTools(const QStringList &addonsAndTools) {
mAddonsAndTools = addonsAndTools;
}
void setClangIncludePaths(const QStringList &s) {
mClangIncludePaths = s;
}
void setSuppressions(const QList<SuppressionList::Suppression> &s) {
mSuppressionsUi = s;
}
/**
* @brief method that is run in a thread
*
*/
void run() override;
void stop();
/**
* Determine command to run clang
* \return Command to run clang, empty if it is not found
*/
static QString clangCmd();
/**
* Determine command to run clang-tidy
* \return Command to run clang-tidy, empty if it is not found
*/
static QString clangTidyCmd();
static int executeCommand(std::string exe, std::vector<std::string> args, std::string redirect, std::string &output);
signals:
/**
* @brief cpp checking is done
*
*/
void done();
// NOLINTNEXTLINE(readability-inconsistent-declaration-parameter-name) - caused by generated MOC code
void fileChecked(const QString &file);
protected:
/**
* @brief States for the check thread.
* Whole purpose of these states is to allow stopping of the checking. When
* stopping we say for the thread (Stopping) that stop when current check
* has been completed. Thread must be stopped cleanly, just terminating thread
* likely causes unpredictable side-effects.
*/
enum State : std::uint8_t {
Running, /**< The thread is checking. */
Stopping, /**< The thread will stop after current work. */
Stopped, /**< The thread has been stopped. */
Ready, /**< The thread is ready. */
};
/**
* @brief Thread's current execution state. Can be changed from outside
*/
std::atomic<State> mState{Ready};
ThreadResult &mResult;
Settings mSettings;
std::shared_ptr<Suppressions> mSuppressions;
private:
void runAddonsAndTools(const Settings& settings, const FileSettings *fileSettings, const QString &fileName);
void parseClangErrors(const QString &tool, const QString &file0, QString err);
bool isSuppressed(const SuppressionList::ErrorMessage &errorMessage) const;
std::list<FileWithDetails> mFiles;
bool mAnalyseWholeProgram{};
std::string mCtuInfo;
QStringList mAddonsAndTools;
QStringList mClangIncludePaths;
QList<SuppressionList::Suppression> mSuppressionsUi;
};
/// @}
#endif // CHECKTHREAD_H
|