diff --git a/src/tools/moc/generator.cpp b/src/tools/moc/generator.cpp index 097d002142..625e1e6733 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 fa651f04a0..ac29557769 100644 --- a/src/tools/moc/generator.h +++ b/src/tools/moc/generator.h @@ -20,6 +20,8 @@ public: const QHash &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 4a9e3463ac..d04f2d079e 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::max())) { + error("internal limit exceeded: number of parsed strings is too big."); + exit(EXIT_FAILURE); + } } fputs("", out);