Ping...

for the C++ part of this patch:

https://gcc.gnu.org/ml/gcc-patches/2017-10/msg00559.html


Thanks
Bernd.

> On 10/10/17 00:30, Bernd Edlinger wrote:
>> On 10/09/17 20:34, Martin Sebor wrote:
>>> On 10/09/2017 11:50 AM, Bernd Edlinger wrote:
>>>> On 10/09/17 18:44, Martin Sebor wrote:
>>>>> On 10/07/2017 10:48 AM, Bernd Edlinger wrote:
>>>>>> Hi!
>>>>>>
>>>>>> I think I have now something useful, it has a few more heuristics
>>>>>> added, to reduce the number of false-positives so that it
>>>>>> is able to find real bugs, for instance in openssl it triggers
>>>>>> at a function cast which has already a TODO on it.
>>>>>>
>>>>>> The heuristics are:
>>>>>> - handle void (*)(void) as a wild-card function type.
>>>>>> - ignore volatile, const qualifiers on parameters/return.
>>>>>> - handle any pointers as equivalent.
>>>>>> - handle integral types, enums, and booleans of same precision
>>>>>>     and signedness as equivalent.
>>>>>> - stop parameter validation at the first "...".
>>>>>
>>>>> These sound quite reasonable to me.  I have a reservation about
>>>>> just one of them, and some comments about other aspects of the
>>>>> warning.  Sorry if this seems like a lot.  I'm hoping you'll
>>>>> find the feedback constructive.
>>>>>
>>>>> I don't think using void(*)(void) to suppress the warning is
>>>>> a robust solution because it's not safe to call a function that
>>>>> takes arguments through such a pointer (especially not if one
>>>>> or more of the arguments is a pointer).  Depending on the ABI,
>>>>> calling a function that expects arguments with none could also
>>>>> mess up the stack as the callee may pop arguments that were
>>>>> never passed to it.
>>>>>
>>>>
>>>> This is of course only a heuristic, and if there is no warning
>>>> that does not mean any guarantee that there can't be a problem
>>>> at runtime.  The heuristic is only meant to separate the
>>>> bad from the very bad type-cast.  In my personal opinion there
>>>> is not a single good type cast.
>>>
>>> I agree.  Since the warning uses one kind of a cast as an escape
>>> mechanism from the checking it should be one whose result can
>>> the most likely be used to call the function without undefined
>>> behavior.
>>>
>>> Since it's possible to call any function through a pointer to
>>> a function with no arguments (simply by providing arguments of
>>> matching types) it's a reasonable candidate.
>>>
>>> On the other hand, since it is not safe to call an arbitrary
>>> function through void (*)(void), it's not as good a candidate.
>>>
>>> Another reason why I think a protoype-less function is a good
>>> choice is because the alias and ifunc attributes already use it
>>> as an escape mechanism from their type incompatibility warning.
>>>
>>
>> I know of pre-existing code-bases where a type-cast to type:
>> void (*) (void);
>>
>> .. is already used as a generic function pointer: libffi and
>> libgo, I would not want to break these.
>>
>> Actually when I have a type:
>> X (*) (...);
>>
>> I would like to make sure that the warning checks that
>> only functions returning X are assigned.
>>
>> and for X (*) (Y, ....);
>>
>> I would like to check that anything returning X with
>> first argument of type Y is assigned.
>>
>> There are code bases where such a scheme is used.
>> For instance one that I myself maintain: the OPC/UA AnsiC Stack,
>> where I have this type definition:
>>
>> typedef OpcUa_StatusCode (OpcUa_PfnInvokeService)(OpcUa_Endpoint
>> hEndpoint, ...);
>>
>> And this plays well together with this warning, because only
>> functions are assigned that match up to the ...);
>> Afterwards this pointer is cast back to the original signature,
>> so everything is perfectly fine.
>>
>> Regarding the cast from pointer to member to function, I see also a
>> warning without -Wpedantic:
>> Warnung: converting from »void (S::*)(int*)« to »void (*)(int*)«
>> [-Wpmf-conversions]
>>      F *pf = (F*)&S::foo;
>>                      ^~~
>>
>> And this one is even default-enabled, so I think that should be
>> more than sufficient.
>>
>> I also changed the heuristic, so that your example with the enum should
>> now work.  I did not add it to the test case, because it would
>> break with -fshort-enums :(
>>
>> Attached I have an updated patch that extends this warning to the
>> pointer-to-member function cast, and relaxes the heuristic on the
>> benign integral type differences a bit further.
>>
>>
>> Is it OK for trunk after bootstrap and reg-testing?
>>
>>
>> Thanks
>> Bernd.
>>

Reply via email to