]> git.ipfire.org Git - thirdparty/git.git/commitdiff
string-list: enable sign compare warnings check
authorshejialuo <shejialuo@gmail.com>
Sun, 29 Jun 2025 04:28:06 +0000 (12:28 +0800)
committerJunio C Hamano <gitster@pobox.com>
Mon, 7 Jul 2025 15:07:46 +0000 (08:07 -0700)
In "add_entry", we call "get_entry_index" function to get the inserted
position. However, as the return type of "get_entry_index" function is
`int`, there is a sign compare warning when comparing the `index` with
the `list-nr` of unsigned type.

"get_entry_index" would always return unsigned index. However, the
current binary search algorithm initializes "left" to be "-1", which
necessitates the use of signed `int` return type.

The reason why we need to assign "left" to be "-1" is that in the
`while` loop, we increment "left" by 1 to determine whether the loop
should end. This design choice, while functional, forces us to use
signed arithmetic throughout the function.

To resolve this sign comparison issue, let's modify the binary search
algorithm with the following approach:

1. Initialize "left" to 0 instead of -1
2. Use `left < right` as the loop termination condition instead of
   `left + 1 < right`
3. When searching the right part, set `left = middle + 1` instead of
   `middle`

Then, we could delete "#define DISABLE_SIGN_COMPARE_WARNING" to enable
sign warnings check for "string-list".

Signed-off-by: shejialuo <shejialuo@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
string-list.c

index 171cef5dbbd9ba1fa2c89f0090b96b5c6af74671..53faaa84207bf90901a26ccc89217c44191ec352 100644 (file)
@@ -1,5 +1,3 @@
-#define DISABLE_SIGN_COMPARE_WARNINGS
-
 #include "git-compat-util.h"
 #include "string-list.h"
 
@@ -17,19 +15,19 @@ void string_list_init_dup(struct string_list *list)
 
 /* if there is no exact match, point to the index where the entry could be
  * inserted */
-static int get_entry_index(const struct string_list *list, const char *string,
-               int *exact_match)
+static size_t get_entry_index(const struct string_list *list, const char *string,
+                             int *exact_match)
 {
-       int left = -1, right = list->nr;
+       size_t left = 0, right = list->nr;
        compare_strings_fn cmp = list->cmp ? list->cmp : strcmp;
 
-       while (left + 1 < right) {
-               int middle = left + (right - left) / 2;
+       while (left < right) {
+               size_t middle = left + (right - left) / 2;
                int compare = cmp(string, list->items[middle].string);
                if (compare < 0)
                        right = middle;
                else if (compare > 0)
-                       left = middle;
+                       left = middle + 1;
                else {
                        *exact_match = 1;
                        return middle;
@@ -40,10 +38,10 @@ static int get_entry_index(const struct string_list *list, const char *string,
        return right;
 }
 
-static int add_entry(struct string_list *list, const char *string)
+static size_t add_entry(struct string_list *list, const char *string)
 {
        int exact_match = 0;
-       int index = get_entry_index(list, string, &exact_match);
+       size_t index = get_entry_index(list, string, &exact_match);
 
        if (exact_match)
                return index;
@@ -62,7 +60,7 @@ static int add_entry(struct string_list *list, const char *string)
 
 struct string_list_item *string_list_insert(struct string_list *list, const char *string)
 {
-       int index = add_entry(list, string);
+       size_t index = add_entry(list, string);
 
        return list->items + index;
 }