Qt 6.8.3 with BlackBerry 10 (QNX 8 / ARMv7) patches
 
 
 
 
 
 
Go to file
Marc Mutz e24df8bc72 QVarLengthArray: fix UBs in emplace()/insert() ([basic.life], broken class invariant)
There are two problems in emplace_impl() (the same code exists as
rvalue insert() since 5.10):

First, the old code updated size() at the end of the function.

However, if, after constructing the new end element, one of the
subsequent move-assignments fail (throws), then the class invariant
that size() be the number of alive elements in the container is
broken, with the immediate consequence that the QVLA dtor would not
destroy this element, but surely other unpleasantness (UB) that the
C++ lifetime rules decide to throw our way.

Similarly, in the trivially-relocatable case, the memmove() starts the
life-time of the new end object, so if the following placement new
fails, we're in the same situation.

The latter case is worse, though, since here we leave *b in some weird
zombie state: the memmove() effectively ended its lifetime in the
sense that one mustn't call the destructor on the source object after
trivial relocation, but C++ doesn't agree and QVLA's dtor will happily
call b->~T() as part of its cleanup.

The other ugly thing is that we're using placement new into an object
that C++ says is still alive. QString is trivially relocatable, but
not trivially copyable, so we can't end a QString's lifetime by
placement-new'ing a new QString instance into it without first having
ended the old object's lifetime.

The fix for both of these is, fortunately, the same: It's a rotate!™

By using emplace_back() + std::rotate(), we always place the new
object in a spot that didn't contain an alive object (in the C++
sense) before, we always update the size() right after doing so,
maintaining that invariant, and we then rotate() it into place, which
doesn't leave zombie objects around.

std::rotate() is such a fundamental algorithm that we should trust the
STL implementors to have optimized it well:
https://stackoverflow.com/questions/21160875/why-is-stdrotate-so-fast

We know we can do better only for trivially-relocatable, but
non-trivially-copyable types (ex: QString), so in order to not lose
the memmove() optimization, we now fall back to std::rotate on raw
memory for that case.

Amends dd58ddd5d9.

Pick-to: 6.5 6.4 6.2 5.15
Change-Id: Iacce4488ca649502861e0ed4e084c9fad38cab47
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
2023-02-15 23:19:43 +01:00
.github/workflows Repair github action workflow 2021-11-10 18:57:33 +01:00
LICENSES Add license text file for Creative Commons Zero (CC0) 1.0 2022-10-19 12:06:09 +02:00
bin Add simple project generation based on existing source files 2023-02-08 12:59:19 +01:00
cmake Revert "CMake: Fix configure -no-rpath" 2023-02-15 16:24:03 +01:00
coin Coin: Increase CPU core count to 8 2023-01-23 15:57:55 +02:00
config.tests Change the license of all CMakeLists.txt and *.cmake files to BSD 2022-08-23 23:58:42 +02:00
dist Add Qt 6.0.0 changes file 2020-11-16 10:02:08 +02:00
doc Examples: move widgets/codeeditor into manual tests 2023-02-09 00:23:34 +01:00
examples Torrent example: delete unimplemented functions 2023-02-14 18:49:46 +01:00
lib
libexec Use SPDX license identifiers 2022-05-16 16:37:38 +02:00
mkspecs Adjust permissions.prf plist path handling 2023-02-13 15:41:51 +02:00
qmake Make qmake and qtpaths report Qt version baked into the binaries 2023-01-18 13:21:05 +01:00
src QVarLengthArray: fix UBs in emplace()/insert() ([basic.life], broken class invariant) 2023-02-15 23:19:43 +01:00
tests QFuture: fix continuation cleanup 2023-02-15 15:12:12 +01:00
util Update CLDR to v42 2023-02-07 19:04:11 +01:00
.cmake.conf Enable QT_NO_AS_CONST globally 2023-01-05 15:09:49 +01:00
.gitattributes Give batch files CRLF line endings 2020-11-04 15:02:29 +00:00
.gitignore Assume qhelpgenerator in libexec instead of bin 2021-11-08 19:27:32 +01:00
.lgtm.yml Skip LGTM analysis for the bootstrap library and tools 2020-07-16 01:04:34 +02:00
.tag
CMakeLists.txt Change the license of all CMakeLists.txt and *.cmake files to BSD 2022-08-23 23:58:42 +02:00
conanfile.py Conan: Do not force 'qt_host_path' usage in cross-build context 2022-06-22 18:18:42 +03:00
config_help.txt Add -unity-build, and -unity-build-batch-size to configure 2023-02-09 04:23:06 +01:00
configure Retrieve an old -redo behavior 2023-02-07 18:51:58 +00:00
configure.bat Retrieve an old -redo behavior 2023-02-07 18:51:58 +00:00
configure.cmake Add find package for lttng library so that it gets added to target 2023-01-13 12:43:45 +02:00
dependencies.yaml
qt_cmdline.cmake QCryptographicHash: implement OpenSSL 3.0 support 2022-09-26 17:26:37 +02:00
sync.profile Move qurltlds_p.h out of src/network, and make it a .cpp file 2022-10-01 06:24:51 +00:00