On 12/24/2014 03:32 PM, Bill Fischofer wrote:
The ODP_BITSIZE macro returns the number of bits needed to store x. For example, ODP_BITSIZE(14) = 4. So if someone specified ODP_CONFIG_BUFFER_POOLS at 14, then the check would ensure that we didn't receive a handle with a pool_id of 14 or 15 (which would be invalid). Because in this case ODP_CONFIG_BUFFER_POOLS is 16 then Coverity says (correctly) that the test can never be true since a 4 bit value can never be >= 16, however this is a false positive because the test isn't there for any specific value but for any value of ODP_CONFIG_BUFFER_POOLS. ODP doesn't require that this be specified as a power of two. Powers of two are fine for small numbers but problematic for larger ones, so no need to force this.

The compiler is smart enough to know when the test can never be true and won't generate any additional code if ODP_CONFIG_BUFFER_POOLS is a power of two. But if it isn't a power of two then the code will be generated. So it's there when we need it and not there otherwise, which is exactly what we want. Coverity just needs to ignore this because it's doing simple static analysis and not seeing the bigger picture.

Ok, thanks.

Mike can you mark that as false positive?

Maxim.


On Wed, Dec 24, 2014 at 5:39 AM, Maxim Uvarov <[email protected] <mailto:[email protected]>> wrote:

    On 12/23/2014 04:01 PM, Bill Fischofer wrote:



        On Tue, Dec 23, 2014 at 5:39 AM, Maxim Uvarov
        <[email protected] <mailto:[email protected]>
        <mailto:[email protected]
        <mailto:[email protected]>>> wrote:

            CID 85006:  Operands don't affect result
        (CONSTANT_EXPRESSION_RESULT)
                "handle.pool_id >= 16" is always false regardless of
        the values of
                its operands. This occurs as the logical second
        operand of '||'.

            Signed-off-by: Maxim Uvarov <[email protected]
        <mailto:[email protected]>
            <mailto:[email protected]
        <mailto:[email protected]>>>
            ---
             platform/linux-generic/include/odp_buffer_inlines.h | 4 ++--
             1 file changed, 2 insertions(+), 2 deletions(-)

            diff --git
        a/platform/linux-generic/include/odp_buffer_inlines.h
            b/platform/linux-generic/include/odp_buffer_inlines.h
            index f880445..a28e1f1 100644
            --- a/platform/linux-generic/include/odp_buffer_inlines.h
            +++ b/platform/linux-generic/include/odp_buffer_inlines.h
            @@ -99,8 +99,8 @@ static inline odp_buffer_hdr_t
            *validate_buf(odp_buffer_t buf)
                    odp_buffer_hdr_t *buf_hdr;
                    handle.u32 = buf;

            -       /* For buffer handles, segment index must be 0 and
        pool id
            in range */
            -       if (handle.seg != 0 || handle.pool_id >=
            ODP_CONFIG_BUFFER_POOLS)


        It is erroneous to delete this check.  The coverity warning is
        a false positive that arises only in cases where
        ODP_CONFIG_BUFFER_POOLS happens to be a power of two, which is
        the case here but is not necessarily true.


    Bill, I think you might be not correct. If I understand core right
    then:

    uint32_t pool_id:ODP_BUFFER_POOL_BITS;

    #define ODP_CONFIG_BUFFER_POOLS 16
    #define ODP_BUFFER_POOL_BITS  ODP_BITSIZE(ODP_CONFIG_BUFFER_POOLS)

    And this macro:

    #define ODP_BITSIZE(x) \
        ((x) <=     2 ?  1 : \
        ((x) <=     4 ?  2 : \
        ((x) <=     8 ?  3 : \
        ((x) <=    16 ?  4 : \
        ((x) <=    32 ?  5 : \
        ((x) <=    64 ?  6 : \
        ((x) <=   128 ?  7 : \
        ((x) <=   256 ?  8 : \
        ((x) <=   512 ?  9 : \
        ((x) <=  1024 ? 10 : \
        ((x) <=  2048 ? 11 : \
        ((x) <=  4096 ? 12 : \
        ((x) <=  8196 ? 13 : \
        ((x) <= 16384 ? 14 : \
        ((x) <= 32768 ? 15 : \
        ((x) <= 65536 ? 16 : \
         (0/0)))))))))))))))))

    So ODP_CONFIG_BUFFER_POOLS must be power of two or it will fall
    back to 0.

    Maxim.

            +       /* For buffer handles, segment index must be 0 */
            +       if (handle.seg != 0)
                            return NULL;

                    pool_entry_t *pool =
        odp_pool_to_entry(handle.pool_id);
            --
            1.8.5.1.163.gd7aced9


            _______________________________________________
            lng-odp mailing list
        [email protected] <mailto:[email protected]>
        <mailto:[email protected]
        <mailto:[email protected]>>
        http://lists.linaro.org/mailman/listinfo/lng-odp





_______________________________________________
lng-odp mailing list
[email protected]
http://lists.linaro.org/mailman/listinfo/lng-odp

Reply via email to