Don't access moved-from object

Clang's static analyzer tooling warns about this access-after-move [1].
While the comment above the function indicated that this was deliberate
and relying on a moved-from QString being valid, it is still bad
practice.

Since 'str' is empty in moved-from state if - and only if - it was a
non-const reference, make a compile-time check of the constness of type
T instead.

[1] https://testresults.qt.io/codechecker/daily_analyses/qtbase/dev/qtbase-dev-20210301-e14ccf0553/qstring.cpp_clang-tidy_b0545db57a2cc5dac67a56f76322ffd0.plist.html#reportHash=209ee3db0b17d21919326a1ad6635318

Change-Id: Iac1813b61b6a3c2ef4053b911a4043c5382f85e4
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Edward Welbourne <edward.welbourne@qt.io>
Reviewed-by: Andrei Golubev <andrei.golubev@qt.io>
(cherry picked from commit 49113c905d5868e6b76bb6b7b3e0a20b0c56a23a)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Volker Hilsheimer 2021-03-01 11:44:28 +01:00 committed by Qt Cherry-pick Bot
parent bbdbe26cad
commit 8ba766c086

View File

@ -6342,9 +6342,9 @@ namespace QUnicodeTables {
\endlist \endlist
In copy-convert mode, the local variable \c{s} is detached from the input In copy-convert mode, the local variable \c{s} is detached from the input
\a str. In the in-place convert mode, \a str is in moved-from state (which \a str. In the in-place convert mode, \a str is in moved-from state and
this function requires to be a valid, empty string) and \c{s} contains the \c{s} contains the only copy of the string, without reallocation (thus,
only copy of the string, without reallocation (thus, \a it is still valid). \a it is still valid).
There is one pathological case left: when the in-place conversion needs to There is one pathological case left: when the in-place conversion needs to
reallocate memory to grow the buffer. In that case, we need to adjust the \a reallocate memory to grow the buffer. In that case, we need to adjust the \a
@ -6374,9 +6374,8 @@ static QString detachAndConvertCase(T &str, QStringIterator it, QUnicodeTables::
s.replace(outpos, 1, reinterpret_cast<const QChar *>(folded.data()), folded.size()); s.replace(outpos, 1, reinterpret_cast<const QChar *>(folded.data()), folded.size());
pp = const_cast<QChar *>(s.constBegin()) + outpos + folded.size(); pp = const_cast<QChar *>(s.constBegin()) + outpos + folded.size();
// do we need to adjust the input iterator too? // Adjust the input iterator if we are performing an in-place conversion
// if it is pointing to s's data, str is empty if constexpr (!std::is_const<T>::value)
if (str.isEmpty())
it = QStringIterator(s.constBegin(), inpos + folded.size(), s.constEnd()); it = QStringIterator(s.constBegin(), inpos + folded.size(), s.constEnd());
} }
} else { } else {