Dmitry Eremin-Solenikov(lumag) replied on github web page:

test/validation/api/pktio/pktio.c
line 16
@@ -1195,10 +1195,8 @@ void pktio_test_index(void)
 
        ndx = odp_pktio_index(pktio);
        CU_ASSERT(ndx >= 0);
-       CU_ASSERT(odp_pktio_index(pktio_inval) < 0);
 
        CU_ASSERT(odp_pktio_close(pktio) == 0);
-       CU_ASSERT(odp_pktio_index(pktio) < 0);


Comment:
@psavol Totally agree about close + index.

> Petri Savolainen(psavol) wrote:
> To me "(e.g. handle not valid)" does not yet guarantee the check. This would: 
> "<0    When pktio handle is invalid, or some other error happened".
> 
> In general, we should remove all such "e.g. handle not valid" comments.


>> Petri Savolainen(psavol) wrote:
>> API does not (and should not) guarantee that invalid or stale handles are 
>> checked on fast path functions, such as this conversion to index. 
>> Especially, any API function is not specified to check against stale 
>> handles. Function may return -1, if it finds an error but we don't guarantee 
>> which errors are checked. For example, there may be check against invalid 
>> handle, but there may not be either. Invalid values are mostly needed for 
>> API function to be able return that e.g. create/open/alloc failed. E.g. 
>> here, application should check that pktio open succeeded, if it did not 
>> succeed it should not continue and pass that invalid handle to other pktio 
>> calls. That way every API call does not need to check the handle, only 
>> application needs to check it once after open/create/alloc.
>> 
>> This close + index test above it basically the same thing as doing:
>> odp_packet_free(pkt);
>> data = odp_packet_data(pkt);
>> // now we can assume that data is NULL, since pkt packet was freed and this 
>> function always searches through valid handles and notices that this handle 
>> value is not valid anymore.


>>> Petri Savolainen(psavol) wrote:
>>> Those need to be inside #include <odp/visibility_begin.h> #include 
>>> <odp/visibility_end.h>. It's cleaner to have one vs multiple such regions 
>>> in one c file.


>>>> Dmitry Eremin-Solenikov(lumag) wrote:
>>>> We can have `_odp_pktio_index()` which does not perform such checks and 
>>>> `odp_pktio_index()` which does `ODP_PKTIO_INVALID` check.


>>>>> Dmitry Eremin-Solenikov(lumag) wrote:
>>>>> Generally I would agree. However we explicitly have the invalid usecase 
>>>>> in API:
>>>>> ```
>>>>> @retval <0     On failure (e.g., handle not valid)
>>>>> ```


>>>>>> Dmitry Eremin-Solenikov(lumag) wrote:
>>>>>> Is there a reason to move function bodies?


>>>>>>> Dmitry Eremin-Solenikov(lumag) wrote:
>>>>>>> Maybe `(uintptr_t)(handle) == (uintptr_t)0` would do the trick?


>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>> Very strange. I'm Ok with this workaround, but a comment about clang 
>>>>>>>> version might be appropriate. Don't know if it's worth doing a clang 
>>>>>>>> version check. We do things like that in the `ODP_STATIC_ASSERT()` 
>>>>>>>> macro itself for similar reasons.


