diff mbox series

[01/88] cocci: script to use g_new() & friends

Message ID 20171006235023.11952-2-f4bug@amsat.org
State New
Headers show
Series use g_new() family of functions | expand

Commit Message

Philippe Mathieu-Daudé Oct. 6, 2017, 11:48 p.m. UTC
Imported from Markus Armbruster commit b45c03f

Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
---
Signed-off-by: Markus Armbruster <armbru@redhat.com>?

 scripts/coccinelle/g_new.cocci | 101 +++++++++++++++++++++++++++++++++++++++++
 1 file changed, 101 insertions(+)
 create mode 100644 scripts/coccinelle/g_new.cocci

Comments

Markus Armbruster Oct. 9, 2017, 7:24 a.m. UTC | #1
Philippe Mathieu-Daudé <f4bug@amsat.org> writes:

> Imported from Markus Armbruster commit b45c03f
>
> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
> ---
> Signed-off-by: Markus Armbruster <armbru@redhat.com>?
>
>  scripts/coccinelle/g_new.cocci | 101 +++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 101 insertions(+)
>  create mode 100644 scripts/coccinelle/g_new.cocci
>
> diff --git a/scripts/coccinelle/g_new.cocci b/scripts/coccinelle/g_new.cocci
> new file mode 100644
> index 0000000000..1e57685a6b
> --- /dev/null
> +++ b/scripts/coccinelle/g_new.cocci
> @@ -0,0 +1,101 @@
> +/* transform g_new*() alloc with size arguments of the form sizeof(T) [* N]

Confusing.  Sounds like we transform g_new() into something else.  Also,
wing both ends of the comment, and start with a capital letter.

> + *
> + *   g_new(T, n) is neater than g_malloc(sizeof(T) * n).  It's also safer,
> + *   for two reasons.  One, it catches multiplication overflowing size_t.
> + *   two, it returns T * rather than void *, which lets the compiler catch

Start your sentences with a capital letter.  Or rather, keep my commit
message's capital letters intact ;)

> + *   more type errors.
> + *
> + *    Copyright: (C) 2017 Markus Armbruster <armbru@redhat.com>. GPLv2+.

If you want to put a copyright note into this file, you should stick to
the common format:

/*
 * Rewrite memory allocations to use g_new() & friends
 *
 * Copyright (C) 2014-2017 Red Hat, Inc.
 *
 * Authors:
 *  Markus Armbruster <armbru@redhat.com>,
 *
 * This work is licensed under the terms of the GNU GPL, version 2 or later.
 * See the COPYING file in the top-level directory.
 */

> + *    (Imported from b45c03f585ea9bb1af76c73e82195418c294919d)

Scratch this line.  It's in the commit message, and that suffices.

> + *
> + * See http://lists.nongnu.org/archive/html/qemu-devel/2017-09/msg00908.html:
> + *
> + *   g_new() advantages (from glib doc):
> + *   - the returned pointer is cast to a pointer to the given type.
> + *   - care is taken to avoid overflow when calculating the size of the
> + *   allocated block.

Repeats what you just said in the text pasted from my commit message.

> + *
> + *   p = g_malloc(sizeof(*p)) is idiomatic, and not obviously inferior to
> + *   p = g_new(T, 1), where T is the type of *p.
> + *   But once you add multiplication, g_new() adds something useful: overflow
> + *   protection.  Conversion to g_new() might make sense then.
> + */

This part doesn't really apply, yet: the semantic patch doesn't deal
with sizeof(*p).

Please write a coherent introduction instead of a series of quotations.

> +
> +@@
> +type T;
> +@@
> +-g_malloc(sizeof(T))
> ++g_new(T, 1)
> +@@
> +type T;
> +@@
> +-g_try_malloc(sizeof(T))
> ++g_try_new(T, 1)
> +@@
> +type T;
> +@@
> +-g_malloc0(sizeof(T))
> ++g_new0(T, 1)
> +@@
> +type T;
> +@@
> +-g_try_malloc0(sizeof(T))
> ++g_try_new0(T, 1)
> +

Any particular reason for adding this blank line?

You add more below, and a comment.  Okay, but I'd commit the script
exactly as given in commit b45c03f, then add improvements on top.

