From: Dan Carpenter <dan.carpenter@oracle.com>
To: kernel-janitors@vger.kernel.org
Subject: Re: [patch] perf/x86/intel/pt: cleanup error handling in pt_pmu_hw_init()
Date: Thu, 09 Apr 2015 13:30:52 +0000 [thread overview]
Message-ID: <20150409133052.GA16501@mwanda> (raw)
In-Reply-To: <20150409090805.GG17605@mwanda>
On Thu, Apr 09, 2015 at 02:45:30PM +0200, Peter Zijlstra wrote:
> On Thu, Apr 09, 2015 at 03:33:36PM +0300, Dan Carpenter wrote:
> > Also I have come to despise "err" labels. They do one of three things:
> >
> > 1) Nothing. These are a pointless interruption for people reading the
> > code from top to bottom because you wonder, "How is goto err
> > different from return -ENOMEM?". You scroll down to the bottom and
> > find that they are the same. Now you have lost your place and your
> > train of thought.
> >
> > 2) One thing. In this case the label is poorly named, better to say
> > "goto unlock".
> >
> > 3) Everything. This is a leading source of error handling bugs. It
> > looks like this.
> >
> > err:
> > kfree(foo);
> > return ret;
>
> 4) unwind complex state; see for example copy_process(). You do not
> want to endlessly duplicate the increasing cleanup for every exit.
I *like* using gotos for unwinding. It's specifically the err:, out:,
and bail: type labels I object to. The error handling in copy_process()
is pretty clean but the fork_out label is kind of useless. Here is how
it's used.
kernel/fork.c
1285 if (clone_flags & CLONE_SIGHAND) {
1286 if ((clone_flags & (CLONE_NEWUSER | CLONE_NEWPID)) ||
1287 (task_active_pid_ns(current) ! 1288 current->nsproxy->pid_ns_for_children))
1289 return ERR_PTR(-EINVAL);
^^^^^^^^^^^^^^^^^^^^^^^
This direct return is clear.
1290 }
1291
1292 retval = security_task_create(clone_flags);
1293 if (retval)
1294 goto fork_out;
^^^^^^^^^^^^^
This does the same thing but it's more ambigous. You have to scroll
down 350 lines to find out what it does.
>
> > Later we will change it so that foo is allocated with kmemdup_user()
> > instead of kmalloc() so now kfree() will oops trying to free the error
> > pointer.
>
> That's just poor engineering in the first place, if you change the alloc
> site you had better also look for all the free sites. Error labels have
> nothing to do with that, alloc/free can be otherwise separated and hard
> to correlate, in fact error labels can be some of the easier places to
> find.
A more typical example is:
err:
mega_free_function(foo);
return ret;
But inside mega_free_function() function it dereferences foo->bar which
is still NULL. The problem with one err bugs is that you're merging
a lot of error paths together and then separating them out using if
statements and it's easy to make a mistake. If you unwind like:
err_free_bar:
kfree(foo->bar);
err_free_foo:
kfree(foo);
return ret;
That is less error prone.
regards,
dan carpenter
next prev parent reply other threads:[~2015-04-09 13:30 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-04-09 9:08 [patch] perf/x86/intel/pt: cleanup error handling in pt_pmu_hw_init() Dan Carpenter
2015-04-09 12:02 ` Ingo Molnar
2015-04-09 12:33 ` Dan Carpenter
2015-04-09 12:45 ` Peter Zijlstra
2015-04-09 12:47 ` Alexander Shishkin
2015-04-09 13:30 ` Dan Carpenter [this message]
2015-04-09 14:54 ` Ingo Molnar
2015-04-09 15:27 ` Dan Carpenter
2015-04-11 8:37 ` Ingo Molnar
2015-04-11 11:03 ` Dan Carpenter
2015-04-12 9:38 ` Ingo Molnar
2015-04-12 9:51 ` Julia Lawall
2015-04-12 10:18 ` Ingo Molnar
2015-04-12 17:27 ` [tip:perf/core] perf/x86/intel/pt: Clean up the control flow " tip-bot for Ingo Molnar
2015-04-15 10:10 ` [patch] perf/x86/intel/pt: cleanup error handling " Alexander Shishkin
2015-04-15 10:27 ` Dan Carpenter
2015-04-15 10:50 ` Alexander Shishkin
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150409133052.GA16501@mwanda \
--to=dan.carpenter@oracle.com \
--cc=kernel-janitors@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.