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.

> 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.

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to