diff options
author | Ivan Komissarov <abbapoh@gmail.com> | 2022-07-31 12:49:19 +0300 |
---|---|---|
committer | Ivan Komissarov <ABBAPOH@gmail.com> | 2022-08-01 13:39:34 +0000 |
commit | 267515f31ffdeaf16ec4f189e4404d55f22f71f7 (patch) | |
tree | e4cf17b431ab75bca377c7fc07b77be3d6d63727 /src | |
parent | 6156de764ee3f3f3f72c6944dd140819aef9cf8a (diff) | |
download | qbs-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>
Diffstat (limited to 'src')
-rw-r--r-- | src/lib/pkgconfig/pcparser.cpp | 19 |
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; |