linux-sparse.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Christopher Li <sparse@chrisli.org>
To: Holger Freyther <zecke@selfish.org>
Cc: linux-sparse@vger.kernel.org
Subject: Re: User question for __context__ or similiar
Date: Wed, 28 Oct 2009 14:25:43 -0700	[thread overview]
Message-ID: <70318cbf0910281425p2db9d304kd2e6f0f2133fd41@mail.gmail.com> (raw)
In-Reply-To: <loom.20091028T113843-308@post.gmane.org>

On Wed, Oct 28, 2009 at 3:56 AM, Holger Freyther <zecke@selfish.org> wrote:
>
> My first thought was that this almost works like locking in the kernel
> but I was wrong. I have used the CHECKER macros from linux/compiler.h
>
> and changed code to
>
> struct gsm_subscriber *subscr_get(struct gsm_subscriber *subscr)
>                                          __acquires(subscr);
> struct gsm_subscriber *subscr_put(struct gsm_subscriber *subscr)
>                                         __releases(subscr);
> struct gsm_subscriber *subscr_find_by_tmsi(int tmsi)
>                                         __acquires(subscr);
>
> and the code like
>
> do_something()
> {
>    subscr = subscr_find_by_tmsi(tmsi);
>    if (!subscr)
>           return;
>
>   if (some_condition) {
> ...
>          subscr_put(subscr);
>   }

The context checker will complain here. In the sparse context checking,
it assert that for each basic block, all entry path of the basic block
should have same context level.

In this case, there are two code path merge into one. The if true path
change the context value to release once(-1). The if not true path has
not changed.
There for, sparse will complain here.

> My assumption would be that sparse is looking at the flows and figures
> out that one path exits without subscr_put being called. Is my assumption

Sparse don't know about subscr_put. It only knows about the context value.
It assert all entry point has same context value, which is a pretty strong
assertion.

e.g. sparse can not handle the following code:

if (flags & NEED_LOCK)
    lock()

do_some_thing()

if (flags & NEED_LOCK)
   unlock()

Even though the test condition is exactly the same for
lock() vs unlock() sparse will still complain at do_some_thing().
Because the one of the incoming code path has lock taken
and the other does not.

In real life execution, there will not be context imbalance,
because same condition controls lock vs unlock. But sparse
has no knowledge about two test condition are exactly the same.
Even the expression are exactly the same, it might yield different
results. Some sparse complain when it is *possible* to get context
imbalanced.


> wrong, would it be worth adding a check that goes through the flow and
> counts ref's/unref's? Am I doing it completely wrong?

It really depends on what you expect sparse to catch.
Sparse will complain if you put lock in a conditional branch,
have one function lock it but use in another function etc.

Hope that helps.

Chris
--
To unsubscribe from this list: send the line "unsubscribe linux-sparse" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

      reply	other threads:[~2009-10-28 21:25 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-10-28 10:56 User question for __context__ or similiar Holger Freyther
2009-10-28 21:25 ` Christopher Li [this message]

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=70318cbf0910281425p2db9d304kd2e6f0f2133fd41@mail.gmail.com \
    --to=sparse@chrisli.org \
    --cc=linux-sparse@vger.kernel.org \
    --cc=zecke@selfish.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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).