lkml.org 
[lkml]   [2015]   [Dec]   [28]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[RFC v2 1/3] sparse: Add __private to privatize members of structs
    Date
    In C programming language, we don't have a easy way to privatize a
    member of a structure. However in kernel, sometimes there is a need to
    privatize a member in case of potential bugs or misuses.

    Fortunately, the noderef attribute of sparse is a way to privatize a
    member, as by defining a member as noderef, the address-of operator on
    the member will produce a noderef pointer to that member, and if anyone
    wants to dereference that kind of pointers to read or modify the member,
    sparse will yell.

    Based on this, __private modifier and related operation ACCESS_PRIVATE()
    are introduced, which could help detect undesigned public uses of
    private members of structs. Here is an example of sparse's output if it
    detect an undersigned public use:

    | kernel/rcu/tree.c:4453:25: warning: incorrect type in argument 1 (different modifiers)
    | kernel/rcu/tree.c:4453:25: expected struct raw_spinlock [usertype] *lock
    | kernel/rcu/tree.c:4453:25: got struct raw_spinlock [noderef] *<noident>

    Also, this patch improves compiler.h a little bit by adding comments for
    "#else" and "#endif".

    Signed-off-by: Boqun Feng <boqun.feng@gmail.com>
    ---
    include/linux/compiler.h | 12 ++++++++----
    scripts/checkpatch.pl | 3 ++-
    2 files changed, 10 insertions(+), 5 deletions(-)

    diff --git a/include/linux/compiler.h b/include/linux/compiler.h
    index 4dac103..e4a4fb1 100644
    --- a/include/linux/compiler.h
    +++ b/include/linux/compiler.h
    @@ -20,12 +20,14 @@
    # define __pmem __attribute__((noderef, address_space(5)))
    #ifdef CONFIG_SPARSE_RCU_POINTER
    # define __rcu __attribute__((noderef, address_space(4)))
    -#else
    +#else /* CONFIG_SPARSE_RCU_POINTER */
    # define __rcu
    -#endif
    +#endif /* CONFIG_SPARSE_RCU_POINTER */
    +# define __private __attribute__((noderef))
    extern void __chk_user_ptr(const volatile void __user *);
    extern void __chk_io_ptr(const volatile void __iomem *);
    -#else
    +# define ACCESS_PRIVATE(p, member) (*((typeof((p)->member) __force *) &(p)->member))
    +#else /* __CHECKER__ */
    # define __user
    # define __kernel
    # define __safe
    @@ -44,7 +46,9 @@ extern void __chk_io_ptr(const volatile void __iomem *);
    # define __percpu
    # define __rcu
    # define __pmem
    -#endif
    +# define __private
    +# define ACCESS_PRIVATE(p, member) ((p)->member)
    +#endif /* __CHECKER__ */

    /* Indirect macros required for expanded argument pasting, eg. __LINE__. */
    #define ___PASTE(a,b) a##b
    diff --git a/scripts/checkpatch.pl b/scripts/checkpatch.pl
    index 2b3c228..fda1c61 100755
    --- a/scripts/checkpatch.pl
    +++ b/scripts/checkpatch.pl
    @@ -269,7 +269,8 @@ our $Sparse = qr{
    __init_refok|
    __kprobes|
    __ref|
    - __rcu
    + __rcu|
    + __private
    }x;
    our $InitAttributePrefix = qr{__(?:mem|cpu|dev|net_|)};
    our $InitAttributeData = qr{$InitAttributePrefix(?:initdata\b)};
    --
    2.6.4


    \
     
     \ /
      Last update: 2015-12-29 05:41    [W:4.148 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site