Eric Blake <ebl...@redhat.com> writes:

> On 08/25/2015 11:39 AM, Markus Armbruster wrote:
>> 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.
>> 
>> This commit only touches allocations with size arguments of the form
>> sizeof(T).
>> 
>> Coccinelle semantic patch:
>> 
>>     @@
>>     type T;
>>     @@
>>     -g_malloc(sizeof(T))
>>     +g_new(T, 1)
>>     @@
>>     type T;
>
> I find it slightly easier to read coccinelle if there is a blank line
> before every second @@, to call attention to metatype vs. changes
> (coccinelle doesn't care either way).
>
> And it's probably possible to write the coccinelle more succinctly, by
> grouping similar rules together using something like this (although I
> didn't actually test it):
>
> @@
> type T;
> @@
> (
>  g_malloc
> |
>  g_try_malloc
> |
>  g_malloc0
> |
>  g_try_malloc0
> )
> -(sizeof(T))
> +(T, 1)
>
> but it doesn't matter in the long run.

I tend to write really stupid semantic patches, because when I try to
write a clever one, I usually relearn I'm not nearly clever enough for
that.

Amazing tool all the same.

>> Signed-off-by: Markus Armbruster <arm...@redhat.com>
>> ---
>
> Both the coccinelle rule and the resulting conversion look sane.
> Reviewed-by: Eric Blake <ebl...@redhat.com>
>
>> +++ b/hw/gpio/omap_gpio.c
>> @@ -710,8 +710,8 @@ static int omap2_gpio_init(SysBusDevice *sbd)
>>      } else {
>>          s->modulecount = 6;
>>      }
>> -    s->modules = g_malloc0(s->modulecount * sizeof(struct omap2_gpio_s));
>> -    s->handler = g_malloc0(s->modulecount * 32 * sizeof(qemu_irq));
>> +    s->modules = g_new0(struct omap2_gpio_s, s->modulecount);
>> +    s->handler = g_new0(qemu_irq, s->modulecount * 32);
>>      qdev_init_gpio_in(dev, omap2_gpio_set, s->modulecount * 32);
>>      qdev_init_gpio_out(dev, s->handler, s->modulecount * 32);
>
> Thankfully, the '* 32' here does not overflow even pre-patch, since
> s->modulecount was set to a maximum of 6 in the preceding if/else block.

Thanks!

Reply via email to