From 7b04bdf491bc661fd508d33aa1d4e650c50e9811 Mon Sep 17 00:00:00 2001 From: Thiago Macieira Date: Fri, 19 Jan 2024 08:10:38 -0800 Subject: [PATCH] CPlusPlus: deal with QByteArray::(c)begin() return nullptr You should either use begin() and end(), or data() and size(), and either way you shouldn't dereference the first iterator if the size is zero. Roberto's parser in 3rdparty/cplusplus assumes you've passed at least one character (I'm guessing the null terminator) and does pointer manipulation there: void Lexer::setSource(const char *firstChar, const char *lastChar) { _firstChar = firstChar; _lastChar = lastChar; _currentChar = _firstChar - 1; _currentCharUtf16 = ~0; _tokenStart = _currentChar; _yychar = '\n'; } Note the _firstChar - 1 math is technically UB if firstChar is the actual first character of any buffer allocation or string. Fixes: QTCREATORBUG-30044 Change-Id: I76ffba14ece04f24b43efffd17abcb8102497813 Reviewed-by: Christian Kandeler --- src/libs/3rdparty/cplusplus/TranslationUnit.cpp | 2 ++ src/libs/cplusplus/CppDocument.cpp | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/libs/3rdparty/cplusplus/TranslationUnit.cpp b/src/libs/3rdparty/cplusplus/TranslationUnit.cpp index 848f61285cb..e680ee2660e 100644 --- a/src/libs/3rdparty/cplusplus/TranslationUnit.cpp +++ b/src/libs/3rdparty/cplusplus/TranslationUnit.cpp @@ -27,6 +27,7 @@ #include "Literals.h" #include "DiagnosticClient.h" +#include "cppassert.h" #include #include @@ -87,6 +88,7 @@ int TranslationUnit::sourceLength() const void TranslationUnit::setSource(const char *source, int size) { + CPP_CHECK(source); _firstSourceChar = source; _lastSourceChar = source + size; } diff --git a/src/libs/cplusplus/CppDocument.cpp b/src/libs/cplusplus/CppDocument.cpp index 6dc59bf1bf1..c7454589aa7 100644 --- a/src/libs/cplusplus/CppDocument.cpp +++ b/src/libs/cplusplus/CppDocument.cpp @@ -527,7 +527,7 @@ Document::Ptr Document::create(const FilePath &filePath) void Document::setUtf8Source(const QByteArray &source) { _source = source; - _translationUnit->setSource(_source.constBegin(), _source.size()); + _translationUnit->setSource(_source.constData(), _source.size()); } LanguageFeatures Document::languageFeatures() const