> +@@
> +type T;
> +expression n;
> +@@
> +-g_malloc(sizeof(T) * (n))
> ++g_new(T, n)
> +@@
> +type T;
> +expression n;
> +@@
> +-g_try_malloc(sizeof(T) * (n))
> ++g_try_new(T, n)
> +@@
> +type T;
> +expression n;
> +@@
> +-g_malloc0(sizeof(T) * (n))
> ++g_new0(T, n)
> +@@
> +type T;
> +expression n;
> +@@
> +-g_try_malloc0(sizeof(T) * (n))
> ++g_try_new0(T, n)
> +
> +@@
> +type T;
> +expression p, n;
> +@@
> +-g_realloc(p, sizeof(T) * (n))
> ++g_renew(T, p, n)
> +@@
> +type T;
> +expression p, n;
> +@@
> +-g_try_realloc(p, sizeof(T) * (n))
> ++g_try_renew(T, p, n)
> +
> +// drop superfluous cast
> +@@
> +type T;
> +expression n;
> +@@
> +-(T *)g_new(T, n)
> ++g_new(T, n)
> +@@
> +type T;
> +expression n;
> +@@
> +-(T *)g_new0(T, n)
> ++g_new0(T, n)
> +@@
> +type T;
> +expression p, n;
> +@@
> +-(T *)g_renew(T, p, n)
> ++g_renew(T, p, n)
Philippe Mathieu-Daudé Nov. 2, 2017, 4:16 a.m. UTC | #2
Hi Markus,

On 10/09/2017 04:24 AM, Markus Armbruster wrote:
> Philippe Mathieu-Daudé <f4bug@amsat.org> writes:
> 
>> Imported from Markus Armbruster commit b45c03f
>>
>> Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org>
>> ---
>> Signed-off-by: Markus Armbruster <armbru@redhat.com>?
>>
>>  scripts/coccinelle/g_new.cocci | 101 +++++++++++++++++++++++++++++++++++++++++
>>  1 file changed, 101 insertions(+)
>>  create mode 100644 scripts/coccinelle/g_new.cocci
>>
>> diff --git a/scripts/coccinelle/g_new.cocci b/scripts/coccinelle/g_new.cocci
>> new file mode 100644
>> index 0000000000..1e57685a6b
>> --- /dev/null
>> +++ b/scripts/coccinelle/g_new.cocci
>> @@ -0,0 +1,101 @@
>> +/* transform g_new*() alloc with size arguments of the form sizeof(T) [* N]
> 
> Confusing.  Sounds like we transform g_new() into something else.  Also,
> wing both ends of the comment, and start with a capital letter.

Ok

> 
>> + *
>> + *   g_new(T, n) is neater than g_malloc(sizeof(T) * n).  It's also safer,
>> + *   for two reasons.  One, it catches multiplication overflowing size_t.
>> + *   two, it returns T * rather than void *, which lets the compiler catch
> 
> Start your sentences with a capital letter.  Or rather, keep my commit
> message's capital letters intact ;)

Yes :|

> 
>> + *   more type errors.
>> + *
>> + *    Copyright: (C) 2017 Markus Armbruster <armbru@redhat.com>. GPLv2+.
> 
> If you want to put a copyright note into this file, you should stick to
> the common format:
> 
> /*
>  * Rewrite memory allocations to use g_new() & friends
>  *
>  * Copyright (C) 2014-2017 Red Hat, Inc.
>  *
>  * Authors:
>  *  Markus Armbruster <armbru@redhat.com>,
>  *
>  * This work is licensed under the terms of the GNU GPL, version 2 or later.
>  * See the COPYING file in the top-level directory.
>  */

Ok

>> + *    (Imported from b45c03f585ea9bb1af76c73e82195418c294919d)
> 
> Scratch this line.  It's in the commit message, and that suffices.

Ok

>> + *
>> + * See http://lists.nongnu.org/archive/html/qemu-devel/2017-09/msg00908.html:
>> + *
>> + *   g_new() advantages (from glib doc):
>> + *   - the returned pointer is cast to a pointer to the given type.
>> + *   - care is taken to avoid overflow when calculating the size of the
>> + *   allocated block.
> 
> Repeats what you just said in the text pasted from my commit message.

Ok

>> + *
>> + *   p = g_malloc(sizeof(*p)) is idiomatic, and not obviously inferior to
>> + *   p = g_new(T, 1), where T is the type of *p.
>> + *   But once you add multiplication, g_new() adds something useful: overflow
>> + *   protection.  Conversion to g_new() might make sense then.
>> + */
> 
> This part doesn't really apply, yet: the semantic patch doesn't deal
> with sizeof(*p).
> 
> Please write a coherent introduction instead of a series of quotations.

Sorry :S I'll try :)

>> +
>> +@@
>> +type T;
>> +@@
>> +-g_malloc(sizeof(T))
>> ++g_new(T, 1)
>> +@@
>> +type T;
>> +@@
>> +-g_try_malloc(sizeof(T))
>> ++g_try_new(T, 1)
>> +@@
>> +type T;
>> +@@
>> +-g_malloc0(sizeof(T))
>> ++g_new0(T, 1)
>> +@@
>> +type T;
>> +@@
>> +-g_try_malloc0(sizeof(T))
>> ++g_try_new0(T, 1)
>> +
> 
> Any particular reason for adding this blank line?
> 
> You add more below, and a comment.  Okay, but I'd commit the script
> exactly as given in commit b45c03f, then add improvements on top.

