Skip to content

Commit 67cfd29

Browse files
shejialuogitster
authored andcommitted
string-list: enable sign compare warnings check
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 <[email protected]> Signed-off-by: Junio C Hamano <[email protected]>
1 parent 885becd commit 67cfd29

File tree

1 file changed

+9
-11
lines changed

1 file changed

+9
-11
lines changed

string-list.c

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
#define DISABLE_SIGN_COMPARE_WARNINGS
2-
31
#include "git-compat-util.h"
42
#include "string-list.h"
53

@@ -17,19 +15,19 @@ void string_list_init_dup(struct string_list *list)
1715

1816
/* if there is no exact match, point to the index where the entry could be
1917
* inserted */
20-
static int get_entry_index(const struct string_list *list, const char *string,
21-
int *exact_match)
18+
static size_t get_entry_index(const struct string_list *list, const char *string,
19+
int *exact_match)
2220
{
23-
int left = -1, right = list->nr;
21+
size_t left = 0, right = list->nr;
2422
compare_strings_fn cmp = list->cmp ? list->cmp : strcmp;
2523

26-
while (left + 1 < right) {
27-
int middle = left + (right - left) / 2;
24+
while (left < right) {
25+
size_t middle = left + (right - left) / 2;
2826
int compare = cmp(string, list->items[middle].string);
2927
if (compare < 0)
3028
right = middle;
3129
else if (compare > 0)
32-
left = middle;
30+
left = middle + 1;
3331
else {
3432
*exact_match = 1;
3533
return middle;
@@ -40,10 +38,10 @@ static int get_entry_index(const struct string_list *list, const char *string,
4038
return right;
4139
}
4240

43-
static int add_entry(struct string_list *list, const char *string)
41+
static size_t add_entry(struct string_list *list, const char *string)
4442
{
4543
int exact_match = 0;
46-
int index = get_entry_index(list, string, &exact_match);
44+
size_t index = get_entry_index(list, string, &exact_match);
4745

4846
if (exact_match)
4947
return index;
@@ -62,7 +60,7 @@ static int add_entry(struct string_list *list, const char *string)
6260

6361
struct string_list_item *string_list_insert(struct string_list *list, const char *string)
6462
{
65-
int index = add_entry(list, string);
63+
size_t index = add_entry(list, string);
6664

6765
return list->items + index;
6866
}

0 commit comments

Comments
 (0)