diff options
author | Alexander Lohnau <alexander.lohnau@gmx.de> | 2024-02-04 12:13:57 +0100 |
---|---|---|
committer | Alexander Lohnau <alexander.lohnau@gmx.de> | 2024-02-04 12:13:57 +0100 |
commit | f12535358fa2589253ffc7efb79f7aec7c17277e (patch) | |
tree | 5e117f8ac4201bba36a147ca19251061950e2e3e | |
parent | f349fee9376f9e1df31129532f25887310d43be3 (diff) |
qgetenv: Fix wrong fixit being provided for qEnvironmentVariableIntValue, ignore wontfix case
-rw-r--r-- | src/checks/level0/qgetenv.cpp | 28 | ||||
-rw-r--r-- | tests/qgetenv/main.cpp | 4 | ||||
-rw-r--r-- | tests/qgetenv/main.cpp.expected | 3 | ||||
-rw-r--r-- | tests/qgetenv/main.cpp.fixed.expected | 4 |
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; } |