- 
    Bug 
- 
    Resolution: Done
- 
    P2: Important 
- 
    5.15.8
- 
    None
- 
        
- 
        6c5dac1685 (qt/qtbase/dev) 6c5dac1685 (qt/tqtc-qtbase/dev) 900cea847d (qt/qtbase/6.3) 900cea847d (qt/tqtc-qtbase/6.3) 25f5c2d947 (qt/tqtc-qtbase/5.15) 6dd9d31f7b (qt/tqtc-qtbase/6.2) 25f5c2d947 (qt/tqtc-qtbase/tqtc/vxworks-5.15.10)
- 
        Foundation PM Prioritized
While porting from Qt5 to Qt6, I noticed that the serialization format of QDateTime in QSettings changed. In my case, switching between the production (5.15.8) and development (6.3.0) sessions causes production to crash:
1 operator<< qtimezone.cpp 980 0x7ffff2d188ba 2 operator<< qdatetime.cpp 5734 0x7ffff2d0dfb9 3 (anonymous namespace)::FilteredOperatorSwitch<QDateTime, true>::save qmetatype.cpp 1466 0x7ffff2e35bd0 4 (anonymous namespace)::SaveOperatorSwitch::delegate<QDateTime> qmetatype.cpp 1508 0x7ffff2e35bd0 5 QMetaTypeSwitcher::switcher<bool, (anonymous namespace)::SaveOperatorSwitch> qmetatypeswitcher_p.h 74 0x7ffff2e35bd0 6 QMetaType::save qmetatype.cpp 1616 0x7ffff2e35bd0 7 QVariant::save qvariant.cpp 2599 0x7ffff2e674a0 8 operator<< qvariant.cpp 2625 0x7ffff2e6768f 9 QSettingsPrivate::variantToString qsettings.cpp 460 0x7ffff2da81f9 10 QConfFileSettingsPrivate::writeIniFile qsettings.cpp 1897 0x7ffff2dad95a 11 QConfFileSettingsPrivate::syncConfFile qsettings.cpp 1515 0x7ffff2dae6aa 12 QConfFileSettingsPrivate::sync qsettings.cpp 1367 0x7ffff2dae9e3 13 QSettings::~QSettings qsettings.cpp 2763 0x7ffff2da40f6 14 QSettings::~QSettings qsettings.cpp 2768 0x7ffff2da4119 ...
This happens when writing the new configuration with valid values. In step #1 of the stacktrace tz is 0x0.
I'm unable to create a small example that reproduces the crash, but code like
#include <QCoreApplication>
#include <QSettings>
#include <QDebug>
#include <QDateTime>
void setmeup() {
    QSettings settings;
    qInfo() << settings.value("generic/time").value<QDateTime>();
    settings.beginGroup("generic");
    settings.setValue("time", QDateTime::currentDateTime());
    settings.endGroup();
}
int main(int argc, char *argv[])
{
    QCoreApplication::setOrganizationName("qtc");
    QCoreApplication::setApplicationName("settingstester");
    setmeup();
    return 0;
}
creates
time=@DateTime(\0\0\0\x10\0\0\0\0\0\0%\x88\x1c\x1\xf5\xc9\xa7\0)
for Qt5 and
time=@DateTime(\0\0\0\x10\0\0\0\0\0\0%<88>\x1c\x1ö<8c>Ö\0)
for Qt6. Running the Qt5 build after the Qt6 build ends up with an invalid date.
The real world application does not crash if I remove two lines with QDateTime from the configuration.
- is blocked by
- 
                    QTBUG-101681 tst_QPointer::threadSafety() is flaky (probably race condition) -         
- Closed
 
-         
- 
                    QTBUG-102703 tst_QPointer::threadSafety() crashes -         
- Closed
 
-         
| For Gerrit Dashboard: QTBUG-102334 | ||||||
|---|---|---|---|---|---|---|
| # | Subject | Branch | Project | Status | CR | V | 
| 405178,4 | Fix handling of DateTime values in QSettings | dev | qt/qtbase | Status: MERGED | -1 | 0 | 
| 406968,3 | Fix handling of DateTime values in QSettings | 6.3 | qt/qtbase | Status: MERGED | +2 | 0 | 
| 407032,3 | Fix handling of DateTime values in QSettings | tqtc/lts-6.2 | qt/tqtc-qtbase | Status: MERGED | +2 | 0 | 
| 407033,4 | Fix handling of DateTime values in QSettings | tqtc/lts-5.15 | qt/tqtc-qtbase | Status: MERGED | +2 | 0 |