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
Mohit Marathe <mohitmarathe@proton.me>
Date
Jan 24, 2024, 04:22 UTC
Message-ID
<cwwH6NrWMc0fRUiirzvQmY-FoUS12K1SLSkBAbbu_QgAR7aDlvby6hgI_puXwtRSwX86zw6FQjUs1yHcPm8LcxuWhDnfG-4f0XRMjtTIVwU=@proton.me>
In-Reply-To
<xmqq8r4htb8r.fsf@gitster.g>
On Tuesday, January 23rd, 2024 at 1:02 AM, Junio C Hamano <gitster@pobox.com> wrote:
Show 45 quoted lines
> "Mohit Marathe via GitGitGadget" gitgitgadget@gmail.com writes:
> 
> > 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.

Uh oh, I just looked at the `if` block and concluded that it was just to check if it has numbers after the ',', which`strtol_i2()` already does. But I totally missed this one.

Show 38 quoted lines
> 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 ...
> 
> > 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.
Yeah, I thought so too /:D How does `strtol_i_updated` sounds?
Thanks for you feedback! I will send v2 with the corrections soon.
Previous: Junio C HamanoNext: Mohit Marathe via GitGitGadget
Message 5 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.