>>>>>>>>> Petri Savolainen(psavol) wrote:
>>>>>>>>> odp_packet.c:52:19: error: static_assert expression is not an 
>>>>>>>>> integral constant
>>>>>>>>>       expression
>>>>>>>>> ODP_STATIC_ASSERT(_odp_typeval(ODP_BUFFER_INVALID) == 0, "Buffer 
>>>>>>>>> inval not 0");
>>>>>>>>> ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>>>>>>> ../../platform/linux-generic/include/odp/api/plat/strong_types.h:32:30:
>>>>>>>>>  note: 
>>>>>>>>>       expanded from macro '_odp_typeval'
>>>>>>>>> #define _odp_typeval(handle) ((uint32_t)(uintptr_t)(handle))
>>>>>>>>>                              ^
>>>>>>>>> ../../include/odp/api/abi-default/debug.h:26:53: note: expanded from 
>>>>>>>>> macro
>>>>>>>>>       'ODP_STATIC_ASSERT'
>>>>>>>>> #define ODP_STATIC_ASSERT(cond, msg) _Static_assert(cond, msg)
>>>>>>>>>                                                     ^~~~
>>>>>>>>> odp_packet.c:52:19: note: cast that performs the conversions of a
>>>>>>>>>       reinterpret_cast is not allowed in a constant expression
>>>>>>>>> ../../platform/linux-generic/include/odp/api/plat/strong_types.h:32:41:
>>>>>>>>>  note: 
>>>>>>>>>       expanded from macro '_odp_typeval'
>>>>>>>>> #define _odp_typeval(handle) ((uint32_t)(uintptr_t)(handle))


>>>>>>>>>> Petri Savolainen(psavol) wrote:
>>>>>>>>>> static_assert() seems special. The clang version in Travis does not 
>>>>>>>>>> accept type casts with static_assert(). The cast confuses it to 
>>>>>>>>>> think that (uintptr_t)0 == 0 is not an integral constant.


>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>> `_odp_typeval()` is defined as:
>>>>>>>>>>> ```
>>>>>>>>>>> #define _odp_typeval(handle) ((uint32_t)(uintptr_t)(handle))
>>>>>>>>>>> ```
>>>>>>>>>>> It's used elsewhere in the ODP code and clang doesn't have any 
>>>>>>>>>>> problem with it. I've verified this works for clang 4.2.1.  Since 
>>>>>>>>>>> it works elsewhere on Travis I'm not sure why it wouldn't in this 
>>>>>>>>>>> instance.


>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>> I'm OK with just a modified commit name. I agree we needn't be too 
>>>>>>>>>>>> granular about these things.


>>>>>>>>>>>>> Petri Savolainen(psavol) wrote:
>>>>>>>>>>>>> I could rename the patch to:
>>>>>>>>>>>>> "linux-gen: packet: use inlined flow hash and ts set"
>>>>>>>>>>>>> 
>>>>>>>>>>>>> ... if necessary. The comment says already that also ts set is 
>>>>>>>>>>>>> modified the same way.


>>>>>>>>>>>>>> Petri Savolainen(psavol) wrote:
>>>>>>>>>>>>>> I did try several combinations of type casts of invalid values, 
>>>>>>>>>>>>>> also cast to uintptr_t. The problem is that gcc and clang (clang 
>>>>>>>>>>>>>> version 3.8.0-2ubuntu4) of my machine accepted all of those 
>>>>>>>>>>>>>> casts, but the clang version in Travis (clang version 
>>>>>>>>>>>>>> 3.8.0-2ubuntu3~trusty5) does not accept anything.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> Maybe it's a bug in the particular version of clang. Anyway, 
>>>>>>>>>>>>>> addition of this check even only on gcc side is improvement 
>>>>>>>>>>>>>> against what we currently have (no check). Packet invalid is 
>>>>>>>>>>>>>> currently 0xfffffff in ABI spec, but event/buffer invalid are 0.
>>>>>>>>>>>>>> 
>>>>>>>>>>>>>> odp_packet.c:55:19: error: static_assert expression is not an 
>>>>>>>>>>>>>> integral constant
>>>>>>>>>>>>>>       expression
>>>>>>>>>>>>>> ODP_STATIC_ASSERT(((uintptr_t)ODP_PACKET_INVALID) == 0, "Packet 
>>>>>>>>>>>>>> invalid not 0");
>>>>>>>>>>>>>> ~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>>>>>>>>>>>>>> ../../include/odp/api/abi-default/debug.h:26:53: note: expanded 
>>>>>>>>>>>>>> from macro
>>>>>>>>>>>>>>       'ODP_STATIC_ASSERT'
>>>>>>>>>>>>>> #define ODP_STATIC_ASSERT(cond, msg) _Static_assert(cond, msg)
>>>>>>>>>>>>>>                                                     ^~~~
>>>>>>>>>>>>>> odp_packet.c:55:20: note: cast that performs the conversions of a
>>>>>>>>>>>>>>       reinterpret_cast is not allowed in a constant expression
>>>>>>>>>>>>>> ODP_STATIC_ASSERT(((uintptr_t)ODP_PACKET_INVALID) == 0, "Packet 
>>>>>>>>>>>>>> invalid not 0");
>>>>>>>>>>>>>>                    ^


>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>> Since you want to breech the strong type you need to use the 
>>>>>>>>>>>>>>> internal `odp_typeval()` macro here. 
>>>>>>>>>>>>>>> ```
>>>>>>>>>>>>>>> ODP_STATIC_ASSERT(_odp_typeval(ODP_EVENT_INVALID) == 0, "Event 
>>>>>>>>>>>>>>> invalid not 0");
>>>>>>>>>>>>>>> ```
>>>>>>>>>>>>>>> etc. I've verified that this works fine for clang, so no need 
>>>>>>>>>>>>>>> for the conditional compilation.


>>>>>>>>>>>>>>>> Bill Fischofer(Bill-Fischofer-Linaro) wrote:
>>>>>>>>>>>>>>>> Should this be in its own commit? Different function.


https://github.com/Linaro/odp/pull/437#discussion_r165285392
updated_at 2018-02-01 08:29:14

Reply via email to