Yes.

>> +@@
>> +type T;
>> +expression n;
>> +@@
>> +-g_malloc(sizeof(T) * (n))
>> ++g_new(T, n)
>> +@@
>> +type T;
>> +expression n;
>> +@@
>> +-g_try_malloc(sizeof(T) * (n))
>> ++g_try_new(T, n)
>> +@@
>> +type T;
>> +expression n;
>> +@@
>> +-g_malloc0(sizeof(T) * (n))
>> ++g_new0(T, n)
>> +@@
>> +type T;
>> +expression n;
>> +@@
>> +-g_try_malloc0(sizeof(T) * (n))
>> ++g_try_new0(T, n)
>> +
>> +@@
>> +type T;
>> +expression p, n;
>> +@@
>> +-g_realloc(p, sizeof(T) * (n))
>> ++g_renew(T, p, n)
>> +@@
>> +type T;
>> +expression p, n;
>> +@@
>> +-g_try_realloc(p, sizeof(T) * (n))
>> ++g_try_renew(T, p, n)
>> +
>> +// drop superfluous cast
>> +@@
>> +type T;
>> +expression n;
>> +@@
>> +-(T *)g_new(T, n)
>> ++g_new(T, n)
>> +@@
>> +type T;
>> +expression n;
>> +@@
>> +-(T *)g_new0(T, n)
>> ++g_new0(T, n)
>> +@@
>> +type T;
>> +expression p, n;
>> +@@
>> +-(T *)g_renew(T, p, n)
>> ++g_renew(T, p, n)

Thanks for your review :)

Phil.
diff mbox series

Patch

diff --git a/scripts/coccinelle/g_new.cocci b/scripts/coccinelle/g_new.cocci
new file mode 100644
index 0000000000..1e57685a6b
--- /dev/null
+++ b/scripts/coccinelle/g_new.cocci
@@ -0,0 +1,101 @@ 
+/* transform g_new*() alloc with size arguments of the form sizeof(T) [* N]
+ *
+ *   g_new(T, n) is neater than g_malloc(sizeof(T) * n).  It's also safer,
+ *   for two reasons.  One, it catches multiplication overflowing size_t.
+ *   two, it returns T * rather than void *, which lets the compiler catch
+ *   more type errors.
+ *
+ *    Copyright: (C) 2017 Markus Armbruster <armbru@redhat.com>. GPLv2+.
+ *    (Imported from b45c03f585ea9bb1af76c73e82195418c294919d)
+ *
+ * See http://lists.nongnu.org/archive/html/qemu-devel/2017-09/msg00908.html:
+ *
+ *   g_new() advantages (from glib doc):
+ *   - the returned pointer is cast to a pointer to the given type.
+ *   - care is taken to avoid overflow when calculating the size of the
+ *   allocated block.
+ *
+ *   p = g_malloc(sizeof(*p)) is idiomatic, and not obviously inferior to
+ *   p = g_new(T, 1), where T is the type of *p.
+ *   But once you add multiplication, g_new() adds something useful: overflow
+ *   protection.  Conversion to g_new() might make sense then.
+ */
+
+@@
+type T;
+@@
+-g_malloc(sizeof(T))
++g_new(T, 1)
+@@
+type T;
+@@
+-g_try_malloc(sizeof(T))
++g_try_new(T, 1)
+@@
+type T;
+@@
+-g_malloc0(sizeof(T))
++g_new0(T, 1)
+@@
+type T;
+@@
+-g_try_malloc0(sizeof(T))
++g_try_new0(T, 1)
+
+@@
+type T;
+expression n;
+@@
+-g_malloc(sizeof(T) * (n))
++g_new(T, n)
+@@
+type T;
+expression n;
+@@
+-g_try_malloc(sizeof(T) * (n))
++g_try_new(T, n)
+@@
+type T;
+expression n;
+@@
+-g_malloc0(sizeof(T) * (n))
++g_new0(T, n)
+@@
+type T;
+expression n;
+@@
+-g_try_malloc0(sizeof(T) * (n))
++g_try_new0(T, n)
+
+@@
+type T;
+expression p, n;
+@@
+-g_realloc(p, sizeof(T) * (n))
++g_renew(T, p, n)
+@@
+type T;
+expression p, n;
+@@
+-g_try_realloc(p, sizeof(T) * (n))
++g_try_renew(T, p, n)
+
+// drop superfluous cast
+@@
+type T;
+expression n;
+@@
+-(T *)g_new(T, n)
++g_new(T, n)
+@@
+type T;
+expression n;
+@@
+-(T *)g_new0(T, n)
++g_new0(T, n)
+@@
+type T;
+expression p, n;
+@@
+-(T *)g_renew(T, p, n)
++g_renew(T, p, n)