Josh Triplett wrote:
> Russ Cox wrote:
>>> Yes, that makes sense.  These functions just check for the annotation on 
>>> their
>>> pointer argument, and having the const annotation would allow them to check
>>> const pointers without provoking a warning due to the lack of const.
>> They don't provoke a warning now.  Sparse is silent on this program:
>>
>>      #define __user __attribute__((noderef, address_space(1)))
>>
>>      extern void __chk_user_ptr(void __user *);
>>
>>      void
>>      f(const void __user *p)
>>      {
>>              __chk_user_ptr(p);
>>      }
> 
> Hmmm, odd.  After a few iterations, I managed to discover that Sparse will
> warn if you attempt to convert a const int * to an int *, but not if you
> attempt to convert a const void * to a void *.  This seems like a bug to me.

This bug appears to come from the following code in compatible_assignment_types:

                /* "void *" matches anything as long as the address space is OK 
*/
                target_as = t->ctype.as | target->ctype.as;
                source_as = s->ctype.as | source->ctype.as;
                if (source_as == target_as && (s->type == SYM_PTR || s->type == 
SYM_ARRAY)) {
                        s = get_base_type(s);
                        t = get_base_type(t);
                        if (s == &void_ctype || t == &void_ctype)
                                goto Cast;
                }

This should almost certainly check more than just address spaces.

- Josh Triplett

Attachment: signature.asc
Description: OpenPGP digital signature

Reply via email to