Joe Buck writes:
> inline size_t __compute_size(size_t num, size_t size) {
>     size_t product = num * size;
>     return product >= num ? product : ~size_t(0);
> }

Florian Weimer writes:
>I don't think this check is correct.  Consider num = 0x33333334 and
>size = 6.  It seems that the check is difficult to perform efficiently
>unless the architecture provides unsigned multiplication with overflow
>detection, or an instruction to implement __builtin_clz.

This should work instead:

        inline size_t __compute_size(size_t num, size_t size) {
                if (num > ~size_t(0) / size) 
                        return ~size_t(0);
                return num * size;
        }

                                        Ross Ridge

Reply via email to