diff options
author | Waqar Ahmed <waqar.17a@gmail.com> | 2021-09-20 21:27:11 +0500 |
---|---|---|
committer | Waqar Ahmed <waqar.17a@gmail.com> | 2021-09-20 21:28:21 +0500 |
commit | c57643486fdd47488181e0941f4c913339294529 (patch) | |
tree | 1a89e66b3321cb24a85ccd82be7870a9cbbe63a7 | |
parent | 62d3ade966f27016d96800dd39836971393ac4c5 (diff) |
Fix check for temporary QString when checking QRegularExpression
Every QRegularExpression constructed from a temporary QString is not
warnable.
-rw-r--r-- | src/checks/level0/use-static-qregularexpression.cpp | 11 | ||||
-rw-r--r-- | tests/use-static-qregularexpression/main.cpp | 21 |
2 files changed, 31 insertions, 1 deletions
diff --git a/src/checks/level0/use-static-qregularexpression.cpp b/src/checks/level0/use-static-qregularexpression.cpp index 0f2aed83..fb851afb 100644 --- a/src/checks/level0/use-static-qregularexpression.cpp +++ b/src/checks/level0/use-static-qregularexpression.cpp @@ -63,6 +63,15 @@ static Expr* getVarInitExpr(VarDecl *VDef) static bool isQStringFromStringLiteral(Expr *qstring) { if (isArgTemporaryObj(qstring)) { + // Is it compile time known QString i.e., not from a function call + auto qstringCtor = clazy::getFirstChildOfType<CXXConstructExpr>(qstring); + if (!qstringCtor) + return false; + + auto *stringLit = clazy::getFirstChildOfType<StringLiteral>(qstringCtor); + if (!stringLit) + return false; + return true; } @@ -82,7 +91,7 @@ static bool isTemporaryQRegexObj(Expr *qregexVar, const LangOptions &lo) { return false; } - // Check if its first arg is "QString" && a temporary OR non-static local + // Check if its first arg is "QString" auto qstrArg = ctor->getArg(0); if (!qstrArg || clazy::typeName(qstrArg->getType(), lo, true) != "QString") { return false; diff --git a/tests/use-static-qregularexpression/main.cpp b/tests/use-static-qregularexpression/main.cpp index a1a18916..b3c4947b 100644 --- a/tests/use-static-qregularexpression/main.cpp +++ b/tests/use-static-qregularexpression/main.cpp @@ -99,3 +99,24 @@ void test_qregexmatch(QString selectedText) QVariant v; v.toRegularExpression().match(selectedText); // No Warn } + +extern QString someText(); +void test_qregexmatch_rvalueString(QString s) +{ + // XValue + RValue arg + QString text; + QRegularExpression(someText()).match(text); // Ok + + // LValue + RValue arg + QRegularExpression re(someText()); + re.match(text); + + QRegularExpression re1("^" + someText()); + re1.match(text); + + QRegularExpression re2("^" + s); + re2.match(text); + + QRegularExpression re3((QString(s))); + re3.match(text); +} |