diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/tools/moc/generator.cpp | 4 | ||||
| -rw-r--r-- | src/tools/moc/generator.h | 2 | ||||
| -rw-r--r-- | src/tools/moc/moc.cpp | 6 |
3 files changed, 10 insertions, 2 deletions
diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp index 097d0021428..625e1e6733e 100644 --- a/src/tools/moc/generator.cpp +++ b/src/tools/moc/generator.cpp @@ -122,7 +122,7 @@ void Generator::strreg(const QByteArray &s) int Generator::stridx(const QByteArray &s) { - int i = strings.indexOf(s); + int i = int(strings.indexOf(s)); Q_ASSERT_X(i != -1, Q_FUNC_INFO, "We forgot to register some strings"); return i; } @@ -841,7 +841,7 @@ void Generator::generateProperties() int notifyId = p.notifyId; if (p.notifyId < -1) { // signal is in parent class - const int indexInStrings = strings.indexOf(p.notify); + const int indexInStrings = int(strings.indexOf(p.notify)); notifyId = indexInStrings | IsUnresolvedSignal; } fprintf(out, ", 0x%.8x, uint(%d), %d,\n", flags, notifyId, p.revision); diff --git a/src/tools/moc/generator.h b/src/tools/moc/generator.h index fa651f04a0a..ac295577692 100644 --- a/src/tools/moc/generator.h +++ b/src/tools/moc/generator.h @@ -20,6 +20,8 @@ public: const QHash<QByteArray, QByteArray> &knownGadgets, FILE *outfile = nullptr, bool requireCompleteTypes = false); void generateCode(); + qsizetype registeredStringsCount() { return strings.size(); }; + private: bool registerableMetaType(const QByteArray &propertyType); void registerClassInfoStrings(); diff --git a/src/tools/moc/moc.cpp b/src/tools/moc/moc.cpp index 4a9e3463ac8..d04f2d079ee 100644 --- a/src/tools/moc/moc.cpp +++ b/src/tools/moc/moc.cpp @@ -1138,6 +1138,12 @@ void Moc::generate(FILE *out, FILE *jsonOutput) for (int i = 0; i < classList.size(); ++i) { Generator generator(&classList[i], metaTypes, knownQObjectClasses, knownGadgets, out, requireCompleteTypes); generator.generateCode(); + + // generator.generateCode() should have already registered all strings + if (Q_UNLIKELY(generator.registeredStringsCount() >= std::numeric_limits<int>::max())) { + error("internal limit exceeded: number of parsed strings is too big."); + exit(EXIT_FAILURE); + } } fputs("", out); |
