Skip to content

Commit ab7d728

Browse files
authored
Add missing support for "type-checks" and "smart-pointer" configuration. (#3039)
1 parent fde5994 commit ab7d728

13 files changed

Lines changed: 384 additions & 1 deletion

.github/workflows/CI-unixish.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,11 @@ jobs:
9494
qmake
9595
make -j$(nproc)
9696
./test-projectfile
97+
popd
98+
pushd gui/test/cppchecklibrarydata
99+
qmake
100+
make -j$(nproc)
101+
./test-cppchecklibrarydata
97102
98103
- name: Generate Qt help file on ubuntu
99104
if: contains(matrix.os, 'ubuntu')

gui/cppchecklibrarydata.cpp

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,28 @@ static QString loadUndefine(const QXmlStreamReader &xmlReader)
106106
return xmlReader.attributes().value("name").toString();
107107
}
108108

109+
static QString loadSmartPointer(const QXmlStreamReader &xmlReader)
110+
{
111+
return xmlReader.attributes().value("class-name").toString();
112+
}
113+
114+
static CppcheckLibraryData::TypeChecks loadTypeChecks(QXmlStreamReader &xmlReader)
115+
{
116+
CppcheckLibraryData::TypeChecks typeChecks;
117+
QXmlStreamReader::TokenType type;
118+
while ((type = xmlReader.readNext()) != QXmlStreamReader::EndElement ||
119+
xmlReader.name().toString() != "type-checks") {
120+
if (type != QXmlStreamReader::StartElement)
121+
continue;
122+
const QString elementName = xmlReader.name().toString();
123+
if (elementName == "suppress" || elementName == "check") {
124+
QPair<QString, QString> entry(elementName, xmlReader.readElementText());
125+
typeChecks.append(entry);
126+
}
127+
}
128+
return typeChecks;
129+
}
130+
109131
static CppcheckLibraryData::Function::Arg loadFunctionArg(QXmlStreamReader &xmlReader)
110132
{
111133
CppcheckLibraryData::Function::Arg arg;
@@ -279,6 +301,10 @@ QString CppcheckLibraryData::open(QIODevice &file)
279301
memoryresource.append(loadMemoryResource(xmlReader));
280302
else if (elementName == "podtype")
281303
podtypes.append(loadPodType(xmlReader));
304+
else if (elementName == "smart-pointer")
305+
smartPointers.append(loadSmartPointer(xmlReader));
306+
else if (elementName == "type-checks")
307+
typeChecks.append(loadTypeChecks(xmlReader));
282308
else
283309
unhandledElement(xmlReader);
284310
} catch (std::runtime_error &e) {
@@ -501,6 +527,24 @@ static void writeMemoryResource(QXmlStreamWriter &xmlWriter, const CppcheckLibra
501527
xmlWriter.writeEndElement();
502528
}
503529

530+
static void writeTypeChecks(QXmlStreamWriter &xmlWriter, const CppcheckLibraryData::TypeChecks &typeChecks)
531+
{
532+
QPair<QString, QString> check;
533+
xmlWriter.writeStartElement("type-checks");
534+
if (!typeChecks.isEmpty()) {
535+
xmlWriter.writeStartElement("unusedvar");
536+
}
537+
foreach (check, typeChecks) {
538+
xmlWriter.writeStartElement(check.first);
539+
xmlWriter.writeCharacters(check.second);
540+
xmlWriter.writeEndElement();
541+
}
542+
if (!typeChecks.isEmpty()) {
543+
xmlWriter.writeEndElement();
544+
}
545+
xmlWriter.writeEndElement();
546+
}
547+
504548
QString CppcheckLibraryData::toString() const
505549
{
506550
QString outputString;
@@ -548,6 +592,16 @@ QString CppcheckLibraryData::toString() const
548592
xmlWriter.writeEndElement();
549593
}
550594

595+
foreach (const TypeChecks check, typeChecks) {
596+
writeTypeChecks(xmlWriter, check);
597+
}
598+
599+
foreach (const QString &smartPtr, smartPointers) {
600+
xmlWriter.writeStartElement("smart-pointer");
601+
xmlWriter.writeAttribute("class-name", smartPtr);
602+
xmlWriter.writeEndElement();
603+
}
604+
551605
xmlWriter.writeEndElement();
552606

553607
return outputString;

gui/cppchecklibrarydata.h

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -171,23 +171,28 @@ class CppcheckLibraryData {
171171
QString sign;
172172
};
173173

174+
using TypeChecks = QList<QPair<QString, QString>>;
175+
174176
void clear() {
175177
containers.clear();
176178
defines.clear();
177179
undefines.clear();
178180
functions.clear();
179181
memoryresource.clear();
180182
podtypes.clear();
183+
smartPointers.clear();
184+
typeChecks.clear();
181185
}
182186

183-
184187
void swap(CppcheckLibraryData &other) {
185188
containers.swap(other.containers);
186189
defines.swap(other.defines);
187190
undefines.swap(other.undefines);
188191
functions.swap(other.functions);
189192
memoryresource.swap(other.memoryresource);
190193
podtypes.swap(other.podtypes);
194+
smartPointers.swap(other.smartPointers);
195+
typeChecks.swap(other.typeChecks);
191196
}
192197

193198
QString open(QIODevice &file);
@@ -198,7 +203,9 @@ class CppcheckLibraryData {
198203
QList<struct Function> functions;
199204
QList<struct MemoryResource> memoryresource;
200205
QList<struct PodType> podtypes;
206+
QList<TypeChecks> typeChecks;
201207
QStringList undefines;
208+
QStringList smartPointers;
202209
};
203210

204211
#endif // CPPCHECKLIBRARYDATA_H
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
TEMPLATE = app
2+
TARGET = test-cppchecklibrarydata
3+
DEPENDPATH += .
4+
INCLUDEPATH += .
5+
OBJECTS_DIR = ../build
6+
MOC_DIR = ../build
7+
8+
QT -= gui
9+
QT += core
10+
CONFIG += console
11+
12+
include(../common.pri)
13+
14+
DEFINES += SRCDIR=\\\"$$PWD\\\"
15+
16+
SOURCES += testcppchecklibrarydata.cpp \
17+
../../cppchecklibrarydata.cpp
18+
19+
HEADERS += testcppchecklibrarydata.h \
20+
../../cppchecklibrarydata.h \
21+
22+
RESOURCES += \
23+
resources.qrc
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
<?xml version="1.0"?>
2+
<def format="2">
3+
<podtype sign="u" size="4" stdtype="uint32_t"/>
4+
</def>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<?xml version="1.0"?>
2+
<def format="2">
3+
<podtype name="bool"/>
4+
<podtype name="ulong" sign="u" size="4" stdtype="uint32_t"/>
5+
</def>
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
<?xml version="1.0"?>
2+
<def format="2">
3+
<smart-pointer class-name="wxObjectDataPtr"/>
4+
<smart-pointer class-name="wxScopedArray"/>
5+
<smart-pointer class-name="wxScopedPtr"/>
6+
</def>
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?xml version="1.0"?>
2+
<def format="2">
3+
<type-checks>
4+
<unusedvar>
5+
<suppress>std::insert_iterator</suppress>
6+
<check>std::pair</check>
7+
</unusedvar>
8+
</type-checks>
9+
<type-checks/>
10+
<type-checks>
11+
<unusedvar>
12+
<check>std::tuple</check>
13+
</unusedvar>
14+
</type-checks>
15+
</def>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<?xml version="1.0"?>
2+
<def format="2">
3+
<!-- error: typo which should trigger unhandled element handler -->
4+
<podtyp sign="u" size="4" stdtype="uint32_t"/>
5+
</def>
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
<?xml version="1.0"?>
2+
<def format="2">
3+
<!-- error: redefinition of size attribute -->
4+
<podtype name="ulong" sign="u" size="4" size="4"/>
5+
</def>

0 commit comments

Comments
 (0)