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);