From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.1 (2015-04-28) on sa.local.altlinux.org X-Spam-Level: X-Spam-Status: No, score=-4.3 required=5.0 tests=ALL_TRUSTED,BAYES_00, RP_MATCHES_RCVD autolearn=unavailable autolearn_force=no version=3.4.1 Message-ID: <65846923-0779-a2d1-65c8-e920fc193993@basealt.ru> Date: Sat, 22 Oct 2022 17:19:41 +0700 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.11.0 Content-Language: en-US To: devel@lists.altlinux.org References: <1c87c268-215a-7fd0-eb9d-eb475f307d68@basealt.ru> From: Ilya Kurdyukov In-Reply-To: <1c87c268-215a-7fd0-eb9d-eb475f307d68@basealt.ru> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Subject: [devel] =?utf-8?b?IFtxdDYtYmFzZV0gbnVsbHB0ciDQv9C10YDQtdC00LA=?= =?utf-8?b?0ZHRgtGB0Y8g0LIgY29uc3RleHByINGE0YPQvdC60YbQuNGOPw==?= X-BeenThere: devel@lists.altlinux.org X-Mailman-Version: 2.1.12 Precedence: list Reply-To: ALT Linux Team development discussions List-Id: ALT Linux Team development discussions List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 22 Oct 2022 10:19:48 -0000 Archived-At: List-Archive: List-Post: На Эльбрусе такое возникло. Срабатывает при выполнении qdbusxml2cpp, что используется в некоторых пакетах (qt6-sensors, qt6-positioning). Считаю что баг в апстриме. Но как это вообще может работать на других архитектурах (компиляторах) ? Для Эльбурса используется EDG, что "constexpr int normalizeType()" выполянет в рантайме. Стектрейс: #0  0x0000455555cfec30 in QtPrivate::QTypeNormalizer::normalizeType(char const*, char const*, bool) () from /usr/lib64/libQt6Core.so.6 #1  0x0000455555d010b8 in QtPrivate::qNormalizeType(char const*, char const*, char*) () from /usr/lib64/libQt6Core.so.6 #2  0x0000455555ce3b00 in _INTERNAL_15_qmetaobject_cpp_4823c95c::normalizeTypeInternal(char const*, char const*) () from /usr/lib64/libQt6Core.so.6 #3  0x0000455555ce8a68 in QMetaObject::normalizedType(char const*) ()    from /usr/lib64/libQt6Core.so.6 #4  0x0000455555d984b0 in (anonymous namespace)::QMetaTypeCustomRegistry::registerCustomType(QtPrivate::QMetaTypeInterface const*) ()    from /usr/lib64/libQt6Core.so.6 #5  0x0000455555d2c8b8 in QMetaType::idHelper() const ()    from /usr/lib64/libQt6Core.so.6 #6  0x000000000003aea0 in QMetaType::id(int) const () #7  0x0000000000022d88 in _INTERNAL_16_qdbusxml2cpp_cpp_4823c95c::qtTypeName(QString const&, QMap const&, int, char const*, bool) () #8  0x0000000000027838 in _INTERNAL_16_qdbusxml2cpp_cpp_4823c95c::writeProxy(QString const&, QMap > const&) () #9  0x0000000000032db0 in main () Последние три функции, в *t приходит нулевой указатель: static QByteArray normalizeTypeInternal(const char *t, const char *e) {     int len = QtPrivate::qNormalizeType(t, e, nullptr);     if (len == 0)         return QByteArray();     QByteArray result(len, Qt::Uninitialized);     len = QtPrivate::qNormalizeType(t, e, result.data());     Q_ASSERT(len == result.size());     return result; } constexpr int qNormalizeType(const char *begin, const char *end, char *output) {     return QTypeNormalizer { output }.normalizeType(begin, end); } struct QTypeNormalizer {     constexpr int normalizeType(const char *begin, const char *end, bool adjustConst = true)     {         // Trim spaces         while (begin != end && is_space(*begin))             begin++;         while (begin != end && is_space(*(end - 1)))             end--;         // Convert 'char const *' into 'const char *'. Start at index 1,         // not 0, because 'const char *' is already OK.         const char *cst = begin + 1;         if (*begin == '\'' || *begin == '"')             cst = skipString(begin, end);         bool seenStar = false;         bool hasMiddleConst = false;         while (cst < end) { ... Падает на *begin == '\''. Отсюда (qdbusxml2cpp.cpp): static QByteArray qtTypeName(const QString &signature, const QDBusIntrospection::Annotations &annotations, int paramId = -1, const char *direction = "Out", bool isSignal = false) {     int type = QDBusMetaType::signatureToMetaType(signature.toLatin1()).id();     if (type == QMetaType::UnknownType) { ... вызывается id() -> idHelper() -> registerCustomType() ... -> normalizeType() QMetaType QDBusMetaType::signatureToMetaType(const char *signature) {     if (!signature)         return QMetaType(QMetaType::UnknownType);     QDBusMetaTypeId::init();     switch (signature[0])     { ...     default:         return QMetaType(QMetaType::UnknownType);     } } QMetaType::UnknownType имеет name = nullptr, с нулевой длиной. qmetatype.cpp: static const struct { const char * typeName; int typeNameLength; int type; } types[] = {     QT_FOR_EACH_STATIC_TYPE(QT_ADD_STATIC_METATYPE) QT_FOR_EACH_STATIC_ALIAS_TYPE(QT_ADD_STATIC_METATYPE_ALIASES_ITER)     QT_ADD_STATIC_METATYPE(_, QMetaTypeId2::MetaType, qreal)     {nullptr, 0, QMetaType::UnknownType} };