diff options
Diffstat (limited to 'clang-tools-extra/clang-tidy/bugprone/SuspiciousMemsetUsageCheck.cpp')
-rw-r--r-- | clang-tools-extra/clang-tidy/bugprone/SuspiciousMemsetUsageCheck.cpp | 23 |
1 files changed, 8 insertions, 15 deletions
diff --git a/clang-tools-extra/clang-tidy/bugprone/SuspiciousMemsetUsageCheck.cpp b/clang-tools-extra/clang-tidy/bugprone/SuspiciousMemsetUsageCheck.cpp index ca3c126340b..2e0a46c91a7 100644 --- a/clang-tools-extra/clang-tidy/bugprone/SuspiciousMemsetUsageCheck.cpp +++ b/clang-tools-extra/clang-tidy/bugprone/SuspiciousMemsetUsageCheck.cpp @@ -76,13 +76,10 @@ void SuspiciousMemsetUsageCheck::check(const MatchFinder::MatchResult &Result) { // Case 2: fill_char of memset() is larger in size than an unsigned char // so it gets truncated during conversion. + llvm::APSInt NumValue; const auto UCharMax = (1 << Result.Context->getCharWidth()) - 1; - Expr::EvalResult EVResult; - if (!NumFill->EvaluateAsInt(EVResult, *Result.Context)) - return; - - llvm::APSInt NumValue = EVResult.Val.getInt(); - if (NumValue >= 0 && NumValue <= UCharMax) + if (!NumFill->EvaluateAsInt(NumValue, *Result.Context) || + (NumValue >= 0 && NumValue <= UCharMax)) return; diag(NumFill->getBeginLoc(), "memset fill value is out of unsigned " @@ -97,22 +94,18 @@ void SuspiciousMemsetUsageCheck::check(const MatchFinder::MatchResult &Result) { const Expr *ByteCount = Call->getArg(2); // Return if `byte_count` is not zero at compile time. - Expr::EvalResult Value2; + llvm::APSInt Value1, Value2; if (ByteCount->isValueDependent() || - !ByteCount->EvaluateAsInt(Value2, *Result.Context) || - Value2.Val.getInt() != 0) + !ByteCount->EvaluateAsInt(Value2, *Result.Context) || Value2 != 0) return; // Return if `fill_char` is known to be zero or negative at compile // time. In these cases, swapping the args would be a nop, or // introduce a definite bug. The code is likely correct. - Expr::EvalResult EVResult; if (!FillChar->isValueDependent() && - FillChar->EvaluateAsInt(EVResult, *Result.Context)) { - llvm::APSInt Value1 = EVResult.Val.getInt(); - if (Value1 == 0 || Value1.isNegative()) - return; - } + FillChar->EvaluateAsInt(Value1, *Result.Context) && + (Value1 == 0 || Value1.isNegative())) + return; // `byte_count` is known to be zero at compile time, and `fill_char` is // either not known or known to be a positive integer. Emit a warning |