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

Re: [PATCH 1/3] set errno=0 before strtoX calls

From
Patrick Steinhardt <ps@pks.im>
Date
Aug 2, 2024, 05:12 UTC
Message-ID
<ZqxqtIJi4-xBL9Sj@tanuki>
In-Reply-To
<4dbd0bec40a0f9fd715e07a56bc6f12c4b29a83c.1722571853.git.gitgitgadget@gmail.com>
On Fri, Aug 02, 2024 at 04:10:51AM +0000, Kyle Lippincott via GitGitGadget wrote:
Show 13 quoted lines
> From: Kyle Lippincott <spectral@google.com>
> 
> To detect conversion failure after calls to functions like `strtod`, one
> can check `errno == ERANGE`. These functions are not guaranteed to set
> `errno` to `0` on successful conversion, however. Manual manipulation of
> `errno` can likely be avoided by checking that the output pointer
> differs from the input pointer, but that's not how other locations, such
> as parse.c:139, handle this issue; they set errno to 0 prior to
> executing the function.
> 
> For every place I could find a strtoX function with an ERANGE check
> following it, set `errno = 0;` prior to executing the conversion
> function.

Makes sense. I've also gone through callsites and couldn't spot any additional ones that are broken.

Generally speaking, the interfaces provided by the `strtod()` family of functions is just plain awful, and ideally we wouldn't be using them in the Git codebase at all without a wrapper. We already do have wrappers for a subset of those functions, e.g. `strtol_i()`, which use an out pointer to store the result and indicate success via the return value instead of via `errno`.

It would be great if we could extend those wrappers to cover all of the integer types, convert our code base to use them, and then extend our "banned.h" banner. I'm of course not asking you to do that in this patch series.

Out of curiosity, why do you hit those errors in your test setup? Do you use a special libc that behaves differently than the most common ones?

Patrick
Previous: Kyle Lippincott via GitGitGadgetNext: Kyle Lippincott
Message 3 of 29 in “Small fixes for issues detected during internal CI runs”
  1. 0/3 Small fixes for issues detected during internal CI runsKyle Lippincott via GitGitGadget, Aug 2, 2024
  2. 1/3 set errno=0 before strtoX callsKyle Lippincott via GitGitGadget, Aug 2, 2024
  3. Patrick SteinhardtAug 2, 2024
  4. Kyle LippincottAug 2, 2024
  5. Junio C HamanoAug 2, 2024
  6. 2/3 strbuf: set errno to 0 after strbuf_getcwdKyle Lippincott via GitGitGadget, Aug 2, 2024
  7. Junio C HamanoAug 2, 2024
  8. Kyle LippincottAug 2, 2024
  9. 3/3 t6421: fix test to work when repo dir contains d0Kyle Lippincott via GitGitGadget, Aug 2, 2024
  10. Junio C HamanoAug 2, 2024
  11. 0/3 Small fixes for issues detected during internal CI runsKyle Lippincott via GitGitGadget, Aug 2, 2024
  12. 1/3 set errno=0 before strtoX callsKyle Lippincott via GitGitGadget, Aug 2, 2024
  13. Junio C HamanoAug 2, 2024
  14. 2/3 strbuf: set errno to 0 after strbuf_getcwdKyle Lippincott via GitGitGadget, Aug 2, 2024
  15. Junio C HamanoAug 2, 2024
  16. Eric SunshineAug 2, 2024
  17. Junio C HamanoAug 5, 2024
  18. Patrick SteinhardtAug 6, 2024
  19. Kyle LippincottAug 6, 2024
  20. Kyle LippincottAug 2, 2024
  21. Kyle LippincottAug 5, 2024
  22. 3/3 t6421: fix test to work when repo dir contains d0Kyle Lippincott via GitGitGadget, Aug 2, 2024
  23. Junio C HamanoAug 2, 2024
  24. Kyle LippincottAug 3, 2024
  25. Junio C HamanoAug 3, 2024
  26. 0/2 Small fixes for issues detected during internal CI runsKyle Lippincott via GitGitGadget, Aug 5, 2024
  27. 1/2 set errno=0 before strtoX callsKyle Lippincott via GitGitGadget, Aug 5, 2024
  28. 2/2 t6421: fix test to work when repo dir contains d0Kyle Lippincott via GitGitGadget, Aug 5, 2024
  29. Junio C HamanoAug 5, 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.