[llvm] e8a163d - [llvm] Cleanup edit_distance short circuiting
via llvm-commits
llvm-commits at lists.llvm.org
Thu Jan 19 14:20:54 PST 2023
Author: serge-sans-paille
Date: 2023-01-19T23:20:37+01:00
New Revision: e8a163dc03e6913360beb305620104ba129c081c
URL: https://github.com/llvm/llvm-project/commit/e8a163dc03e6913360beb305620104ba129c081c
DIFF: https://github.com/llvm/llvm-project/commit/e8a163dc03e6913360beb305620104ba129c081c.diff
LOG: [llvm] Cleanup edit_distance short circuiting
Also prevent integer overflow if MaximumDistance == UINT_MAX.
This is a follow-up to 6ad1b4095172373590134afff19a7fbad9d7889d
Added:
Modified:
llvm/include/llvm/Option/OptTable.h
llvm/lib/Option/OptTable.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/Option/OptTable.h b/llvm/include/llvm/Option/OptTable.h
index 8f13a31aa4221..0cef9b65d2f23 100644
--- a/llvm/include/llvm/Option/OptTable.h
+++ b/llvm/include/llvm/Option/OptTable.h
@@ -182,7 +182,7 @@ class OptTable {
unsigned findNearest(StringRef Option, std::string &NearestString,
unsigned FlagsToInclude = 0, unsigned FlagsToExclude = 0,
unsigned MinimumLength = 4,
- unsigned MaximumDistance = UINT_MAX - 1) const;
+ unsigned MaximumDistance = UINT_MAX) const;
bool findExact(StringRef Option, std::string &ExactString,
unsigned FlagsToInclude = 0,
diff --git a/llvm/lib/Option/OptTable.cpp b/llvm/lib/Option/OptTable.cpp
index 10f0658bc965a..2e289c58b45a7 100644
--- a/llvm/lib/Option/OptTable.cpp
+++ b/llvm/lib/Option/OptTable.cpp
@@ -233,7 +233,8 @@ unsigned OptTable::findNearest(StringRef Option, std::string &NearestString,
// Consider each [option prefix + option name] pair as a candidate, finding
// the closest match.
- unsigned BestDistance = MaximumDistance + 1;
+ unsigned BestDistance =
+ MaximumDistance == UINT_MAX ? UINT_MAX : MaximumDistance + 1;
SmallString<16> Candidate;
SmallString<16> NormalizedName;
@@ -281,8 +282,12 @@ unsigned OptTable::findNearest(StringRef Option, std::string &NearestString,
// characters of
diff erence, no need to compute the edit distance, it's
// going to be greater than BestDistance. Don't bother computing Candidate
// at all.
- if (std::abs((ssize_t)(CandidatePrefix.size() + CandidateName.size()) -
- (ssize_t)NormalizedName.size()) > (ssize_t)BestDistance) {
+ size_t CandidateSize = CandidatePrefix.size() + CandidateName.size(),
+ NormalizedSize = NormalizedName.size();
+ size_t AbsDiff = CandidateSize > NormalizedSize
+ ? CandidateSize - NormalizedSize
+ : NormalizedSize - CandidateSize;
+ if (AbsDiff > BestDistance) {
continue;
}
Candidate = CandidatePrefix;
More information about the llvm-commits
mailing list