Skip to content

Commit f6b410b

Browse files
committed
GUI: add setting for 'checkHeaders', 'checkUnusedTemplates' and 'maxCtuDepth' to project
1 parent 466caab commit f6b410b

9 files changed

Lines changed: 165 additions & 33 deletions

cli/cmdlineparser.cpp

Lines changed: 0 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -158,16 +158,6 @@ bool CmdLineParser::parseFromArgs(int argc, const char* const argv[])
158158
else if (std::strcmp(argv[i], "--dump") == 0)
159159
mSettings->dump = true;
160160

161-
// TODO: These options are about removing code. Instead of having lots of different options
162-
// can we create one option that is customizable somehow.
163-
// --check-headers=no
164-
else if (std::strcmp(argv[i], "--check-headers=no") == 0)
165-
mSettings->checkHeaders = false;
166-
else if (std::strcmp(argv[i], "--remove-unused-templates") == 0)
167-
mSettings->removeUnusedTemplates = true;
168-
else if (std::strcmp(argv[i], "--remove-unused-included-templates") == 0)
169-
mSettings->removeUnusedIncludedTemplates = true;
170-
171161
// max ctu depth
172162
else if (std::strncmp(argv[i], "--max-ctu-depth=", 16) == 0)
173163
mSettings->maxCtuDepth = std::atoi(argv[i] + 16);
@@ -931,8 +921,6 @@ void CmdLineParser::printHelp()
931921
" incremental analysis, distributed analysis.\n"
932922
" --check-config Check cppcheck configuration. The normal code\n"
933923
" analysis is disabled by this flag.\n"
934-
" --check-headers=no Turn off checking of included files, to make the\n"
935-
" analysis faster.\n"
936924
" --check-library Show information messages when library files have\n"
937925
" incomplete info.\n"
938926
" --config-exclude=<dir>\n"
@@ -1088,10 +1076,6 @@ void CmdLineParser::printHelp()
10881076
" using e.g. ~ for home folder does not work. It is\n"
10891077
" currently only possible to apply the base paths to\n"
10901078
" files that are on a lower level in the directory tree.\n"
1091-
" --remove-unused-templates\n"
1092-
" Remove unused templates.\n"
1093-
" --remove-unused-included-templates\n"
1094-
" Remove unused templates in included files.\n"
10951079
" --report-progress Report progress messages while checking a file.\n"
10961080
#ifdef HAVE_RULES
10971081
" --rule=<rule> Match regular expression.\n"

gui/mainwindow.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -892,6 +892,10 @@ Settings MainWindow::getCppcheckSettings()
892892
}
893893
}
894894
}
895+
896+
result.maxCtuDepth = mProjectFile->getMaxCtuDepth();
897+
result.checkHeaders = mProjectFile->getCheckHeaders();
898+
result.checkUnusedTemplates = mProjectFile->getCheckUnusedTemplates();
895899
}
896900

897901
// Include directories (and files) are searched in listed order.

gui/projectfile.cpp

Lines changed: 58 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,9 @@ static const char ToolElementName[] = "tool";
6161
static const char ToolsElementName[] = "tools";
6262
static const char TagsElementName[] = "tags";
6363
static const char TagElementName[] = "tag";
64+
static constexpr char CheckHeadersElementName[] = "check-headers";
65+
static constexpr char CheckUnusedTemplatesElementName[] = "check-unused-templates";
66+
static constexpr char MaxCtuDepthElementName[] = "max-ctu-depth";
6467

6568
ProjectFile::ProjectFile(QObject *parent) :
6669
QObject(parent)
@@ -92,6 +95,10 @@ void ProjectFile::clear()
9295
mSuppressions.clear();
9396
mAddons.clear();
9497
mClangAnalyzer = mClangTidy = false;
98+
mAnalyzeAllVsConfigs = false;
99+
mCheckHeaders = true;
100+
mCheckUnusedTemplates = false;
101+
mMaxCtuDepth = 10;
95102
}
96103

97104
bool ProjectFile::read(const QString &filename)
@@ -131,7 +138,13 @@ bool ProjectFile::read(const QString &filename)
131138
readImportProject(xmlReader);
132139

