git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v3 4/8] string-list: enable sign compare warnings check

From
shejialuo <shejialuo@gmail.com>
Date
Jun 29, 2025, 04:28 UTC
Message-ID
<aGDA1lr_-CXbq75G@ArchLinux>
In-Reply-To
<aGDAZ6a0-PyXXGmK@ArchLinux>

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>
---
 string-list.c | 20 +++++++++-----------
 1 file changed, 9 insertions(+), 11 deletions(-)
diff --git a/string-list.c b/string-list.c
index 171cef5dbb..53faaa8420 100644
--- a/string-list.c
+++ b/string-list.c
@@ -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;
 }
-- 
2.50.0
Previous: shejialuoNext: shejialuo
Message 46 of 52 in “enhance "string_list" code and test”
  1. 0/5 enhance "string_list" code and testshejialuo, Apr 22, 2025
  2. 1/5 string-list: fix sign compare warningsshejialuo, Apr 22, 2025
  3. Junio C HamanoApr 22, 2025
  4. shejialuoApr 24, 2025
  5. 2/5 u-string-list: move "test_split" into "u-string-list.c"shejialuo, Apr 22, 2025
  6. Junio C HamanoApr 22, 2025
  7. shejialuoApr 24, 2025
  8. Patrick SteinhardtApr 23, 2025
  9. shejialuoApr 24, 2025
  10. 3/5 u-string-list: move "test_split_in_place" to "u-string-list.c"shejialuo, Apr 22, 2025
  11. Patrick SteinhardtApr 23, 2025
  12. 4/5 u-string-list: move "filter string" test to "u-string-list.c"shejialuo, Apr 22, 2025
  13. 5/5 u-string-list: move "remove duplicates" test to "u-string-list.c"shejialuo, Apr 22, 2025
  14. Patrick SteinhardtApr 23, 2025
  15. shejialuoApr 24, 2025
  16. 0/8 enhance "string_list" code and testshejialuo, May 18, 2025
  17. 1/8 string-list: fix sign compare warnings for loop iteratorshejialuo, May 18, 2025
  18. Patrick SteinhardtMay 19, 2025
  19. shejialuoMay 26, 2025
  20. 2/8 string-list: remove unused "insert_at" parameter from add_entryshejialuo, May 18, 2025
  21. Patrick SteinhardtMay 19, 2025
  22. shejialuoMay 26, 2025
  23. Jeff KingMay 19, 2025
  24. shejialuoMay 26, 2025
  25. Patrick SteinhardtMay 26, 2025
  26. 3/8 string-list: return index directly when inserting an existing elementshejialuo, May 18, 2025
  27. Patrick SteinhardtMay 19, 2025
  28. shejialuoMay 26, 2025
  29. Jeff KingMay 19, 2025
  30. shejialuoMay 26, 2025
  31. 4/8 string-list: enable sign compare warnings checkshejialuo, May 18, 2025
  32. Patrick SteinhardtMay 19, 2025
  33. shejialuoMay 26, 2025
  34. 5/8 u-string-list: move "test_split" into "u-string-list.c"shejialuo, May 18, 2025
  35. Patrick SteinhardtMay 19, 2025
  36. 6/8 u-string-list: move "test_split_in_place" to "u-string-list.c"shejialuo, May 18, 2025
  37. 7/8 u-string-list: move "filter string" test to "u-string-list.c"shejialuo, May 18, 2025
  38. Patrick SteinhardtMay 19, 2025
  39. shejialuoMay 26, 2025
  40. 8/8 u-string-list: move "remove duplicates" test to "u-string-list.c"shejialuo, May 18, 2025
  41. Patrick SteinhardtMay 19, 2025
  42. 0/8 enhance "string_list" code and testshejialuo, Jun 29, 2025
  43. 1/8 string-list: fix sign compare warnings for loop iteratorshejialuo, Jun 29, 2025
  44. 2/8 string-list: remove unused "insert_at" parameter from add_entryshejialuo, Jun 29, 2025
  45. 3/8 string-list: return index directly when inserting an existing elementshejialuo, Jun 29, 2025
  46. 4/8 string-list: enable sign compare warnings checkshejialuo, Jun 29, 2025
  47. 5/8 u-string-list: move "test_split" into "u-string-list.c"shejialuo, Jun 29, 2025
  48. 6/8 u-string-list: move "test_split_in_place" to "u-string-list.c"shejialuo, Jun 29, 2025
  49. 7/8 u-string-list: move "filter string" test to "u-string-list.c"shejialuo, Jun 29, 2025
  50. 8/8 u-string-list: move "remove duplicates" test to "u-string-list.c"shejialuo, Jun 29, 2025
  51. Patrick SteinhardtJul 4, 2025
  52. Junio C HamanoJul 7, 2025

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.