2015-08-23 16:03:24 +02:00
|
|
|
/*
|
|
|
|
* Cppcheck - A tool for static C/C++ code analysis
|
2023-01-28 10:16:34 +01:00
|
|
|
* Copyright (C) 2007-2023 Cppcheck team.
|
2015-08-23 16:03:24 +02:00
|
|
|
*
|
|
|
|
* 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/>.
|
|
|
|
*/
|
|
|
|
|
2015-08-30 13:41:57 +02:00
|
|
|
#ifndef CPPCHECKLIBRARYDATA_H
|
|
|
|
#define CPPCHECKLIBRARYDATA_H
|
2015-08-23 16:03:24 +02:00
|
|
|
|
|
|
|
#include <QList>
|
2023-04-08 16:08:47 +02:00
|
|
|
#include <QMap>
|
|
|
|
#include <QPair>
|
|
|
|
#include <QSet>
|
2015-08-23 16:03:24 +02:00
|
|
|
#include <QString>
|
|
|
|
#include <QStringList>
|
2021-04-03 21:30:50 +02:00
|
|
|
|
|
|
|
class QIODevice;
|
2015-08-23 16:03:24 +02:00
|
|
|
|
2015-08-30 13:41:57 +02:00
|
|
|
class CppcheckLibraryData {
|
2015-08-23 16:03:24 +02:00
|
|
|
public:
|
2023-08-16 17:13:36 +02:00
|
|
|
CppcheckLibraryData() = default;
|
2015-08-23 16:03:24 +02:00
|
|
|
|
2015-09-05 20:13:26 +02:00
|
|
|
struct Container {
|
|
|
|
QString id;
|
|
|
|
QString inherits;
|
|
|
|
QString startPattern;
|
|
|
|
QString endPattern;
|
2017-11-12 15:07:11 +01:00
|
|
|
QString opLessAllowed;
|
|
|
|
QString itEndPattern;
|
2015-09-05 20:13:26 +02:00
|
|
|
|
2023-08-08 11:05:02 +02:00
|
|
|
bool access_arrayLike{};
|
|
|
|
int size_templateParameter = -1;
|
2015-09-05 20:13:26 +02:00
|
|
|
|
|
|
|
struct {
|
|
|
|
QString templateParameter;
|
|
|
|
QString string;
|
|
|
|
} type;
|
|
|
|
|
2022-07-04 22:23:20 +02:00
|
|
|
struct RangeItemRecordType {
|
|
|
|
QString name;
|
|
|
|
QString templateParameter;
|
|
|
|
};
|
|
|
|
|
2015-09-05 20:13:26 +02:00
|
|
|
struct Function {
|
|
|
|
QString name;
|
|
|
|
QString yields;
|
|
|
|
QString action;
|
|
|
|
};
|
2023-10-08 09:10:17 +02:00
|
|
|
QList<Function> accessFunctions;
|
|
|
|
QList<Function> otherFunctions;
|
|
|
|
QList<Function> sizeFunctions;
|
|
|
|
QList<RangeItemRecordType> rangeItemRecordTypeList;
|
2015-09-05 20:13:26 +02:00
|
|
|
};
|
|
|
|
|
2015-08-23 16:03:24 +02:00
|
|
|
struct Define {
|
|
|
|
QString name;
|
|
|
|
QString value;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct Function {
|
2015-09-10 20:11:05 +02:00
|
|
|
QString comments;
|
2015-08-23 16:03:24 +02:00
|
|
|
QString name;
|
2023-08-08 11:05:02 +02:00
|
|
|
enum TrueFalseUnknown { False, True, Unknown } noreturn = Unknown;
|
|
|
|
bool gccPure{};
|
|
|
|
bool gccConst{};
|
|
|
|
bool leakignore{};
|
|
|
|
bool useretval{};
|
2017-11-12 15:07:11 +01:00
|
|
|
struct ReturnValue {
|
|
|
|
QString type;
|
|
|
|
QString value;
|
2023-08-08 11:05:02 +02:00
|
|
|
int container = -1;
|
2017-11-12 15:07:11 +01:00
|
|
|
bool empty() const {
|
|
|
|
return type.isNull() && value.isNull() && container < 0;
|
|
|
|
}
|
|
|
|
} returnValue;
|
2015-08-23 16:03:24 +02:00
|
|
|
struct {
|
|
|
|
QString scan;
|
|
|
|
QString secure;
|
|
|
|
} formatstr;
|
|
|
|
struct Arg {
|
|
|
|
QString name;
|
2023-08-08 11:05:02 +02:00
|
|
|
unsigned int nr{};
|
2015-08-23 16:03:24 +02:00
|
|
|
static const unsigned int ANY;
|
2017-11-12 15:07:11 +01:00
|
|
|
static const unsigned int VARIADIC;
|
|
|
|
QString defaultValue;
|
2023-08-08 11:05:02 +02:00
|
|
|
bool notbool{};
|
|
|
|
bool notnull{};
|
|
|
|
bool notuninit{};
|
|
|
|
bool formatstr{};
|
|
|
|
bool strz{};
|
2015-08-23 16:03:24 +02:00
|
|
|
QString valid;
|
2015-08-30 13:33:43 +02:00
|
|
|
struct MinSize {
|
2015-08-23 16:03:24 +02:00
|
|
|
QString type;
|
|
|
|
QString arg;
|
|
|
|
QString arg2;
|
2015-08-30 13:33:43 +02:00
|
|
|
};
|
2023-10-08 09:10:17 +02:00
|
|
|
QList<MinSize> minsizes;
|
2017-11-12 15:07:11 +01:00
|
|
|
struct Iterator {
|
2023-08-08 11:05:02 +02:00
|
|
|
int container = -1;
|
2017-11-12 15:07:11 +01:00
|
|
|
QString type;
|
|
|
|
} iterator;
|
2015-08-23 16:03:24 +02:00
|
|
|
};
|
2023-10-08 09:10:17 +02:00
|
|
|
QList<Arg> args;
|
2015-11-22 11:45:29 +01:00
|
|
|
|
|
|
|
struct {
|
|
|
|
QString severity;
|
2017-11-12 15:07:11 +01:00
|
|
|
QString cstd;
|
2015-11-22 11:45:29 +01:00
|
|
|
QString reason;
|
|
|
|
QString alternatives;
|
|
|
|
QString msg;
|
|
|
|
|
|
|
|
bool isEmpty() const {
|
2017-11-12 15:07:11 +01:00
|
|
|
return cstd.isEmpty() &&
|
|
|
|
severity.isEmpty() &&
|
2015-11-22 11:45:29 +01:00
|
|
|
reason.isEmpty() &&
|
|
|
|
alternatives.isEmpty() &&
|
|
|
|
msg.isEmpty();
|
|
|
|
}
|
|
|
|
} warn;
|
2022-07-04 22:23:20 +02:00
|
|
|
|
|
|
|
QMap<QString, QString> notOverlappingDataArgs;
|
|
|
|
QMap<QString, QString> containerAttributes;
|
2015-08-23 16:03:24 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
struct MemoryResource {
|
|
|
|
QString type; // "memory" or "resource"
|
|
|
|
struct Alloc {
|
2023-08-08 11:05:02 +02:00
|
|
|
bool isRealloc{};
|
|
|
|
bool init{};
|
|
|
|
int arg = -1; // -1: Has no optional "realloc-arg" attribute
|
|
|
|
int reallocArg = -1; // -1: Has no optional "arg" attribute
|
2020-12-25 20:08:33 +01:00
|
|
|
QString bufferSize;
|
2015-08-23 16:03:24 +02:00
|
|
|
QString name;
|
|
|
|
};
|
2020-12-25 20:08:33 +01:00
|
|
|
struct Dealloc {
|
2023-08-08 11:05:02 +02:00
|
|
|
int arg = -1; // -1: Has no optional "arg" attribute
|
2020-12-25 20:08:33 +01:00
|
|
|
QString name;
|
|
|
|
};
|
|
|
|
|
2023-10-08 09:10:17 +02:00
|
|
|
QList<Alloc> alloc;
|
|
|
|
QList<Dealloc> dealloc;
|
2015-08-23 16:03:24 +02:00
|
|
|
QStringList use;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct PodType {
|
|
|
|
QString name;
|
2021-01-09 21:30:29 +01:00
|
|
|
QString stdtype;
|
2015-08-23 16:03:24 +02:00
|
|
|
QString size;
|
|
|
|
QString sign;
|
|
|
|
};
|
|
|
|
|
2021-01-29 14:54:19 +01:00
|
|
|
struct PlatformType {
|
|
|
|
QString name;
|
|
|
|
QString value;
|
|
|
|
QStringList types; // Keeps element names w/o attribute (e.g. unsigned)
|
|
|
|
QStringList platforms; // Keeps "type" attribute of each "platform" element
|
|
|
|
};
|
|
|
|
|
2021-01-18 19:10:53 +01:00
|
|
|
using TypeChecks = QList<QPair<QString, QString>>;
|
|
|
|
|
2021-02-03 12:52:52 +01:00
|
|
|
struct Reflection {
|
|
|
|
struct Call {
|
2023-08-08 11:05:02 +02:00
|
|
|
int arg = -1; // -1: Mandatory "arg" attribute not available
|
2021-02-03 12:52:52 +01:00
|
|
|
QString name;
|
|
|
|
};
|
|
|
|
|
2023-10-08 09:10:17 +02:00
|
|
|
QList<Call> calls;
|
2021-02-03 12:52:52 +01:00
|
|
|
};
|
|
|
|
|
2021-02-09 13:53:32 +01:00
|
|
|
struct Markup {
|
|
|
|
struct CodeBlocks {
|
|
|
|
QStringList blocks;
|
2023-08-08 11:05:02 +02:00
|
|
|
int offset = -1;
|
2021-02-09 13:53:32 +01:00
|
|
|
QString start;
|
|
|
|
QString end;
|
|
|
|
};
|
|
|
|
|
|
|
|
struct Exporter {
|
|
|
|
QString prefix;
|
|
|
|
QStringList prefixList;
|
|
|
|
QStringList suffixList;
|
|
|
|
};
|
|
|
|
|
|
|
|
QString ext;
|
2023-08-08 11:05:02 +02:00
|
|
|
bool afterCode{};
|
|
|
|
bool reportErrors{};
|
2021-02-09 13:53:32 +01:00
|
|
|
QStringList keywords;
|
|
|
|
QStringList importer;
|
|
|
|
QList<CodeBlocks> codeBlocks;
|
|
|
|
QList<Exporter> exporter;
|
|
|
|
};
|
|
|
|
|
2022-07-04 22:23:20 +02:00
|
|
|
struct SmartPointer {
|
|
|
|
QString name;
|
2023-08-08 11:05:02 +02:00
|
|
|
bool unique{};
|
2022-07-04 22:23:20 +02:00
|
|
|
};
|
|
|
|
|
2023-01-27 19:43:08 +01:00
|
|
|
struct Entrypoint {
|
|
|
|
QString name;
|
|
|
|
};
|
|
|
|
|
2015-08-23 16:03:24 +02:00
|
|
|
void clear() {
|
2017-11-12 15:22:00 +01:00
|
|
|
containers.clear();
|
2015-08-23 16:03:24 +02:00
|
|
|
defines.clear();
|
2018-10-09 15:05:05 +02:00
|
|
|
undefines.clear();
|
2015-08-23 16:03:24 +02:00
|
|
|
functions.clear();
|
|
|
|
memoryresource.clear();
|
|
|
|
podtypes.clear();
|
2021-01-18 19:10:53 +01:00
|
|
|
smartPointers.clear();
|
|
|
|
typeChecks.clear();
|
2021-01-29 14:54:19 +01:00
|
|
|
platformTypes.clear();
|
2021-02-03 12:52:52 +01:00
|
|
|
reflections.clear();
|
2021-02-09 13:53:32 +01:00
|
|
|
markups.clear();
|
2023-01-27 19:43:08 +01:00
|
|
|
entrypoints.clear();
|
2015-08-23 16:03:24 +02:00
|
|
|
}
|
|
|
|
|
2017-11-12 21:03:22 +01:00
|
|
|
void swap(CppcheckLibraryData &other) {
|
|
|
|
containers.swap(other.containers);
|
|
|
|
defines.swap(other.defines);
|
2018-10-09 15:05:05 +02:00
|
|
|
undefines.swap(other.undefines);
|
2017-11-12 21:03:22 +01:00
|
|
|
functions.swap(other.functions);
|
|
|
|
memoryresource.swap(other.memoryresource);
|
|
|
|
podtypes.swap(other.podtypes);
|
2021-01-18 19:10:53 +01:00
|
|
|
smartPointers.swap(other.smartPointers);
|
|
|
|
typeChecks.swap(other.typeChecks);
|
2021-01-29 14:54:19 +01:00
|
|
|
platformTypes.swap(other.platformTypes);
|
2021-02-03 12:52:52 +01:00
|
|
|
reflections.swap(other.reflections);
|
2021-02-09 13:53:32 +01:00
|
|
|
markups.swap(other.markups);
|
2023-01-27 19:43:08 +01:00
|
|
|
entrypoints.swap(other.entrypoints);
|
2017-11-12 21:03:22 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
QString open(QIODevice &file);
|
2015-08-23 16:03:24 +02:00
|
|
|
QString toString() const;
|
|
|
|
|
2023-10-08 09:10:17 +02:00
|
|
|
QList<Container> containers;
|
|
|
|
QList<Define> defines;
|
|
|
|
QList<Function> functions;
|
|
|
|
QList<MemoryResource> memoryresource;
|
|
|
|
QList<PodType> podtypes;
|
2021-01-18 19:10:53 +01:00
|
|
|
QList<TypeChecks> typeChecks;
|
2023-10-08 09:10:17 +02:00
|
|
|
QList<PlatformType> platformTypes;
|
2018-10-09 15:05:05 +02:00
|
|
|
QStringList undefines;
|
2023-10-08 09:10:17 +02:00
|
|
|
QList<SmartPointer> smartPointers;
|
|
|
|
QList<Reflection> reflections;
|
|
|
|
QList<Markup> markups;
|
|
|
|
QList<Entrypoint> entrypoints;
|
2015-08-23 16:03:24 +02:00
|
|
|
};
|
|
|
|
|
2020-12-25 20:08:33 +01:00
|
|
|
#endif // CPPCHECKLIBRARYDATA_H
|