mirror of
https://github.com/git/git
synced 2024-08-27 19:49:21 +00:00
![Ævar Arnfjörð Bjarmason](/assets/img/avatar_default.png)
Generalize the newly added "unused.cocci" rule to find more than just "struct strbuf", let's have it find the same unused patterns for "struct string_list", as well as other code that uses similar-looking *_{release,clear,free}() and {release,clear,free}_*() functions. We're intentionally loose in accepting e.g. a "strbuf_init(&sb)" followed by a "string_list_clear(&sb, 0)". It's assumed that the compiler will catch any such invalid code, i.e. that our constructors/destructors don't take a "void *". See [1] for example of code that would be covered by the "get_worktrees()" part of this rule. We'd still need work that the series is based on (we were passing "worktrees" to a function), but could now do the change in [1] automatically. 1. https://lore.kernel.org/git/Yq6eJFUPPTv%2Fzc0o@coredump.intra.peff.net/ Signed-off-by: Ævar Arnfjörð Bjarmason <avarab@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
44 lines
921 B
Plaintext
44 lines
921 B
Plaintext
// This rule finds sequences of "unused" declerations and uses of a
|
|
// variable, where "unused" is defined to include only calling the
|
|
// equivalent of alloc, init & free functions on the variable.
|
|
@@
|
|
type T;
|
|
identifier I;
|
|
// STRBUF_INIT, but also e.g. STRING_LIST_INIT_DUP (so no anchoring)
|
|
constant INIT_MACRO =~ "_INIT";
|
|
identifier MALLOC1 =~ "^x?[mc]alloc$";
|
|
identifier INIT_ASSIGN1 =~ "^get_worktrees$";
|
|
identifier INIT_CALL1 =~ "^[a-z_]*_init$";
|
|
identifier REL1 =~ "^[a-z_]*_(release|reset|clear|free)$";
|
|
identifier REL2 =~ "^(release|clear|free)_[a-z_]*$";
|
|
@@
|
|
|
|
(
|
|
- T I;
|
|
|
|
|
- T I = { 0 };
|
|
|
|
|
- T I = INIT_MACRO;
|
|
|
|
|
- T I = MALLOC1(...);
|
|
|
|
|
- T I = INIT_ASSIGN1(...);
|
|
)
|
|
|
|
<... when != \( I \| &I \)
|
|
(
|
|
- \( INIT_CALL1 \)( \( I \| &I \), ...);
|
|
|
|
|
- I = \( INIT_ASSIGN1 \)(...);
|
|
|
|
|
- I = MALLOC1(...);
|
|
)
|
|
...>
|
|
|
|
(
|
|
- \( REL1 \| REL2 \)( \( I \| &I \), ...);
|
|
|
|
|
- \( REL1 \| REL2 \)( \( &I \| I \) );
|
|
)
|
|
... when != \( I \| &I \)
|