summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorIvan Komissarov <abbapoh@gmail.com>2022-07-31 12:49:19 +0300
committerIvan Komissarov <ABBAPOH@gmail.com>2022-08-01 13:39:34 +0000
commit267515f31ffdeaf16ec4f189e4404d55f22f71f7 (patch)
treee4cf17b431ab75bca377c7fc07b77be3d6d63727
parent6156de764ee3f3f3f72c6944dd140819aef9cf8a (diff)
downloadqbs-267515f31ffdeaf16ec4f189e4404d55f22f71f7.tar.gz
qbspkgconfig: Fix incorrect iterator usages
We ended up dereferencing then end() iterator in many cases. Not that is a problem, but MSVC strict iterators crash in debug. Change-Id: Ie7cf1fd4a37cc37d568943a5bab57ac699f19265 Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
-rw-r--r--src/lib/pkgconfig/pcparser.cpp19
1 files changed, 14 insertions, 5 deletions
diff --git a/src/lib/pkgconfig/pcparser.cpp b/src/lib/pkgconfig/pcparser.cpp
index b314bc1bb..cc8b0ae69 100644
--- a/src/lib/pkgconfig/pcparser.cpp
+++ b/src/lib/pkgconfig/pcparser.cpp
@@ -64,6 +64,15 @@ namespace qbs {
namespace {
+// workaround for a missing ctor before c++20
+template<typename It>
+std::string_view makeStringView(It begin, It end)
+{
+ if (begin == end)
+ return {};
+ return std::string_view(&*begin, std::distance(begin, end));
+}
+
bool readOneLine(std::ifstream &file, std::string &line)
{
bool quoted = false;
@@ -133,7 +142,7 @@ std::string_view trimmed(std::string_view str)
const auto right = std::find_if_not(str.rbegin(), str.rend(), predicate).base();
if (right <= left)
return {};
- return std::string_view(&*left, std::distance(left, right));
+ return makeStringView(left, right);
}
// based on https://opensource.apple.com/source/distcc/distcc-31.0.81/popt/poptparse.c.auto.html
@@ -633,10 +642,10 @@ std::vector<PcPackage::RequiredVersion> PcParser::parseModuleList(PcPackage &pkg
auto start = p;
- while (*p && !std::isspace(*p))
+ while (p != end && !std::isspace(*p))
++p;
- const auto name = std::string_view(&*start, std::distance(start, p));
+ const auto name = makeStringView(start, p);
if (name.empty())
raizeEmptyPackageNameException(pkg);
@@ -651,7 +660,7 @@ std::vector<PcPackage::RequiredVersion> PcParser::parseModuleList(PcPackage &pkg
while (p != end && !std::isspace(*p))
++p;
- const auto comp = std::string_view(&*start, std::distance(start, p));
+ const auto comp = makeStringView(start, p);
ver.comparison = comparisonFromString(pkg, ver.name, comp);
while (p != end && std::isspace(*p))
@@ -662,7 +671,7 @@ std::vector<PcPackage::RequiredVersion> PcParser::parseModuleList(PcPackage &pkg
while (p != end && !std::isspace(*p))
++p;
- const auto version = std::string_view(&*start, std::distance(start, p));
+ const auto version = makeStringView(start, p);
while (p != end && std::isspace(*p))
++p;