From: "René Scharfe." <l.s.r@web.de>
To: Junio C Hamano <gitster@pobox.com>,
Jeff Hostetler <jeffhost@microsoft.com>,
Alban Gruin <alban.gruin@gmail.com>,
Garima Singh <garima.singh@microsoft.com>
Cc: Git List <git@vger.kernel.org>
Subject: Re: [PATCH 2/2] use CALLOC_ARRAY
Date: Mon, 15 Mar 2021 23:35:03 +0100 [thread overview]
Message-ID: <48772615-4b68-724f-dae6-4153aafbde35@web.de> (raw)
In-Reply-To: <xmqq35ww1amf.fsf@gitster.g>
Am 15.03.21 um 20:26 schrieb Junio C Hamano:
> https://github.com/git/git/runs/2114848725?check_suite_focus=true
> tells us that we want to be using CALLOC_ARRAY() instead of
> xcalloc() at these places.
>
> Quite a many are single-element allocations that want NUL-filled
> piece of memory. We may want to resurrect the "one-element calloc
> is exempt" thing (in other words, xcalloc(1, size_of_one_element) is
> perfectly fine, even though xcalloc(size_of_one_element, 1) must
> swap the order of arguments).
Leaving the idiomatic use of xcalloc for allocating a single cleared
object alone can make sense. CALLOC_ARRAY with a single element
might become idiomatic over time as well, though, but with "C" (for
continuous) and "ARRAY" having two name parts screaming for multiple
elements might be a bit much.
> But some are true multi-element allocations that we may want to fix
> in each topic in flight.
>
> compat/simple-ipc/ipc-unix-socket.c::836
> 1e7cdcb6 (simple-ipc: add Unix domain socket implementation, 2021-03-09)
>
> merge-strategies.c::498
> 72a74644 (merge-octopus: rewrite in C, 2020-11-24)
>
> t/helper/test-bloom.c::72
> f1294eaf (bloom.c: introduce core Bloom filter constructs, 2020-03-30)
>
>
> Also there are a few multi-element allocations that are old, which
> weren't somehow caught by the patch I am responding to.
When I run coccicheck agains seen it still misses the following
conversions:
builtin/checkout.c | 2 +-
builtin/log.c | 4 ++--
builtin/receive-pack.c | 10 ++++------
t/helper/test-bloom.c | 2 +-
That's with spatch built from the latest Coccinelle source as of March
2nd. Strange.
>
> builtin/receive-pack.c::2351
> 0a1bc12b (receive-pack: allow pushes that update .git/shallow, 2013-12-05)
>
> ----- >8 ---------- >8 ---------- >8 ---------- >8 ---------- >8 -----
>
> GIT_VERSION = 2.31.0.rc2.390.g46dd778bfd
> SPATCH contrib/coccinelle/hashmap.cocci
> SPATCH contrib/coccinelle/commit.cocci
> SPATCH contrib/coccinelle/xcalloc.cocci
> SPATCH contrib/coccinelle/preincr.cocci
> SPATCH contrib/coccinelle/free.cocci
> SPATCH contrib/coccinelle/qsort.cocci
> SPATCH contrib/coccinelle/object_id.cocci
> SPATCH contrib/coccinelle/xstrdup_or_null.cocci
> SPATCH contrib/coccinelle/swap.cocci
> SPATCH contrib/coccinelle/strbuf.cocci
> SPATCH contrib/coccinelle/flex_alloc.cocci
> SPATCH contrib/coccinelle/array.cocci
> SPATCH result: contrib/coccinelle/array.cocci.patch
> + set +x
> Coccinelle suggests the following changes in 'contrib/coccinelle/array.cocci.patch':
> diff -u -p a/builtin/checkout.c b/builtin/checkout.c
> --- a/builtin/checkout.c
> +++ b/builtin/checkout.c
> @@ -741,7 +741,7 @@ static int merge_working_tree(const stru
> &new_branch_info->commit->object.oid :
> &new_branch_info->oid, NULL);
> if (opts->overwrite_ignore) {
> - topts.dir = xcalloc(1, sizeof(*topts.dir));
> + CALLOC_ARRAY(topts.dir, 1);
> topts.dir->flags |= DIR_SHOW_IGNORED;
> setup_standard_excludes(topts.dir);
> }
> diff -u -p a/builtin/log.c b/builtin/log.c
> --- a/builtin/log.c
> +++ b/builtin/log.c
> @@ -230,7 +230,7 @@ static void cmd_log_init_finish(int argc
> }
>
> if (mailmap) {
> - rev->mailmap = xcalloc(1, sizeof(struct string_list));
> + CALLOC_ARRAY(rev->mailmap, 1);
> read_mailmap(rev->mailmap);
> }
>
> @@ -2141,7 +2141,7 @@ int cmd_format_patch(int argc, const cha
> }
>
> if (in_reply_to || thread || cover_letter)
> - rev.ref_message_ids = xcalloc(1, sizeof(struct string_list));
> + CALLOC_ARRAY(rev.ref_message_ids, 1);
> if (in_reply_to) {
> const char *msgid = clean_message_id(in_reply_to);
> string_list_append(rev.ref_message_ids, msgid);
> diff -u -p a/builtin/receive-pack.c b/builtin/receive-pack.c
> --- a/builtin/receive-pack.c
> +++ b/builtin/receive-pack.c
> @@ -1040,7 +1040,7 @@ static int read_proc_receive_report(stru
> report = hint->report;
> while (report->next)
> report = report->next;
> - report->next = xcalloc(1, sizeof(struct ref_push_report));
> + CALLOC_ARRAY(report->next, 1);
> report = report->next;
> }
> new_report = 0;
> @@ -2348,11 +2348,9 @@ static void prepare_shallow_update(struc
> ALLOC_ARRAY(si->used_shallow, si->shallow->nr);
> assign_shallow_commits_to_refs(si, si->used_shallow, NULL);
>
> - si->need_reachability_test =
> - xcalloc(si->shallow->nr, sizeof(*si->need_reachability_test));
> - si->reachable =
> - xcalloc(si->shallow->nr, sizeof(*si->reachable));
> - si->shallow_ref = xcalloc(si->ref->nr, sizeof(*si->shallow_ref));
> + CALLOC_ARRAY(si->need_reachability_test, si->shallow->nr);
> + CALLOC_ARRAY(si->reachable, si->shallow->nr);
> + CALLOC_ARRAY(si->shallow_ref, si->ref->nr);
>
> for (i = 0; i < si->nr_ours; i++)
> si->need_reachability_test[si->ours[i]] = 1;
> diff -u -p a/builtin/repack.c b/builtin/repack.c
> --- a/builtin/repack.c
> +++ b/builtin/repack.c
> @@ -327,7 +327,7 @@ static void init_pack_geometry(struct pa
> struct packed_git *p;
> struct pack_geometry *geometry;
>
> - *geometry_p = xcalloc(1, sizeof(struct pack_geometry));
> + CALLOC_ARRAY(*geometry_p, 1);
> geometry = *geometry_p;
>
> for (p = get_all_packs(the_repository); p; p = p->next) {
> diff -u -p a/compat/simple-ipc/ipc-unix-socket.c b/compat/simple-ipc/ipc-unix-socket.c
> --- a/compat/simple-ipc/ipc-unix-socket.c
> +++ b/compat/simple-ipc/ipc-unix-socket.c
> @@ -130,7 +130,7 @@ enum ipc_active_state ipc_client_try_con
> trace2_region_leave("ipc-client", "try-connect", NULL);
>
> if (state == IPC_STATE__LISTENING) {
> - (*p_connection) = xcalloc(1, sizeof(struct ipc_client_connection));
> + CALLOC_ARRAY((*p_connection), 1);
> (*p_connection)->fd = fd;
> }
>
> @@ -819,7 +819,7 @@ int ipc_server_run_async(struct ipc_serv
> return ret;
> }
>
> - server_data = xcalloc(1, sizeof(*server_data));
> + CALLOC_ARRAY(server_data, 1);
> server_data->magic = MAGIC_SERVER_DATA;
> server_data->application_cb = application_cb;
> server_data->application_data = application_data;
> @@ -833,11 +833,9 @@ int ipc_server_run_async(struct ipc_serv
> pthread_cond_init(&server_data->work_available_cond, NULL);
>
> server_data->queue_size = nr_threads * FIFO_SCALE;
> - server_data->fifo_fds = xcalloc(server_data->queue_size,
> - sizeof(*server_data->fifo_fds));
> + CALLOC_ARRAY(server_data->fifo_fds, server_data->queue_size);
>
> - server_data->accept_thread =
> - xcalloc(1, sizeof(*server_data->accept_thread));
> + CALLOC_ARRAY(server_data->accept_thread, 1);
> server_data->accept_thread->magic = MAGIC_ACCEPT_THREAD_DATA;
> server_data->accept_thread->server_data = server_data;
> server_data->accept_thread->server_socket = server_socket;
> @@ -851,7 +849,7 @@ int ipc_server_run_async(struct ipc_serv
> for (k = 0; k < nr_threads; k++) {
> struct ipc_worker_thread_data *wtd;
>
> - wtd = xcalloc(1, sizeof(*wtd));
> + CALLOC_ARRAY(wtd, 1);
> wtd->magic = MAGIC_WORKER_THREAD_DATA;
> wtd->server_data = server_data;
>
> diff -u -p a/compat/simple-ipc/ipc-win32.c b/compat/simple-ipc/ipc-win32.c
> --- a/compat/simple-ipc/ipc-win32.c
> +++ b/compat/simple-ipc/ipc-win32.c
> @@ -184,7 +184,7 @@ enum ipc_active_state ipc_client_try_con
> trace2_region_leave("ipc-client", "try-connect", NULL);
>
> if (state == IPC_STATE__LISTENING) {
> - (*p_connection) = xcalloc(1, sizeof(struct ipc_client_connection));
> + CALLOC_ARRAY((*p_connection), 1);
> (*p_connection)->fd = fd;
> }
>
> @@ -625,7 +625,7 @@ int ipc_server_run_async(struct ipc_serv
> return -2;
> }
>
> - server_data = xcalloc(1, sizeof(*server_data));
> + CALLOC_ARRAY(server_data, 1);
> server_data->magic = MAGIC_SERVER_DATA;
> server_data->application_cb = application_cb;
> server_data->application_data = application_data;
> @@ -640,7 +640,7 @@ int ipc_server_run_async(struct ipc_serv
> for (k = 0; k < nr_threads; k++) {
> struct ipc_server_thread_data *std;
>
> - std = xcalloc(1, sizeof(*std));
> + CALLOC_ARRAY(std, 1);
> std->magic = MAGIC_SERVER_THREAD_DATA;
> std->server_data = server_data;
> std->hPipe = INVALID_HANDLE_VALUE;
> diff -u -p a/merge-ort.c b/merge-ort.c
> --- a/merge-ort.c
> +++ b/merge-ort.c
> @@ -3439,7 +3439,7 @@ static void merge_start(struct merge_opt
> trace2_region_leave("merge", "allocate/init", opt->repo);
> return;
> }
> - opt->priv = xcalloc(1, sizeof(*opt->priv));
> + CALLOC_ARRAY(opt->priv, 1);
>
> /* Initialization of various renames fields */
> renames = &opt->priv->renames;
> diff -u -p a/merge-strategies.c b/merge-strategies.c
> --- a/merge-strategies.c
> +++ b/merge-strategies.c
> @@ -495,8 +495,7 @@ int merge_strategies_octopus(struct repo
> return 2;
> }
>
> - reference_commit = xcalloc(commit_list_count(remotes) + 1,
> - sizeof(struct commit *));
> + CALLOC_ARRAY(reference_commit, commit_list_count(remotes) + 1);
> reference_commit[0] = head_commit;
> reference_tree = head_tree;
>
> diff -u -p a/t/helper/test-bloom.c b/t/helper/test-bloom.c
> --- a/t/helper/test-bloom.c
> +++ b/t/helper/test-bloom.c
> @@ -69,7 +69,7 @@ int cmd__bloom(int argc, const char **ar
> struct bloom_filter filter;
> int i = 2;
> filter.len = (settings.bits_per_entry + BITS_PER_WORD - 1) / BITS_PER_WORD;
> - filter.data = xcalloc(filter.len, sizeof(unsigned char));
> + CALLOC_ARRAY(filter.data, filter.len);
>
> if (argc - 1 < i)
> usage(bloom_usage);
> diff -u -p a/unix-stream-server.c b/unix-stream-server.c
> --- a/unix-stream-server.c
> +++ b/unix-stream-server.c
> @@ -72,7 +72,7 @@ int unix_stream_server__create(
> return -1;
> }
>
> - server_socket = xcalloc(1, sizeof(*server_socket));
> + CALLOC_ARRAY(server_socket, 1);
> server_socket->path_socket = strdup(path);
> server_socket->fd_socket = fd_socket;
> lstat(path, &server_socket->st_socket);
> error: Coccinelle suggested some changes
> Error: Process completed with exit code 1.
>
next prev parent reply other threads:[~2021-03-15 22:35 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-03-13 16:10 [PATCH 1/2] git-compat-util.h: drop trailing semicolon from macro definition René Scharfe.
2021-03-13 16:17 ` [PATCH 2/2] use CALLOC_ARRAY René Scharfe.
[not found] ` <xmqq35ww1amf.fsf@gitster.g>
2021-03-15 22:35 ` René Scharfe. [this message]
[not found] ` <xmqqk0q8ynz0.fsf@gitster.g>
2021-03-16 0:55 ` [PATCH] xcalloc: use CALLOC_ARRAY() when applicable Junio C Hamano
2021-03-16 11:43 ` Derrick Stolee
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=48772615-4b68-724f-dae6-4153aafbde35@web.de \
--to=l.s.r@web.de \
--cc=alban.gruin@gmail.com \
--cc=garima.singh@microsoft.com \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=jeffhost@microsoft.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).