133140
if (insideProject && xmlReader.name() == AnalyzeAllVsConfigsElementName)
134-
readAnalyzeAllVsConfigs(xmlReader);
141+
mAnalyzeAllVsConfigs = readBool(xmlReader);
142+
143+
if (insideProject && xmlReader.name() == CheckHeadersElementName)
144+
mCheckHeaders = readBool(xmlReader);
145+
146+
if (insideProject && xmlReader.name() == CheckUnusedTemplatesElementName)
147+
mCheckUnusedTemplates = readBool(xmlReader);
135148

136149
// Find include directory from inside project element
137150
if (insideProject && xmlReader.name() == IncludeDirElementName)
@@ -180,6 +193,9 @@ bool ProjectFile::read(const QString &filename)
180193
if (insideProject && xmlReader.name() == TagsElementName)
181194
readStringList(mTags, xmlReader, TagElementName);
182195

196+
if (insideProject && xmlReader.name() == MaxCtuDepthElementName)
197+
mMaxCtuDepth = readInt(xmlReader, mMaxCtuDepth);
198+
183199
break;
184200

185201
case QXmlStreamReader::EndElement:
@@ -263,15 +279,41 @@ void ProjectFile::readImportProject(QXmlStreamReader &reader)
263279
} while (1);
264280
}
265281

