Petri Savolainen(psavol) 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:
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_r165280121
updated_at 2018-02-01 07:55:59

Reply via email to