Re: [PATCH v3] sparse: treat function pointers as pointers to const data

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On 8 September 2014 08:30, Ard Biesheuvel <ard.biesheuvel@xxxxxxxxxx> wrote:
> This code snippet:
>
> static void bar(void const *arg)
> {
>         int (*foo)(void) = arg;
> }
>
> produces the following warning:
>
> test.c:4:28: warning: incorrect type in initializer (different modifiers)
> test.c:4:28:    expected int ( *foo )( ... )
> test.c:4:28:    got void const *arg
>
> which is caused by the fact that the function pointer 'foo' is not annotated
> as being a pointer to const data. However, dereferencing a function pointer
> does not produce an lvalue, so a function pointer points to const data by
> definition, and we should treat it accordingly.
>
> To avoid producing a warning on the inverse case, i.e.,
>
> static void bar(void)
> {
>         void *foo = bar;
> }
>
> we only address the case where the function pointer is the target of
> an assignment.
>
> Reviewed-by: Josh Triplett <josh@xxxxxxxxxxxxxxxx>
> Signed-off-by: Ard Biesheuvel <ard.biesheuvel@xxxxxxxxxx>
> ---
> v3: add rationale for restriction to assignments to commit message
>     add R-b
>
> v2: only treat function pointers as pointers to const data when they are the
>     target of an assignment
>
>  evaluate.c | 9 +++++++++
>  1 file changed, 9 insertions(+)
>
> diff --git a/evaluate.c b/evaluate.c
> index 66556150ddac..a5a830978bda 100644
> --- a/evaluate.c
> +++ b/evaluate.c
> @@ -1359,6 +1359,15 @@ static int compatible_assignment_types(struct expression *expr, struct symbol *t
>                                 typediff = "different address spaces";
>                                 goto Err;
>                         }
> +                       /*
> +                        * If this is a function pointer assignment, it is
> +                        * actually fine to assign a pointer to const data to
> +                        * it, as a function pointer points to const data
> +                        * implicitly, i.e., dereferencing it does not produce
> +                        * an lvalue.
> +                        */
> +                       if (b1->type == SYM_FN)
> +                               mod1 |= MOD_CONST;
>                         if (mod2 & ~mod1) {
>                                 typediff = "different modifiers";
>                                 goto Err;
> --
> 1.8.3.2
>

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




[Index of Archives]     [Newbies FAQ]     [LKML]     [IETF Annouce]     [DCCP]     [Netdev]     [Networking]     [Security]     [Bugtraq]     [Yosemite]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux SCSI]     [Trinity Fuzzer Tool]

  Powered by Linux