string-list API: change "nr" and "alloc" to "size_t"

Change the "nr" and "alloc" members of "struct string_list" to use
"size_t" instead of "nr". On some platforms the size of an "unsigned
int" will be smaller than a "size_t", e.g. a 32 bit unsigned v.s. 64
bit unsigned. As "struct string_list" is a generic API we use in a lot
of places this might cause overflows.

As one example: code in "refs.c" keeps track of the number of refs
with a "size_t", and auxiliary code in builtin/remote.c in
get_ref_states() appends those to a "struct string_list".

While we're at it split the "nr" and "alloc" in string-list.h across
two lines, which is the case for most such struct member
declarations (e.g. in "strbuf.h" and "strvec.h").

Changing e.g. "int i" to "size_t i" in run_and_feed_hook() isn't
strictly necessary, and there are a lot more cases where we'll use a
local "int", "unsigned int" etc. variable derived from the "nr" in the
"struct string_list". But in that case as well as
add_wrapped_shortlog_msg() in builtin/shortlog.c we need to adjust the
printf format referring to "nr" anyway, so let's also change the other
variables referring to it.

Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
Ævar Arnfjörð Bjarmason 2022-03-07 16:27:08 +01:00 коммит произвёл Junio C Hamano
Родитель 6f69325258
Коммит 99d60545f8
9 изменённых файлов: 35 добавлений и 31 удалений

Просмотреть файл

