aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Lohnau <alexander.lohnau@gmx.de>2024-02-04 12:13:57 +0100
committerAlexander Lohnau <alexander.lohnau@gmx.de>2024-02-04 12:13:57 +0100
commitf12535358fa2589253ffc7efb79f7aec7c17277e (patch)
tree5e117f8ac4201bba36a147ca19251061950e2e3e
parentf349fee9376f9e1df31129532f25887310d43be3 (diff)
qgetenv: Fix wrong fixit being provided for qEnvironmentVariableIntValue, ignore wontfix case
-rw-r--r--src/checks/level0/qgetenv.cpp28
-rw-r--r--tests/qgetenv/main.cpp4
-rw-r--r--tests/qgetenv/main.cpp.expected3
-rw-r--r--tests/qgetenv/main.cpp.fixed.expected4
4 files changed, 27 insertions, 12 deletions
diff --git a/src/checks/level0/qgetenv.cpp b/src/checks/level0/qgetenv.cpp
index a2afca55..6c05434f 100644
--- a/src/checks/level0/qgetenv.cpp
+++ b/src/checks/level0/qgetenv.cpp
@@ -70,6 +70,7 @@ void QGetEnv::VisitStmt(clang::Stmt *stmt)
StringRef methodname = clazy::name(method);
std::string errorMsg;
std::string replacement;
+ bool shouldIncludeBaseParameter = false;
if (methodname == "isEmpty") {
errorMsg = "qgetenv().isEmpty() allocates.";
replacement = "qEnvironmentVariableIsEmpty";
@@ -79,16 +80,25 @@ void QGetEnv::VisitStmt(clang::Stmt *stmt)
} else if (methodname == "toInt") {
errorMsg = "qgetenv().toInt() is slow.";
replacement = "qEnvironmentVariableIntValue";
- }
-
- if (!errorMsg.empty()) {
- std::vector<FixItHint> fixits;
- const bool success = clazy::transformTwoCallsIntoOne(&m_astContext, qgetEnvCall, memberCall, replacement, fixits);
- if (!success) {
- queueManualFixitWarning(clazy::getLocStart(memberCall));
+ for (unsigned int i = 0; i < memberCall->getNumArgs(); ++i) {
+ if (!dyn_cast<CXXDefaultArgExpr>(memberCall->getArg(i))) {
+ if (i == 0) {
+ shouldIncludeBaseParameter = true;
+ }
+ if (i > 0) {
+ return; // Second toInt arg (base) is not supported by qEnvironmentVariableIntValue
+ }
+ }
}
+ } else {
+ return;
+ }
- errorMsg += " Use " + replacement + "() instead";
- emitWarning(clazy::getLocStart(memberCall), errorMsg, fixits);
+ std::string getEnvArgStr = Lexer::getSourceText(CharSourceRange::getTokenRange(qgetEnvCall->getArg(0)->getSourceRange()), sm(), lo()).str();
+ if (shouldIncludeBaseParameter) {
+ getEnvArgStr += ", " + Lexer::getSourceText(CharSourceRange::getTokenRange(memberCall->getArg(0)->getSourceRange()), sm(), lo()).str();
}
+
+ errorMsg += " Use " + replacement + "() instead";
+ emitWarning(clazy::getLocStart(memberCall), errorMsg, {FixItHint::CreateReplacement(stmt->getSourceRange(), replacement + "(" + getEnvArgStr + ")")});
}
diff --git a/tests/qgetenv/main.cpp b/tests/qgetenv/main.cpp
index 5fa6f635..0ab1a6a6 100644
--- a/tests/qgetenv/main.cpp
+++ b/tests/qgetenv/main.cpp
@@ -7,6 +7,8 @@ int test()
qgetenv("Foo").isEmpty();
bool b = qgetenv("Foo").isNull();
QByteArray ba = qgetenv("Foo");
- int a = qgetenv("Foo").toInt(&b);
+ int ignoreOK = qgetenv("Foo").toInt();
+ int checkOK = qgetenv("Foo").toInt(&b);
+ int dontfix = qgetenv("Foo").toInt(&b, 16);
return 0;
}
diff --git a/tests/qgetenv/main.cpp.expected b/tests/qgetenv/main.cpp.expected
index a3389631..636f3a28 100644
--- a/tests/qgetenv/main.cpp.expected
+++ b/tests/qgetenv/main.cpp.expected
@@ -1,3 +1,4 @@
qgetenv/main.cpp:7:5: warning: qgetenv().isEmpty() allocates. Use qEnvironmentVariableIsEmpty() instead [-Wclazy-qgetenv]
qgetenv/main.cpp:8:14: warning: qgetenv().isNull() allocates. Use qEnvironmentVariableIsSet() instead [-Wclazy-qgetenv]
-qgetenv/main.cpp:10:13: warning: qgetenv().toInt() is slow. Use qEnvironmentVariableIntValue() instead [-Wclazy-qgetenv]
+qgetenv/main.cpp:10:20: warning: qgetenv().toInt() is slow. Use qEnvironmentVariableIntValue() instead [-Wclazy-qgetenv]
+qgetenv/main.cpp:11:19: warning: qgetenv().toInt() is slow. Use qEnvironmentVariableIntValue() instead [-Wclazy-qgetenv]
diff --git a/tests/qgetenv/main.cpp.fixed.expected b/tests/qgetenv/main.cpp.fixed.expected
index ad76a5a3..393e2ba5 100644
--- a/tests/qgetenv/main.cpp.fixed.expected
+++ b/tests/qgetenv/main.cpp.fixed.expected
@@ -7,6 +7,8 @@ int test()
qEnvironmentVariableIsEmpty("Foo");
bool b = qEnvironmentVariableIsSet("Foo");
QByteArray ba = qgetenv("Foo");
- int a = qEnvironmentVariableIntValue("Foo");
+ int ignoreOK = qEnvironmentVariableIntValue("Foo");
+ int checkOK = qEnvironmentVariableIntValue("Foo", &b);
+ int dontfix = qgetenv("Foo").toInt(&b, 16);
return 0;
}