aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorWaqar Ahmed <waqar.17a@gmail.com>2021-09-20 21:27:11 +0500
committerWaqar Ahmed <waqar.17a@gmail.com>2021-09-20 21:28:21 +0500
commitc57643486fdd47488181e0941f4c913339294529 (patch)
tree1a89e66b3321cb24a85ccd82be7870a9cbbe63a7
parent62d3ade966f27016d96800dd39836971393ac4c5 (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.cpp11
-rw-r--r--tests/use-static-qregularexpression/main.cpp21
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);
+}