266-
void ProjectFile::readAnalyzeAllVsConfigs(QXmlStreamReader &reader)
282+
bool ProjectFile::readBool(QXmlStreamReader &reader)
267283
{
284+
bool ret = false;
268285
do {
269286
const QXmlStreamReader::TokenType type = reader.readNext();
270287
switch (type) {
271288
case QXmlStreamReader::Characters:
272-
mAnalyzeAllVsConfigs = (reader.text().toString() == "true");
289+
ret = (reader.text().toString() == "true");
273290
case QXmlStreamReader::EndElement:
274-
return;
291+
return ret;
292+
// Not handled
293+
case QXmlStreamReader::StartElement:
294+
case QXmlStreamReader::NoToken:
295+
case QXmlStreamReader::Invalid:
296+
case QXmlStreamReader::StartDocument:
297+
case QXmlStreamReader::EndDocument:
298+
case QXmlStreamReader::Comment:
299+
case QXmlStreamReader::DTD:
300+
case QXmlStreamReader::EntityReference:
301+
case QXmlStreamReader::ProcessingInstruction:
302+
break;
303+
}
304+
} while (1);
305+
}
306+
307+
int ProjectFile::readInt(QXmlStreamReader &reader, int defaultValue)
308+
{
309+
int ret = defaultValue;
310+
do {
311+
const QXmlStreamReader::TokenType type = reader.readNext();
312+
switch (type) {
313+
case QXmlStreamReader::Characters:
314+
ret = reader.text().toString().toInt();
315+
case QXmlStreamReader::EndElement:
316+
return ret;
275317
// Not handled
276318
case QXmlStreamReader::StartElement:
277319
case QXmlStreamReader::NoToken:
@@ -642,6 +684,18 @@ bool ProjectFile::write(const QString &filename)
642684
xmlWriter.writeCharacters(mAnalyzeAllVsConfigs ? "true" : "false");
643685
xmlWriter.writeEndElement();
644686

687+
xmlWriter.writeStartElement(CheckHeadersElementName);
688+
xmlWriter.writeCharacters(mCheckHeaders ? "true" : "false");
689+
xmlWriter.writeEndElement();
690+
691+
xmlWriter.writeStartElement(CheckUnusedTemplatesElementName);
692+
xmlWriter.writeCharacters(mCheckUnusedTemplates ? "true" : "false");
693+
xmlWriter.writeEndElement();
694+
695+
xmlWriter.writeStartElement(MaxCtuDepthElementName);
696+
xmlWriter.writeCharacters(QString::number(mMaxCtuDepth));
697+
xmlWriter.writeEndElement();
698+
645699
if (!mIncludeDirs.isEmpty()) {
646700
xmlWriter.writeStartElement(IncludeDirElementName);
647701
foreach (QString incdir, mIncludeDirs) {

gui/projectfile.h

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,22 @@ class ProjectFile : public QObject {
6868
return mAnalyzeAllVsConfigs;
6969
}
7070

71+
bool getCheckHeaders() const {
72+
return mCheckHeaders;
73+
}
74+
75+
void setCheckHeaders(bool b) {
76+
mCheckHeaders = b;
77+
}
78+
79+
bool getCheckUnusedTemplates() const {
80+
return mCheckUnusedTemplates;
81+
}
82+
83+
void setCheckUnusedTemplates(bool b) {
84+
mCheckUnusedTemplates = b;
85+
}
86+
7187
/**
7288
* @brief Get list of include directories.
7389
* @return list of directories.
@@ -166,6 +182,14 @@ class ProjectFile : public QObject {
166182
return mTags;
167183
}
168184

185+
int getMaxCtuDepth() const {
186+
return mMaxCtuDepth;
187+
}
188+
189+
void setMaxCtuDepth(int maxCtuDepth) {
190+
mMaxCtuDepth = maxCtuDepth;
191+
}
192+
169193
/**
170194
* @brief Get filename for the project file.
171195
* @return file name.
@@ -286,7 +310,9 @@ class ProjectFile : public QObject {
286310
*/
287311
void readImportProject(QXmlStreamReader &reader);
288312

289-
void readAnalyzeAllVsConfigs(QXmlStreamReader &reader);
313+
bool readBool(QXmlStreamReader &reader);
314+
315+
int readInt(QXmlStreamReader &reader, int defaultValue);
290316

291317
/**
292318
* @brief Read list of include directories from XML.
@@ -376,6 +402,12 @@ class ProjectFile : public QObject {
376402
*/
377403
bool mAnalyzeAllVsConfigs;
378404

405+
/** Check code in headers */
406+
bool mCheckHeaders;
407+
408+
/** Check code in unused templates */
409+
bool mCheckUnusedTemplates;
410+
379411
/**
380412
* @brief List of include directories used to search include files.
381413
*/
@@ -431,6 +463,9 @@ class ProjectFile : public QObject {
431463
* @brief Warning tags
432464
*/
433465
QStringList mTags;
466+
467+
/** Max CTU depth */
468+
int mMaxCtuDepth;
434469
};
435470
/// @}
436471
#endif // PROJECT_FILE_H

gui/projectfiledialog.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,9 @@ void ProjectFileDialog::loadFromProjectFile(const ProjectFile *projectFile)
240240
setCheckPaths(projectFile->getCheckPaths());
241241
setImportProject(projectFile->getImportProject());
242242
mUI.mChkAllVsConfigs->setChecked(projectFile->getAnalyzeAllVsConfigs());
243+
mUI.mCheckHeaders->setChecked(projectFile->getCheckHeaders());
244+
mUI.mCheckUnusedTemplates->setChecked(projectFile->getCheckUnusedTemplates());
245+
mUI.mMaxCtuDepth->setValue(projectFile->getMaxCtuDepth());
243246
setExcludedPaths(projectFile->getExcludedPaths());
244247
setLibraries(projectFile->getLibraries());
245248
const QString platform = projectFile->getPlatform();
@@ -304,6 +307,9 @@ void ProjectFileDialog::saveToProjectFile(ProjectFile *projectFile) const
304307
projectFile->setBuildDir(getBuildDir());
305308
projectFile->setImportProject(getImportProject());
306309
projectFile->setAnalyzeAllVsConfigs(mUI.mChkAllVsConfigs->isChecked());
310+
projectFile->setCheckHeaders(mUI.mCheckHeaders->isChecked());
311+
projectFile->setCheckUnusedTemplates(mUI.mCheckUnusedTemplates->isChecked());
312+
projectFile->setMaxCtuDepth(mUI.mMaxCtuDepth->value());
307313
projectFile->setIncludes(getIncludePaths());
308314
projectFile->setDefines(getDefines());
309315
projectFile->setUndefines(getUndefines());

gui/projectfiledialog.ui

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -325,6 +325,59 @@
325325
</layout>
326326
</widget>
327327
</item>
328+
<item>
329+
<widget class="QGroupBox" name="groupBox_9">
330+
<property name="title">
331+
<string>Analysis</string>
332+
</property>
333+
<layout class="QVBoxLayout" name="verticalLayout_9">
334+
<item>
335+
<widget class="QCheckBox" name="mCheckHeaders">
336+
<property name="text">
337+
<string>Check code in headers (slower analysis, more results)</string>
338+
</property>
339+
<property name="checked">
340+
<bool>true</bool>
341+
</property>
342+
</widget>
343+
</item>
344+
<item>
345+
<widget class="QCheckBox" name="mCheckUnusedTemplates">
346+
<property name="text">
347+
<string>Check code in unused templates (slower and less accurate analysis)</string>
348+
</property>
349+
</widget>
350+
</item>
351+
<item>
352+
<layout class="QHBoxLayout" name="horizontalLayout_7">
353+
<item>
354+
<widget class="QLabel" name="label_3">
355+
<property name="text">
356+
<string>Max CTU depth</string>
357+
</property>
358+
</widget>
359+
</item>
360+
<item>
361+
<widget class="QSpinBox" name="mMaxCtuDepth"/>
362+
</item>
363+
<item>
364+
<spacer name="horizontalSpacer">
365+
<property name="orientation">
366+
<enum>Qt::Horizontal</enum>
367+
</property>
368+
<property name="sizeHint" stdset="0">
369+
<size>
370+
<width>40</width>
371+
<height>20</height>
372+
</size>
373+
</property>
374+
</spacer>
375+
</item>
376+
</layout>
377+
</item>
378+
</layout>
379+
</widget>
380+
</item>
328381
<item>
329382
<widget class="QGroupBox" name="groupBox_3">
330383
<property name="title">

lib/settings.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,7 @@ Settings::Settings()
5151
checkConfiguration(false),
5252
checkLibrary(false),
5353
checkHeaders(true),
54-
removeUnusedTemplates(false),
55-
removeUnusedIncludedTemplates(false)
54+
checkUnusedTemplates(false)
5655
{
5756
}
5857

lib/settings.h

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -290,11 +290,8 @@ class CPPCHECKLIB Settings : public cppcheck::Platform {
290290
* be turned off to save CPU */
291291
bool checkHeaders;
292292

293-
/** Remove unused templates in all files */
294-
bool removeUnusedTemplates;
295-
296-
/** Remove unused included templates */
297-
bool removeUnusedIncludedTemplates;
293+
/** Check unused templates */
294+
bool checkUnusedTemplates;
298295

299296
/** Struct contains standards settings */
300297
Standards standards;

lib/tokenize.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4767,15 +4767,15 @@ void Tokenizer::simplifyHeaders()
47674767
// TODO : can we remove anything in headers here? Like unused declarations.
47684768
// Maybe if --dump is used we want to have _everything_.
47694769

4770-
if (mSettings->checkHeaders && !mSettings->removeUnusedTemplates && !mSettings->removeUnusedIncludedTemplates)
4770+
if (mSettings->checkHeaders && mSettings->checkUnusedTemplates)
47714771
// Default=full analysis. All information in the headers are kept.
47724772
return;
47734773

47744774
const bool checkHeaders = mSettings->checkHeaders;
4775-
const bool removeUnusedIncludedFunctions = mSettings->checkHeaders;
4776-
const bool removeUnusedIncludedClasses = mSettings->checkHeaders;
4777-
const bool removeUnusedTemplates = mSettings->removeUnusedTemplates;
4778-
const bool removeUnusedIncludedTemplates = mSettings->checkHeaders || mSettings->removeUnusedIncludedTemplates;
4775+
const bool removeUnusedIncludedFunctions = !mSettings->checkHeaders;
4776+
const bool removeUnusedIncludedClasses = !mSettings->checkHeaders;
4777+
const bool removeUnusedIncludedTemplates = !mSettings->checkUnusedTemplates || !mSettings->checkHeaders;
4778+
const bool removeUnusedTemplates = !mSettings->checkUnusedTemplates;
47794779

47804780
// We want to remove selected stuff from the headers but not *everything*.
47814781
// The intention here is to not damage the analysis of the source file.

0 commit comments

Comments
 (0)