forked from danmar/cppcheck
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcppcheckexecutor.h
196 lines (167 loc) · 5.63 KB
/
cppcheckexecutor.h
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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
/*
* Cppcheck - A tool for static C/C++ code analysis
* Copyright (C) 2007-2019 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 CPPCHECKEXECUTOR_H
#define CPPCHECKEXECUTOR_H
#include "errorlogger.h"
#include <cstdio>
#include <ctime>
#include <map>
#include <set>
#include <string>
class CppCheck;
class Library;
class Settings;
/**
* This class works as an example of how CppCheck can be used in external
* programs without very little knowledge of the internal parts of the
* program itself. If you wish to use cppcheck e.g. as a part of IDE,
* just rewrite this class for your needs and possibly use other methods
* from CppCheck class instead the ones used here.
*/
class CppCheckExecutor : public ErrorLogger {
public:
/**
* Constructor
*/
CppCheckExecutor();
/**
* Destructor
*/
~CppCheckExecutor() OVERRIDE;
/**
* Starts the checking.
*
* @param argc from main()
* @param argv from main()
* @return EXIT_FAILURE if arguments are invalid or no input files
* were found.
* If errors are found and --error-exitcode is used,
* given value is returned instead of default 0.
* If no errors are found, 0 is returned.
*/
int check(int argc, const char* const argv[]);
/**
* Information about progress is directed here. This should be
* called by the CppCheck class only.
*
* @param outmsg Progress message e.g. "Checking main.cpp..."
*/
void reportOut(const std::string &outmsg) OVERRIDE;
/** xml output of errors */
void reportErr(const ErrorLogger::ErrorMessage &msg) OVERRIDE;
void reportProgress(const std::string &filename, const char stage[], const std::size_t value) OVERRIDE;
/**
* Output information messages.
*/
void reportInfo(const ErrorLogger::ErrorMessage &msg) OVERRIDE;
/**
* Information about how many files have been checked
*
* @param fileindex This many files have been checked.
* @param filecount This many files there are in total.
* @param sizedone The sum of sizes of the files checked.
* @param sizetotal The total sizes of the files.
*/
static void reportStatus(std::size_t fileindex, std::size_t filecount, std::size_t sizedone, std::size_t sizetotal);
/**
* @param exception_output Output file
*/
static void setExceptionOutput(FILE* exceptionOutput);
/**
* @return file name to be used for output from exception handler. Has to be either "stdout" or "stderr".
*/
static FILE* getExceptionOutput();
/**
* Tries to load a library and prints warning/error messages
* @return false, if an error occurred (except unknown XML elements)
*/
static bool tryLoadLibrary(Library& destination, const char* basepath, const char* filename);
protected:
/**
* Helper function to print out errors. Appends a line change.
* @param errmsg String printed to error stream
*/
void reportErr(const std::string &errmsg);
/**
* @brief Parse command line args and get settings and file lists
* from there.
*
* @param cppcheck cppcheck instance
* @param argc argc from main()
* @param argv argv from main()
* @return false when errors are found in the input
*/
bool parseFromArgs(CppCheck *cppcheck, int argc, const char* const argv[]);
/**
* Helper function to supply settings. This can be used for testing.
* @param settings Reference to an Settings instance
*/
void setSettings(const Settings &settings);
private:
/**
* Wrapper around check_internal
* - installs optional platform dependent signal handling
*
* @param cppcheck cppcheck instance
* @param argc from main()
* @param argv from main()
**/
int check_wrapper(CppCheck& cppcheck, int argc, const char* const argv[]);
/**
* Starts the checking.
*
* @param cppcheck cppcheck instance
* @param argc from main()
* @param argv from main()
* @return EXIT_FAILURE if arguments are invalid or no input files
* were found.
* If errors are found and --error-exitcode is used,
* given value is returned instead of default 0.
* If no errors are found, 0 is returned.
*/
int check_internal(CppCheck& cppcheck, int argc, const char* const argv[]);
/**
* Pointer to current settings; set while check() is running.
*/
const Settings* mSettings;
/**
* Used to filter out duplicate error messages.
*/
std::set<std::string> mShownErrors;
/**
* Filename associated with size of file
*/
std::map<std::string, std::size_t> mFiles;
/**
* Report progress time
*/
std::time_t mLatestProgressOutputTime;
/**
* Output file name for exception handler
*/
static FILE* mExceptionOutput;
/**
* Error output
*/
std::ofstream *mErrorOutput;
/**
* Has --errorlist been given?
*/
bool mShowAllErrors;
};
#endif // CPPCHECKEXECUTOR_H