[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