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

[GSoC PATCH] rm: fix sign comparison warnings

From
Arnav Bhate <bhatearnav@gmail.com>
Date
Mar 12, 2025, 20:19 UTC
Message-ID
<38de63ce-6d4e-4f1f-95b1-049df78d9cfc@gmail.com>

There are multiple places in loops, where a signed and an unsigned data type are compared. Git uses a mix of signed and unsigned types to store lengths of arrays. This sometimes leads to using a signed index for an array whose length is stored in an unsigned variable or vice versa.

get_ours_cache_pos is a special case where the initial index is derived from a signed variable, however, upon checking the usage of the function, it is clear that it cannot be negative, and hence can be replaced by an unsigned variable.

Replace signed data types with unsigned data types and vice versa wherever necessary. In some cases, introduce a new variable, where both signed and unsigned data types have been used to store lengths of arrays in the same function, where previously only one variable was used to iterate over both types. Remove #define DISABLE_SIGN_COMPARE_WARNINGS.

Signed-off-by: Arnav Bhate <bhatearnav@gmail.com>
---
 builtin/rm.c | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)
diff --git a/builtin/rm.c b/builtin/rm.c
index 12ae086a55..4ebfa7539d 100644
--- a/builtin/rm.c
+++ b/builtin/rm.c
@@ -5,7 +5,6 @@
  */
 
 #define USE_THE_REPOSITORY_VARIABLE
-#define DISABLE_SIGN_COMPARE_WARNINGS
 
 #include "builtin.h"
 #include "advice.h"
@@ -42,7 +41,12 @@ static struct {
 
 static int get_ours_cache_pos(const char *path, int pos)
 {
-	int i = -pos - 1;
+	/*
+	 * This function is only called when pos < 0, so -pos - 1 is
+	 * greater than or equal to 0, so it can be safely be stored in
+	 * an unsigned int.
+	 */
+	unsigned int i = -pos - 1;
 
 	while ((i < the_repository->index->cache_nr) && !strcmp(the_repository->index->cache[i]->name, path)) {
 		if (ce_stage(the_repository->index->cache[i]) == 2)
@@ -58,7 +62,7 @@ static void print_error_files(struct string_list *files_list,
 			      int *errs)
 {
 	if (files_list->nr) {
-		int i;
+		unsigned int i;
 		struct strbuf err_msg = STRBUF_INIT;
 
 		strbuf_addstr(&err_msg, main_msg);
@@ -271,6 +275,7 @@ int cmd_rm(int argc,
 {
 	struct lock_file lock_file = LOCK_INIT;
 	int i, ret = 0;
+	unsigned int j;
 	struct pathspec pathspec;
 	char *seen;
 
@@ -314,8 +319,8 @@ int cmd_rm(int argc,
 	if (pathspec_needs_expanded_index(the_repository->index, &pathspec))
 		ensure_full_index(the_repository->index);
 
-	for (i = 0; i < the_repository->index->cache_nr; i++) {
-		const struct cache_entry *ce = the_repository->index->cache[i];
+	for (j = 0; j < the_repository->index->cache_nr; j++) {
+		const struct cache_entry *ce = the_repository->index->cache[j];
 
 		if (!include_sparse &&
 		    (ce_skip_worktree(ce) ||
-- 
2.48.1
Next: Junio C Hamano
Message 1 of 15 in “rm: fix sign comparison warnings”
  1. rm: fix sign comparison warningsArnav Bhate, Mar 12, 2025
  2. Junio C HamanoMar 13, 2025
  3. Karthik NayakMar 13, 2025
  4. Arnav BhateMar 13, 2025
  5. Karthik NayakMar 13, 2025
  6. Junio C HamanoMar 13, 2025
  7. Arnav BhateMar 13, 2025
  8. rm: fix sign comparison warningsArnav Bhate, Mar 16, 2025
  9. Junio C HamanoMar 17, 2025
  10. Arnav BhateMar 17, 2025
  11. rm: fix sign comparison warningsArnav Bhate, Mar 17, 2025
  12. Arnav BhateMar 17, 2025
  13. rm: fix sign comparison warningsArnav Bhate, Mar 17, 2025
  14. rm: fix sign comparison warningsArnav Bhate, Mar 29, 2025
  15. Arnav BhateMar 29, 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.