Hi!

I'd like to ping for my patch here:
https://gcc.gnu.org/ml/gcc-patches/2016-10/msg01348.html


Thanks
Bernd.

On 10/17/16 21:18, Bernd Edlinger wrote:
> On 10/17/16 20:05, Joseph Myers wrote:
>> On Sun, 16 Oct 2016, Bernd Edlinger wrote:
>>
>>> Second, the declaration in the glibc header files simply look wrong,
>>> because the type of argv, and envp is "char *const *" while the
>>> builtin function wants "const char**", thus only the array of char*
>>> itself is const, not the actual char stings they point to.
>>
>> char *const * is the POSIX type.  (It can't be const char ** or const
>> char
>> *const * because you can't convert char ** implicitly to those types in
>> ISO C.)  You'd need to check the list archives for rationale for the
>> built-in functions doing something different.
>>
>
> Yes, that was discussed here:
> https://gcc.gnu.org/ml/gcc-patches/2004-03/msg01148.html
>
> No mention why the BT_PTR_CONST_TYPE does not match the posix type.
> But the right types were used on __gcov_execv/e/p stubs, so the author
> did know the right types at least.
>
> So I think that was broken from the beginning, but that was hidden by
> the loose checking in the C FE and not warning in the C++ FE when
> prototypes don't match.
>
>>> Third, in C the  builtins are not diagnosed, because C does only look
>>> at the mode of the parameters see match_builtin_function_types in
>>> c/c-decl.c, which may itself be wrong, because that makes an ABI
>>> decision dependent on the mode of the parameter.
>>
>> The matching needs to be loose because of functions using types such as
>> FILE * where the compiler doesn't know the exact contents of the type
>> when
>> processing built-in function definitions.  (Historically there were also
>> issues with pre-ISO headers, but that may be less relevant now.)
>>
>
> The C++ FE has exactly the same problem with FILE* and struct tm*
> but it solves it differently and "learns" the type but only for FILE*
> and with this patch also for const struct tm*.  It is a lot more
> restrictive than C, but that is because of the ++ ;)
>
> Well in that case the posix functions have to use the prototypes
> from POSIX.1.2008 although their rationale is a bit silly...
>
> This updated patch fixes the prototype of execv/p/e,
> and adds a new test case that checks that no type conflict
> exists in the execve built-in any more.
>
> Now we have no -Wsystem-headers warnings with glibc-headers any more.
> And the gcov builtin also is working with C++.
>
> Bootstrapped and reg-tested on x86_64-pc-linux-gnu.
> Is it OK for trunk?
>
>
> Thanks
> Bernd.

Reply via email to