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

Re: [PATCH v3 03/10] commit-graph: fix type for some write options

From
Patrick Steinhardt <ps@pks.im>
Date
Aug 11, 2025, 08:24 UTC
Message-ID
<aJmouVRjPrBlLvrT@pks.im>
In-Reply-To
<xmqqv7mykb65.fsf@gitster.g>
On Thu, Aug 07, 2025 at 03:40:50PM -0700, Junio C Hamano wrote:
Show 30 quoted lines
> Patrick Steinhardt <ps@pks.im> writes:
> 
> > The options "max-commits" and "size-multiple" are both supposed to be
> > positive integers and are documented as such, but we use a signed
> > integer field to store them. This causes sign comparison warnings in
> > `split_graph_merge_strategy()` because we end up comparing the option
> > values with the observed number of commits.
> >
> > Fix the issue by converting the fields to be unsigned and convert the
> > options to use `OPT_UNSIGNED()` accordingly. This macro has only been
> > introduced recently, which might explain why the option values were
> > signed in the first place.
> 
> These are platform natural "int" from their inception at c2bc6e6a
> (commit-graph: create options for split files, 2019-06-18), which
> way predates the recent push to appease -Wsign-compare, so yes, it
> does explain it.  But because the developer who wrote it in the
> first place is around and with us, why not ask them instead of
> speculating?
> 
> As the max_commits member is comparable to 4-byte network byte order
> integer that is .num_commits in the file, using platform natural
> "int" or int32_t is not correct, because you may not be able to tell
> the command to hold 3 billion objects before splitting, even though
> the underlying file format does support such settings.  It has to be
> uint32_t or wider (but if it is wider, you'd need to be prepared to
> correctly compare max_commits with num_commits, and take an overly
> large max as "unlimited", or something).  And unsigned usually is at
> least that wide, so the change may be justified.  I do not see a
> reason why we want to avoid using uint32_t, though.

Using `uint32_t` might cause regressions on some platforms. If for example a signed integer was 64 bits on certain platforms and we restrict it to `uint32_t` then we'd now refuse to take any values between `2^32` and `2^63`, even though those are valid values that we accepted beforehand. So if somebody was using any such value to say "make this essentially unlimited" then we'd now die.

But by using `unsigned` we avoid this pitfall, as we only extend the range of accepted valid values.

Show 8 quoted lines
> As to size_multiple, it appears to me that the number is really
> designed to be a small integer (for which even 100 is probably way
> too many), so I do not see any reason to insist it to be unsigned.
> Even "short" _ought_ to do fine.  And if our macros and compiler
> settings do not support it well and DEVELOPER=YesPlease build
> complain, that is what we need to fix.  Papering over the problem by
> using unnecessarily wide type, or by using signedness that happens
> to squelch the misguided compiler warnings, is skirting around it.
Yeah, it is. At one point I was pondering whether we should extend our
parse-options interface to allow restricting to arbitrary values like
100. I even implemented all of this, but ultimately discarded it because
it wasn't easy to decide where we can retroactively harden accepted
values without causing regressions.

While large values for options may frequently be unreasonable, it wouldn't be the first time that I see users doing unreasonable things intentfully. And sometimes the outcome is even something sensible.

