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

Re: [PATCH 2/2] patch-id: replace `atoi()` with `strtol_i2()`

From
Junio C Hamano <gitster@pobox.com>
Date
Jan 22, 2024, 19:32 UTC
Message-ID
<xmqq8r4htb8r.fsf@gitster.g>
In-Reply-To
<1ece724b1ca7f71542bfef42795fce798563ecde.1705913519.git.gitgitgadget@gmail.com>
"Mohit Marathe via GitGitGadget" <gitgitgadget@gmail.com> writes:
Show 16 quoted lines
>  	static const char digits[] = "0123456789";
>  	const char *q, *r;
> +	char *endp;
>  	int n;
>  
>  	q = p + 4;
>  	n = strspn(q, digits);
>  	if (q[n] == ',') {
>  		q += n + 1;
> -		*p_before = atoi(q);
> +		if (strtol_i2(q, 10, p_before, &endp) != 0)
> +			return 0;
>  		n = strspn(q, digits);
>  	} else {
>  		*p_before = 1;
>  	}

Looking at this code again, because we upfront run strspn() to make sure q[] begins with a run of digits *and* followed by a comma (which is not a digit), I think it is safe to use atoi() and assume it would slurp all the digits. So the lack of another check the use of new helper allows us to do, namely

		if (endp != q + n)
			return 0;

is probably OK, but that is one of the two reasons why you would favor the use of new helper over atoi(), so the upside of this change is not all that great as I originally hoped for X-<.

Not your fault, of course. We would still catch when the digit string that starts q[] is too large to fit in an int, which is an upside.

> -	if (n == 0 || q[n] != ' ' || q[n+1] != '+')
> +	if (q[n] != ' ' || q[n+1] != '+')
>  		return 0;

When we saw q[] that begins with ',' upon entry to this function, we used to say *p_before = 1 and then saw n==0 and realized it is not a good input and returned 0 from the function.

Now we instead peek q[0] and the check says q[0] is not SP so we will return 0 the same way so there is no behaviour change from the upper hunk? The conversion may be correct, but it wasn't explained in the proposed commit log message.

How are the change to stop caring about n==0 here ...
Show 13 quoted lines
>  	r = q + n + 2;
>  	n = strspn(r, digits);
>  	if (r[n] == ',') {
>  		r += n + 1;
> -		*p_after = atoi(r);
> -		n = strspn(r, digits);
> +		if (strtol_i2(r, 10, p_after, &endp) != 0)
> +			return 0;
>  	} else {
>  		*p_after = 1;
>  	}
> -	if (n == 0)
> -		return 0;

... and this change here, linked to the switch from atoi() to strtul_i2()[*]?

It looks like an unrelated behaviour change that is left unexplained.

>  	return 1;
>  }
Thanks for working on this one.
[Footnote]
 * by the way, what a horrible name for a public function.  Yuck.
Previous: Mohit Marathe via GitGitGadgetNext: Mohit Marathe
Message 4 of 24 in “Replace atoi() with strtol_i2()”
  1. 0/2 Replace atoi() with strtol_i2()Mohit Marathe via GitGitGadget, Jan 22, 2024
  2. 1/2 git-compat-util: add strtol_i2Mohit Marathe via GitGitGadget, Jan 22, 2024
  3. 2/2 patch-id: replace `atoi()` with `strtol_i2()`Mohit Marathe via GitGitGadget, Jan 22, 2024
  4. Junio C HamanoJan 22, 2024
  5. Mohit MaratheJan 24, 2024
  6. 0/2 Replace atoi() with strtol_i_updated()Mohit Marathe via GitGitGadget, Jan 24, 2024
  7. 1/2 git-compat-util: add strtol_i_updated()Mohit Marathe via GitGitGadget, Jan 24, 2024
  8. 2/2 patch-id: replace `atoi()` with `strtol_i_updated()`Mohit Marathe via GitGitGadget, Jan 24, 2024
  9. 0/2 Replace atoi() with strtol_i_updated()Mohit Marathe via GitGitGadget, Jan 24, 2024
  10. 1/2 git-compat-util: add strtol_i_updated()Mohit Marathe via GitGitGadget, Jan 24, 2024
  11. 2/2 patch-id: replace `atoi()` with `strtol_i_updated()`Mohit Marathe via GitGitGadget, Jan 24, 2024
  12. 0/2 Replace atoi() with strtol_i_updated()Mohit Marathe via GitGitGadget, Jan 24, 2024
  13. 1/2 git-compat-util: add strtol_i_updated()Mohit Marathe via GitGitGadget, Jan 24, 2024
  14. Junio C HamanoJan 24, 2024
  15. 2/2 patch-id: replace `atoi()` with `strtol_i_updated()`Mohit Marathe via GitGitGadget, Jan 24, 2024
  16. Junio C HamanoJan 24, 2024
  17. Mohit MaratheJan 28, 2024
  18. 0/2 Replace atoi() with strtoi_with_tail()Mohit Marathe via GitGitGadget, Jan 28, 2024
  19. 1/2 git-compat-util: add strtoi_with_tail()Mohit Marathe via GitGitGadget, Jan 28, 2024
  20. Junio C HamanoJan 30, 2024
  21. 2/2 patch-id: replace `atoi()` with `strtoi_with_tail`Mohit Marathe via GitGitGadget, Jan 28, 2024
  22. 0/2 Replace atoi() with strtoi_with_tail()Mohit Marathe via GitGitGadget, Feb 4, 2024
  23. 1/2 git-compat-util: add strtoi_with_tail()Mohit Marathe via GitGitGadget, Feb 4, 2024
  24. 2/2 patch-id: replace `atoi()` with `strtoi_with_tail`Mohit Marathe via GitGitGadget, Feb 4, 2024

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.