Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

can: softing: softing_main: ensure a consistent return value in error case

Typically, the return value desired for the failure of a function with an
integer return value is a negative integer. In these cases, the return
value is sometimes a negative integer and sometimes 0, due to a subsequent
initialization of the return variable within the loop.

A simplified version of the semantic match that finds this problem is:
(http://coccinelle.lip6.fr/)

//<smpl>
@r exists@
identifier ret;
position p;
constant C;
expression e1,e3,e4;
statement S;
@@

ret = -C
... when != ret = e3
when any
if@p (...) S
... when any
if (\(ret != 0\|ret < 0\|ret > 0\) || ...) { ... return ...; }
... when != ret = e3
when any
*if@p (...)
{
... when != ret = e4
return ret;
}
//</smpl>

Signed-off-by: Julia Lawall <Julia.Lawall@lip6.fr>
Acked-by: Kurt Van Dijck <kurt.van.dijck@eia.be>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>

authored by

Julia Lawall and committed by
Marc Kleine-Budde
da78b799 0e84eb0b

+1 -1
+1 -1
drivers/net/can/softing/softing_main.c
··· 826 826 goto sysfs_failed; 827 827 } 828 828 829 - ret = -ENOMEM; 830 829 for (j = 0; j < ARRAY_SIZE(card->net); ++j) { 831 830 card->net[j] = netdev = 832 831 softing_netdev_create(card, card->id.chip[j]); 833 832 if (!netdev) { 834 833 dev_alert(&pdev->dev, "failed to make can[%i]", j); 834 + ret = -ENOMEM; 835 835 goto netdev_failed; 836 836 } 837 837 priv = netdev_priv(card->net[j]);