[OpenJDK 2D-Dev] RFR 8144445: Maximum size checking in Marlin ArrayCache utility methods is not optimal

Jim Graham james.graham at oracle.com
Wed Dec 9 22:08:09 UTC 2015


Looks good.

And verified that the test fails before the fix and passes after...

			...jim

On 12/9/15 1:38 PM, Laurent Bourgès wrote:
> Hi Jim,
>
> I took me some time to understand your detailled analysis and make a new
> webrev:
> http://cr.openjdk.java.net/~lbourges/marlin/marlin-8144445.2/
>
> I think I adopted all your change proposals, see below:
>
>     In looking this over again I notice that really the exceptions are
>     only thrown on "out of range" needSize values and they are probably
>     always thrown in that case, but sometimes we only discover those
>     range issues if other things fail and many of the tests that lead to
>     getting to that statement may or may not operate correctly depending
>     on whether they are dealing with a valid needSize (for instance
>     testing against "< needSize" when needSize might be negative,
>     etc.).  It makes verifying this code much more difficult due to
>     having to deal with cases where multiple variables might be out of
>     range when they are computed or compared against each other.  To
>     that end, it might be more straightforward to simply test needSize
>     at the top and then the rest of the function can know it is dealing
>     with a proper value for needSize and only has to worry about
>     returning a non-overflowing number.  Knowing that needSize is a
>     valid number makes any computations with it or compares against it
>     have fewer "failure conditions" to note and vet.
>
>
> I followed your approach and I agree it is more clear.
>
>
>     For example:
>
>     first function:
>
>     185-189 move to the top of the function and only test needSize and
>     then later on line 177 we capture any overflow since we know that
>     needSize cannot be negative as well.  180,182 are then sufficient to
>     make sure that the value calculated in that case will be >= needSize.
>
>
> Fixed.
>
>     second function:
>
>     215-220 also move to the top of that function and 214 (if it
>     compares size in both cases) is sufficient to make sure we are
>     returning a value >= needSize in all cases.  As it stands 210 and
>     212 could be computing random values and the tests at 214 and later
>     are no longer complicated by having to consider the case that
>     needSize itself is wrong - they only have to deal with whether the
>     returned size bumped out of range.
>
>
> Fixed.
>
>     general note:
>
>     Also, "(longval < 0L || longval > MAX_INT)" can be calculated as
>     "((longval >> 31) != 0)".
>
>
> Thanks for the tip: I use it now.
>
>         I could also check size < 0L if you want but it is only possible if
>         curSize < 0 (that should never happen) !
>
>
>     That may be true at line 209, but then you test it against needSize
>     and do more calculations where the new value of size depends only on
>     needSize and so its dependence on curSize no longer offers any
>     protection.  At 214 you might not be able to assert that size>=0 any
>     more as a result.
>
>            That works.  I was thinking more along the lines of this
>         which is more straightforward:
>
>
>     try {
>          do test;
>          throw new RuntimeException("AIOBException not thrown");
>     } catch (AIOBException e) (
>          return;
>     } catch (Throwable t) {
>          throw new RuntimeException("Wrong exception (not AIOB) thrown", t);
>     }
>
>
> Fixed.
>
> Cheers,
> Laurent



More information about the 2d-dev mailing list