Patrick
Previous: Junio C HamanoNext: Patrick Steinhardt
Message 54 of 69 in “commit-graph: remove reliance on global state”
  1. 0/9 commit-graph: remove reliance on global statePatrick Steinhardt, Aug 4, 2025
  2. 1/9 trace2: introduce function to trace unsigned integersPatrick Steinhardt, Aug 4, 2025
  3. Taylor BlauAug 4, 2025
  4. 2/9 commit-graph: stop using signed integers to count bloom filtersPatrick Steinhardt, Aug 4, 2025
  5. Oswald BuddenhagenAug 4, 2025
  6. Patrick SteinhardtAug 4, 2025
  7. Junio C HamanoAug 4, 2025
  8. Taylor BlauAug 4, 2025
  9. Patrick SteinhardtAug 6, 2025
  10. Oswald BuddenhagenAug 6, 2025
  11. Junio C HamanoAug 6, 2025
  12. Junio C HamanoAug 6, 2025
  13. Patrick SteinhardtAug 7, 2025
  14. Junio C HamanoAug 7, 2025
  15. Patrick SteinhardtAug 11, 2025
  16. Junio C HamanoAug 5, 2025
  17. Taylor BlauAug 4, 2025
  18. 3/9 commit-graph: fix type for some write optionsPatrick Steinhardt, Aug 4, 2025
  19. Taylor BlauAug 4, 2025
  20. 4/9 commit-graph: fix sign comparison warningsPatrick Steinhardt, Aug 4, 2025
  21. Taylor BlauAug 4, 2025
  22. Patrick SteinhardtAug 6, 2025
  23. 5/9 commit-graph: stop using `the_hash_algo` via macrosPatrick Steinhardt, Aug 4, 2025
  24. Taylor BlauAug 4, 2025
  25. 6/9 commit-graph: store the hash algorithm instead of its lengthPatrick Steinhardt, Aug 4, 2025
  26. Taylor BlauAug 4, 2025
  27. 7/9 commit-graph: stop using `the_hash_algo`Patrick Steinhardt, Aug 4, 2025
  28. Taylor BlauAug 4, 2025
  29. Patrick SteinhardtAug 6, 2025
  30. 8/9 commit-graph: stop using `the_repository`Patrick Steinhardt, Aug 4, 2025
  31. Taylor BlauAug 4, 2025
  32. 9/9 commit-graph: stop passing in redundant repositoryPatrick Steinhardt, Aug 4, 2025
  33. Derrick StoleeAug 5, 2025
  34. Patrick SteinhardtAug 6, 2025
  35. 00/10 commit-graph: remove reliance on global statePatrick Steinhardt, Aug 6, 2025
  36. 01/10 trace2: introduce function to trace unsigned integersPatrick Steinhardt, Aug 6, 2025
  37. 02/10 commit-graph: stop using signed integers to count Bloom filtersPatrick Steinhardt, Aug 6, 2025
  38. 03/10 commit-graph: fix type for some write optionsPatrick Steinhardt, Aug 6, 2025
  39. Oswald BuddenhagenAug 6, 2025
  40. Junio C HamanoAug 6, 2025
  41. Patrick SteinhardtAug 7, 2025
  42. 04/10 commit-graph: fix sign comparison warningsPatrick Steinhardt, Aug 6, 2025
  43. 05/10 commit-graph: stop using `the_hash_algo` via macrosPatrick Steinhardt, Aug 6, 2025
  44. 06/10 commit-graph: store the hash algorithm instead of its lengthPatrick Steinhardt, Aug 6, 2025
  45. 07/10 commit-graph: refactor `parse_commit_graph()` to take a repositoryPatrick Steinhardt, Aug 6, 2025
  46. 08/10 commit-graph: stop using `the_hash_algo`Patrick Steinhardt, Aug 6, 2025
  47. 09/10 commit-graph: stop using `the_repository`Patrick Steinhardt, Aug 6, 2025
  48. 10/10 commit-graph: stop passing in redundant repositoryPatrick Steinhardt, Aug 6, 2025
  49. 00/10 commit-graph: remove reliance on global statePatrick Steinhardt, Aug 7, 2025
  50. 01/10 trace2: introduce function to trace unsigned integersPatrick Steinhardt, Aug 7, 2025
  51. 02/10 commit-graph: stop using signed integers to count Bloom filtersPatrick Steinhardt, Aug 7, 2025
  52. 03/10 commit-graph: fix type for some write optionsPatrick Steinhardt, Aug 7, 2025
  53. Junio C HamanoAug 7, 2025
  54. Patrick SteinhardtAug 11, 2025
  55. 04/10 commit-graph: fix sign comparison warningsPatrick Steinhardt, Aug 7, 2025
  56. 05/10 commit-graph: stop using `the_hash_algo` via macrosPatrick Steinhardt, Aug 7, 2025
  57. 06/10 commit-graph: store the hash algorithm instead of its lengthPatrick Steinhardt, Aug 7, 2025
  58. 07/10 commit-graph: refactor `parse_commit_graph()` to take a repositoryPatrick Steinhardt, Aug 7, 2025
  59. 08/10 commit-graph: stop using `the_hash_algo`Patrick Steinhardt, Aug 7, 2025
  60. 09/10 commit-graph: stop using `the_repository`Patrick Steinhardt, Aug 7, 2025
  61. 10/10 commit-graph: stop passing in redundant repositoryPatrick Steinhardt, Aug 7, 2025
  62. 0/6 commit-graph: remove reliance on global statePatrick Steinhardt, Aug 15, 2025
  63. 1/6 commit-graph: stop using `the_hash_algo` via macrosPatrick Steinhardt, Aug 15, 2025
  64. 2/6 commit-graph: store the hash algorithm instead of its lengthPatrick Steinhardt, Aug 15, 2025
  65. 3/6 commit-graph: refactor `parse_commit_graph()` to take a repositoryPatrick Steinhardt, Aug 15, 2025
  66. 4/6 commit-graph: stop using `the_hash_algo`Patrick Steinhardt, Aug 15, 2025
  67. 5/6 commit-graph: stop using `the_repository`Patrick Steinhardt, Aug 15, 2025
  68. 6/6 commit-graph: stop passing in redundant repositoryPatrick Steinhardt, Aug 15, 2025
  69. Derrick StoleeAug 15, 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.