fix xcalloc() argument order

Pass the number of elements first and ther size second, as expected by xcalloc(). Provide a semantic patch, which was actually used to generate the rest of this patch. The semantic patch would generate flip-flop diffs if both arguments are sizeofs. We don't have such a case, and it's hard to imagine the usefulness of such an allocation. If it ever occurs then we could deal with it by duplicating the rule in the semantic patch to make it cancel itself out, or we could change the code to use CALLOC_ARRAY. Signed-off-by: René Scharfe <l.s.r@web.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>

René Scharfe committed Mar 6, 2021 at 12:26 UTC 241b5d3ebeea21b70a74fdc8c74e73f7ed829cb1
6 files changed +28 -17
add-interactive.c
+3 -3
@@ -413,7 +413,7 @@ struct file_item {
413
414 static void add_file_item(struct string_list *files, const char *name)
415 {
416 - struct file_item *item = xcalloc(sizeof(*item), 1);
416 + struct file_item *item = xcalloc(1, sizeof(*item));
417
418 string_list_append(files, name)->util = item;
419 }
@@ -476,7 +476,7 @@ static void collect_changes_cb(struct diff_queue_struct *q,
476
477 add_file_item(s->files, name);
478
479 - entry = xcalloc(sizeof(*entry), 1);
479 + entry = xcalloc(1, sizeof(*entry));
480 hashmap_entry_init(&entry->ent, hash);
481 entry->name = s->files->items[s->files->nr - 1].string;
482 entry->item = s->files->items[s->files->nr - 1].util;
@@ -1120,7 +1120,7 @@ int run_add_i(struct repository *r, const struct pathspec *ps)
1120 int res = 0;
1121
1122 for (i = 0; i < ARRAY_SIZE(command_list); i++) {
1123 - struct command_item *util = xcalloc(sizeof(*util), 1);
1123 + struct command_item *util = xcalloc(1, sizeof(*util));
1124 util->command = command_list[i].command;
1125 string_list_append(&commands.items, command_list[i].string)
1126 ->util = util;
blame.c
+7 -7
@@ -951,13 +951,13 @@ static int *fuzzy_find_matching_lines(struct blame_origin *parent,
951 max_search_distance_b = ((2 * max_search_distance_a + 1) * length_b
952 - 1) / length_a;
953
954 - result = xcalloc(sizeof(int), length_b);
955 - second_best_result = xcalloc(sizeof(int), length_b);
956 - certainties = xcalloc(sizeof(int), length_b);
954 + result = xcalloc(length_b, sizeof(int));
955 + second_best_result = xcalloc(length_b, sizeof(int));
956 + certainties = xcalloc(length_b, sizeof(int));
957
958 /* See get_similarity() for details of similarities. */
959 similarity_count = length_b * (max_search_distance_a * 2 + 1);
960 - similarities = xcalloc(sizeof(int), similarity_count);
960 + similarities = xcalloc(similarity_count, sizeof(int));
961
962 for (i = 0; i < length_b; ++i) {
963 result[i] = -1;
@@ -995,7 +995,7 @@ static void fill_origin_fingerprints(struct blame_origin *o)
995 return;
996 o->num_lines = find_line_starts(&line_starts, o->file.ptr,
997 o->file.size);
998 - o->fingerprints = xcalloc(sizeof(struct fingerprint), o->num_lines);
998 + o->fingerprints = xcalloc(o->num_lines, sizeof(struct fingerprint));
999 get_line_fingerprints(o->fingerprints, o->file.ptr, line_starts,
1000 0, o->num_lines);
1001 free(line_starts);
@@ -1853,8 +1853,8 @@ static void blame_chunk(struct blame_entry ***dstq, struct blame_entry ***srcq,
1853 diffp = NULL;
1854
1855 if (ignore_diffs && same - tlno > 0) {
1856 - line_blames = xcalloc(sizeof(struct blame_line_tracker),
1857 - same - tlno);
1856 + line_blames = xcalloc(same - tlno,
1857 + sizeof(struct blame_line_tracker));
1858 guess_line_blames(parent, target, tlno, offset, same,
1859 parent_len, line_blames);
1860 }
contrib/coccinelle/xcalloc.cocci new
+10
@@ -0,0 +1,10 @@
1 +@@
2 +type T;
3 +T *ptr;
4 +expression n;
5 +@@
6 + xcalloc(
7 ++ n,
8 + \( sizeof(T) \| sizeof(*ptr) \)
9 +- , n
10 + )
range-diff.c
+1 -1
@@ -93,7 +93,7 @@ static int read_patches(const char *range, struct string_list *list,
93 string_list_append(list, buf.buf)->util = util;
94 strbuf_reset(&buf);
95 }
96 - util = xcalloc(sizeof(*util), 1);
96 + util = xcalloc(1, sizeof(*util));
97 if (get_oid(p, &util->oid)) {
98 error(_("could not parse commit '%s'"), p);
99 free(util);
ref-filter.c
+3 -2
@@ -768,7 +768,8 @@ static int if_atom_handler(struct atom_value *atomv, struct ref_formatting_state
768 struct strbuf *unused_err)
769 {
770 struct ref_formatting_stack *new_stack;
771 - struct if_then_else *if_then_else = xcalloc(sizeof(struct if_then_else), 1);
771 + struct if_then_else *if_then_else = xcalloc(1,
772 + sizeof(struct if_then_else));
773
774 if_then_else->str = atomv->atom->u.if_then_else.str;
775 if_then_else->cmp_status = atomv->atom->u.if_then_else.cmp_status;
@@ -2242,7 +2243,7 @@ static void reach_filter(struct ref_array *array,
2243 if (!check_reachable)
2244 return;
2245
2245 - to_clear = xcalloc(sizeof(struct commit *), array->nr);
2246 + to_clear = xcalloc(array->nr, sizeof(struct commit *));
2247
2248 repo_init_revisions(the_repository, &revs, NULL);
2249
trailer.c
+4 -4
@@ -174,7 +174,7 @@ static void print_all(FILE *outfile, struct list_head *head,
174
175 static struct trailer_item *trailer_from_arg(struct arg_item *arg_tok)
176 {
177 - struct trailer_item *new_item = xcalloc(sizeof(*new_item), 1);
177 + struct trailer_item *new_item = xcalloc(1, sizeof(*new_item));
178 new_item->token = arg_tok->token;
179 new_item->value = arg_tok->value;
180 arg_tok->token = arg_tok->value = NULL;
@@ -445,7 +445,7 @@ static struct arg_item *get_conf_item(const char *name)
445 }
446
447 /* Item does not already exists, create it */
448 - item = xcalloc(sizeof(*item), 1);
448 + item = xcalloc(1, sizeof(*item));
449 duplicate_conf(&item->conf, &default_conf_info);
450 item->conf.name = xstrdup(name);
451
@@ -664,7 +664,7 @@ static void parse_trailer(struct strbuf *tok, struct strbuf *val,
664 static struct trailer_item *add_trailer_item(struct list_head *head, char *tok,
665 char *val)
666 {
667 - struct trailer_item *new_item = xcalloc(sizeof(*new_item), 1);
667 + struct trailer_item *new_item = xcalloc(1, sizeof(*new_item));
668 new_item->token = tok;
669 new_item->value = val;
670 list_add_tail(&new_item->list, head);
@@ -675,7 +675,7 @@ static void add_arg_item(struct list_head *arg_head, char *tok, char *val,
675 const struct conf_info *conf,
676 const struct new_trailer_item *new_trailer_item)
677 {
678 - struct arg_item *new_item = xcalloc(sizeof(*new_item), 1);
678 + struct arg_item *new_item = xcalloc(1, sizeof(*new_item));
679 new_item->token = tok;
680 new_item->value = val;
681 duplicate_conf(&new_item->conf, conf);