@ -813,13 +813,14 @@ static int run_and_feed_hook(const char *hook_name, feed_fn feed,
proc.trace2_hook_name = hook_name; proc.trace2_hook_name = hook_name;
if (feed_state->push_options) { if (feed_state->push_options) {
int i; size_t i;
for (i = 0; i < feed_state->push_options->nr; i++) for (i = 0; i < feed_state->push_options->nr; i++)
strvec_pushf(&proc.env_array, strvec_pushf(&proc.env_array,
"GIT_PUSH_OPTION_%d=%s", i, "GIT_PUSH_OPTION_%"PRIuMAX"=%s",
(uintmax_t)i,
feed_state->push_options->items[i].string); feed_state->push_options->items[i].string);
strvec_pushf(&proc.env_array, "GIT_PUSH_OPTION_COUNT=%d", strvec_pushf(&proc.env_array, "GIT_PUSH_OPTION_COUNT=%"PRIuMAX"",
feed_state->push_options->nr); (uintmax_t)feed_state->push_options->nr);
} else } else
strvec_pushf(&proc.env_array, "GIT_PUSH_OPTION_COUNT"); strvec_pushf(&proc.env_array, "GIT_PUSH_OPTION_COUNT");

Просмотреть файл

@ -435,7 +435,7 @@ static void add_wrapped_shortlog_msg(struct strbuf *sb, const char *s,
void shortlog_output(struct shortlog *log) void shortlog_output(struct shortlog *log)
{ {
int i, j; size_t i, j;
struct strbuf sb = STRBUF_INIT; struct strbuf sb = STRBUF_INIT;
if (log->sort_by_number) if (log->sort_by_number)
@ -448,10 +448,10 @@ void shortlog_output(struct shortlog *log)
(int)UTIL_TO_INT(item), item->string); (int)UTIL_TO_INT(item), item->string);
} else { } else {
struct string_list *onelines = item->util; struct string_list *onelines = item->util;
fprintf(log->file, "%s (%d):\n", fprintf(log->file, "%s (%"PRIuMAX"):\n",
item->string, onelines->nr); item->string, (uintmax_t)onelines->nr);
for (j = onelines->nr - 1; j >= 0; j--) { for (j = onelines->nr; j >= 1; j--) {
const char *msg = onelines->items[j].string; const char *msg = onelines->items[j - 1].string;
if (log->wrap_lines) { if (log->wrap_lines) {
strbuf_reset(&sb); strbuf_reset(&sb);

Просмотреть файл

@ -255,18 +255,18 @@ int verify_bundle(struct repository *r,
r = &header->references; r = &header->references;
printf_ln(Q_("The bundle contains this ref:", printf_ln(Q_("The bundle contains this ref:",
"The bundle contains these %d refs:", "The bundle contains these %"PRIuMAX" refs:",
r->nr), r->nr),
r->nr); (uintmax_t)r->nr);
list_refs(r, 0, NULL); list_refs(r, 0, NULL);
r = &header->prerequisites; r = &header->prerequisites;
if (!r->nr) { if (!r->nr) {
printf_ln(_("The bundle records a complete history.")); printf_ln(_("The bundle records a complete history."));
} else { } else {
printf_ln(Q_("The bundle requires this ref:", printf_ln(Q_("The bundle requires this ref:",
"The bundle requires these %d refs:", "The bundle requires these %"PRIuMAX" refs:",
r->nr), r->nr),
r->nr); (uintmax_t)r->nr);
list_refs(r, 0, NULL); list_refs(r, 0, NULL);
} }
} }

Просмотреть файл

@ -1690,10 +1690,10 @@ static int fill_oids_from_packs(struct write_commit_graph_context *ctx,
dirlen = packname.len; dirlen = packname.len;
if (ctx->report_progress) { if (ctx->report_progress) {
strbuf_addf(&progress_title, strbuf_addf(&progress_title,
Q_("Finding commits for commit graph in %d pack", Q_("Finding commits for commit graph in %"PRIuMAX" pack",
"Finding commits for commit graph in %d packs", "Finding commits for commit graph in %"PRIuMAX" packs",
pack_indexes->nr), pack_indexes->nr),
pack_indexes->nr); (uintmax_t)pack_indexes->nr);
ctx->progress = start_delayed_progress(progress_title.buf, 0); ctx->progress = start_delayed_progress(progress_title.buf, 0);
ctx->progress_done = 0; ctx->progress_done = 0;
} }

Просмотреть файл

@ -43,8 +43,8 @@ static void free_mailmap_info(void *p, const char *s)
static void free_mailmap_entry(void *p, const char *s) static void free_mailmap_entry(void *p, const char *s)
{ {
struct mailmap_entry *me = (struct mailmap_entry *)p; struct mailmap_entry *me = (struct mailmap_entry *)p;
debug_mm("mailmap: removing entries for <%s>, with %d sub-entries\n", debug_mm("mailmap: removing entries for <%s>, with %"PRIuMAX" sub-entries\n",
s, me->namemap.nr); s, (uintmax_t)me->namemap.nr);
debug_mm("mailmap: - simple: '%s' <%s>\n", debug_mm("mailmap: - simple: '%s' <%s>\n",
debug_str(me->name), debug_str(me->email)); debug_str(me->name), debug_str(me->email));
@ -250,7 +250,8 @@ int read_mailmap(struct string_list *map)
void clear_mailmap(struct string_list *map) void clear_mailmap(struct string_list *map)
{ {
debug_mm("mailmap: clearing %d entries...\n", map->nr); debug_mm("mailmap: clearing %"PRIuMAX" entries...\n",
(uintmax_t)map->nr);
map->strdup_strings = 1; map->strdup_strings = 1;
string_list_clear_func(map, free_mailmap_entry); string_list_clear_func(map, free_mailmap_entry);
debug_mm("mailmap: cleared\n"); debug_mm("mailmap: cleared\n");

Просмотреть файл

@ -4063,8 +4063,8 @@ static void process_entries(struct merge_options *opt,
trace2_region_enter("merge", "process_entries cleanup", opt->repo); trace2_region_enter("merge", "process_entries cleanup", opt->repo);
if (dir_metadata.offsets.nr != 1 || if (dir_metadata.offsets.nr != 1 ||
(uintptr_t)dir_metadata.offsets.items[0].util != 0) { (uintptr_t)dir_metadata.offsets.items[0].util != 0) {
printf("dir_metadata.offsets.nr = %d (should be 1)\n", printf("dir_metadata.offsets.nr = %"PRIuMAX" (should be 1)\n",
dir_metadata.offsets.nr); (uintmax_t)dir_metadata.offsets.nr);
printf("dir_metadata.offsets.items[0].util = %u (should be 0)\n", printf("dir_metadata.offsets.items[0].util = %u (should be 0)\n",
(unsigned)(uintptr_t)dir_metadata.offsets.items[0].util); (unsigned)(uintptr_t)dir_metadata.offsets.items[0].util);
fflush(stdout); fflush(stdout);

Просмотреть файл

@ -86,7 +86,8 @@ typedef int (*compare_strings_fn)(const char *, const char *);
*/ */
struct string_list { struct string_list {
struct string_list_item *items; struct string_list_item *items;
unsigned int nr, alloc; size_t nr;
size_t alloc;
unsigned int strdup_strings:1; unsigned int strdup_strings:1;
compare_strings_fn cmp; /* NULL uses strcmp() */ compare_strings_fn cmp; /* NULL uses strcmp() */
}; };

Просмотреть файл

@ -180,15 +180,16 @@ static int testsuite(int argc, const char **argv)
if (max_jobs > suite.tests.nr) if (max_jobs > suite.tests.nr)
max_jobs = suite.tests.nr; max_jobs = suite.tests.nr;
fprintf(stderr, "Running %d tests (%d at a time)\n", fprintf(stderr, "Running %"PRIuMAX" tests (%d at a time)\n",
suite.tests.nr, max_jobs); (uintmax_t)suite.tests.nr, max_jobs);
ret = run_processes_parallel(max_jobs, next_test, test_failed, ret = run_processes_parallel(max_jobs, next_test, test_failed,
test_finished, &suite); test_finished, &suite);
if (suite.failed.nr > 0) { if (suite.failed.nr > 0) {
ret = 1; ret = 1;
fprintf(stderr, "%d tests failed:\n\n", suite.failed.nr); fprintf(stderr, "%"PRIuMAX" tests failed:\n\n",
(uintmax_t)suite.failed.nr);
for (i = 0; i < suite.failed.nr; i++) for (i = 0; i < suite.failed.nr; i++)
fprintf(stderr, "\t%s\n", suite.failed.items[i].string); fprintf(stderr, "\t%s\n", suite.failed.items[i].string);
} }

Просмотреть файл

@ -1374,10 +1374,10 @@ static void show_rebase_information(struct wt_status *s,
status_printf_ln(s, color, _("No commands done.")); status_printf_ln(s, color, _("No commands done."));
else { else {
status_printf_ln(s, color, status_printf_ln(s, color,
Q_("Last command done (%d command done):", Q_("Last command done (%"PRIuMAX" command done):",
"Last commands done (%d commands done):", "Last commands done (%"PRIuMAX" commands done):",
have_done.nr), have_done.nr),
have_done.nr); (uintmax_t)have_done.nr);
for (i = (have_done.nr > nr_lines_to_show) for (i = (have_done.nr > nr_lines_to_show)
? have_done.nr - nr_lines_to_show : 0; ? have_done.nr - nr_lines_to_show : 0;
i < have_done.nr; i < have_done.nr;
@ -1393,10 +1393,10 @@ static void show_rebase_information(struct wt_status *s,
_("No commands remaining.")); _("No commands remaining."));
else { else {
status_printf_ln(s, color, status_printf_ln(s, color,
Q_("Next command to do (%d remaining command):", Q_("Next command to do (%"PRIuMAX" remaining command):",
"Next commands to do (%d remaining commands):", "Next commands to do (%"PRIuMAX" remaining commands):",
yet_to_do.nr), yet_to_do.nr),
yet_to_do.nr); (uintmax_t)yet_to_do.nr);
for (i = 0; i < nr_lines_to_show && i < yet_to_do.nr; i++) for (i = 0; i < nr_lines_to_show && i < yet_to_do.nr; i++)
status_printf_ln(s, color, " %s", yet_to_do.items[i].string); status_printf_ln(s, color, " %s", yet_to_do.items[i].string);
if (s->hints) if (s->hints)