2019-10-19 08:18:39

by Ben Dooks

[permalink] [raw]
Subject: sparse: __pure declaration only

I'm seeing the following sparse warnings where the declaration
has __pure but the implementation does not.

> lib/bitmap.c:62:6: error: symbol '__bitmap_or_equal' redeclared with different type (originally declared at ./include/linux/bitmap.h:123) - different modifiers

is this a valid warning? if not, should sparse be ignoring these.

Note:
> include/linux/bitmap.h:extern bool __pure __bitmap_or_equal(const unsigned long *src1,
> lib/bitmap.c:bool __bitmap_or_equal(const unsigned long *bitmap1,


--
Ben Dooks http://www.codethink.co.uk/
Senior Engineer Codethink - Providing Genius

https://www.codethink.co.uk/privacy.html


2019-10-19 08:36:36

by Linus Torvalds

[permalink] [raw]
Subject: Re: sparse: __pure declaration only

On Fri, Oct 18, 2019 at 4:15 AM Ben Dooks <[email protected]> wrote:
>
> is this a valid warning? if not, should sparse be ignoring these.

It's technically valid, but maybe it's not useful.

If we make sure that any pure bits from a declaration always make it
into the definition, then I suspect that the "was not declared"
warning (if the definition is non-static and seen without a
declaration) is sufficient.

Of course, sparse doesn't actually _care_ about "pure" in the
definition, only in the use, so right now it doesn't even make any
difference to sparse whether the definition has the "pure" or not.
It's only when the function is used that the "pure" matters (it makes
the call instruction be CSE'd like any other random instruction).

Linus

2019-10-20 05:53:37

by Luc Van Oostenryck

[permalink] [raw]
Subject: Re: sparse: __pure declaration only

On Fri, Oct 18, 2019 at 08:31:48AM -0700, Linus Torvalds wrote:
> On Fri, Oct 18, 2019 at 4:15 AM Ben Dooks <[email protected]> wrote:
> >
> > is this a valid warning? if not, should sparse be ignoring these.
>
> It's technically valid, but maybe it's not useful.
>
> If we make sure that any pure bits from a declaration always make it
> into the definition, then I suspect that the "was not declared"
> warning (if the definition is non-static and seen without a
> declaration) is sufficient.
>
> Of course, sparse doesn't actually _care_ about "pure" in the
> definition, only in the use, so right now it doesn't even make any
> difference to sparse whether the definition has the "pure" or not.
> It's only when the function is used that the "pure" matters (it makes
> the call instruction be CSE'd like any other random instruction).

Yes, for 'pure' it doesn't matter much but it's a problem anyway.
For example with 'static':

$ cat file.c
static void foo(void);
void foo(void) { }

$ sparse file.c
file.c:2:6: warning: symbol 'foo' was not declared. Should it be static?

Which is kinda absurd: foo() was declared and was even declared static.
But the definition is a different symbol than its declaration (OK) which
doesn't 'inherit' the declaration's specifier/modifier/attributes.
It's on my to-be-fixed list for a long time but ..

-- Luc