On Mon, 12 Feb 2007, Anton Altaparmakov wrote:
>
> Using latest code from
> git://git.kernel.org/pub/scm/linux/kernel/git/josh/sparse.git
>
> When I run: make CHECKFLAGS="-D__CHECK_ENDIAN__" C=2 modules
>
> I get this warning:
>
> CHECK fs/ntfs/file.c
> fs/ntfs/file.c:2241:5: warning: incorrect type in argument 8 (different
> signedness)
> fs/ntfs/file.c:2241:5: expected int [signed] ( [signed] [usertype]
> get_block )( ... )
> fs/ntfs/file.c:2241:5: got int [signed] ( static [toplevel] *<noident> )(
> ... )
Ok, that does seem like a sparse bug. I _think_ that the trigger here is
the fact that we make "get_block_t" be the *function* type, rather than a
"pointer to function" type, and then we screw up somewhere when we do the
don't do the implicit pointer conversion, and we also thus don't move the
type attributes around properly (notice how "get_block" is marked as being
a "signed usertype", _not_ a pointer).
So we should really have converted the function type in the declaration to
a "pointer to function", but since this is such an unusual thing to have,
nobody noticed.
Does the warning go away if you make "get_block_t" explicitly a pointer to
a function, ie you add the "*" to the typedef:
> From <include/linux/fs.h>:
>
> typedef int (get_block_t)(struct inode *inode, sector_t iblock,
> struct buffer_head *bh_result, int create);
so that it looks like
typedef int (*get_block_t)(...)
instead?
(It is perfectly proper to have a typedef that is actually of a function
type, so this looks like a sparse bug regardless, it looks just as if we
don't turn a function type into a function pointer type when we see it as
an argument in the declaration).
Has this been there for a long time, or was it something recent in sparse
that seemed to trigger it (like the recent ctype conversion changes due to
attribute parsing?)
Linus
-
To unsubscribe from this list: send the line "unsubscribe linux-sparse" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html