mirror of
https://github.com/git/git.git
synced 2024-11-27 20:14:30 +08:00
177fbab747
The current semantic patch for COPY_ARRAY transforms memcpy(3) calls on pointers, but Coccinelle distinguishes them from arrays. It already contains three rules to handle the options for sizeof (i.e. source, destination and type), and handling arrays as source and destination would require four times as many rules if we enumerated all cases. We also don't handle array subscripts, and supporting that would increase the number of rules by another factor of four. (An isomorphism telling Coccinelle that "sizeof x[...]" is equivalent to "sizeof *x" would be nice..) Support arrays and array subscripts, but keep the number of rules down by adding normalization steps: First turn array subscripts into derefences, then determine the types of expressions used with sizeof and replace them with these types, and then convert the different possible combinations of arrays and pointers with memcpy(3) to COPY_ARRAY. Signed-off-by: Rene Scharfe <l.s.r@web.de> Signed-off-by: Junio C Hamano <gitster@pobox.com>
91 lines
1.2 KiB
Plaintext
91 lines
1.2 KiB
Plaintext
@@
|
|
expression dst, src, n, E;
|
|
@@
|
|
memcpy(dst, src, n * sizeof(
|
|
- E[...]
|
|
+ *(E)
|
|
))
|
|
|
|
@@
|
|
type T;
|
|
T *ptr;
|
|
T[] arr;
|
|
expression E, n;
|
|
@@
|
|
(
|
|
memcpy(ptr, E,
|
|
- n * sizeof(*(ptr))
|
|
+ n * sizeof(T)
|
|
)
|
|
|
|
|
memcpy(arr, E,
|
|
- n * sizeof(*(arr))
|
|
+ n * sizeof(T)
|
|
)
|
|
|
|
|
memcpy(E, ptr,
|
|
- n * sizeof(*(ptr))
|
|
+ n * sizeof(T)
|
|
)
|
|
|
|
|
memcpy(E, arr,
|
|
- n * sizeof(*(arr))
|
|
+ n * sizeof(T)
|
|
)
|
|
)
|
|
|
|
@@
|
|
type T;
|
|
T *dst_ptr;
|
|
T *src_ptr;
|
|
T[] dst_arr;
|
|
T[] src_arr;
|
|
expression n;
|
|
@@
|
|
(
|
|
- memcpy(dst_ptr, src_ptr, (n) * sizeof(T))
|
|
+ COPY_ARRAY(dst_ptr, src_ptr, n)
|
|
|
|
|
- memcpy(dst_ptr, src_arr, (n) * sizeof(T))
|
|
+ COPY_ARRAY(dst_ptr, src_arr, n)
|
|
|
|
|
- memcpy(dst_arr, src_ptr, (n) * sizeof(T))
|
|
+ COPY_ARRAY(dst_arr, src_ptr, n)
|
|
|
|
|
- memcpy(dst_arr, src_arr, (n) * sizeof(T))
|
|
+ COPY_ARRAY(dst_arr, src_arr, n)
|
|
)
|
|
|
|
@@
|
|
type T;
|
|
T *dst;
|
|
T *src;
|
|
expression n;
|
|
@@
|
|
(
|
|
- memmove(dst, src, (n) * sizeof(*dst));
|
|
+ MOVE_ARRAY(dst, src, n);
|
|
|
|
|
- memmove(dst, src, (n) * sizeof(*src));
|
|
+ MOVE_ARRAY(dst, src, n);
|
|
|
|
|
- memmove(dst, src, (n) * sizeof(T));
|
|
+ MOVE_ARRAY(dst, src, n);
|
|
)
|
|
|
|
@@
|
|
type T;
|
|
T *ptr;
|
|
expression n;
|
|
@@
|
|
- ptr = xmalloc((n) * sizeof(*ptr));
|
|
+ ALLOC_ARRAY(ptr, n);
|
|
|
|
@@
|
|
type T;
|
|
T *ptr;
|
|
expression n;
|
|
@@
|
|
- ptr = xmalloc((n) * sizeof(T));
|
|
+ ALLOC_ARRAY(ptr, n);
|