sammycage / lunasvg

SVG rendering and manipulation library in C++
MIT License
866 stars 124 forks source link

Fix undefined behavior caused by a domain error on an sqrt call. #123

Closed m-carrasco closed 1 year ago

m-carrasco commented 1 year ago

This PR is a follow-up of #121.

Issue:

A call on sqrt on a negative number caused it to return a -nan, and then it was casted to an integer, triggering undefined behavior.

Test Case:

https://user-images.githubusercontent.com/3461126/225024410-286b1073-7d19-41b9-8c26-7641abe72579.svg

Fix:

The sqrt call is only performed on zero or positive values.


@sammycage Thanks for pointing out that I had forgotten to initialize result with a default value in case we must skip the computation. If zero is checked without a threshold, we can introduce defects into the generated image (using my test case). That is why I added fabs(det) < DBL_EPSILON ? 0.0.

Best regards, Manuel.