https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71291
Maxim Ostapenko <m.ostapenko at samsung dot com> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |m.ostapenko at samsung dot com
--- Comment #9 from Maxim Ostapenko <m.ostapenko at samsung dot com> ---
Hm, looking to corresponding source code (dist/include/mozilla/gfx/Matrix.h):
705 template<class F>
706 size_t TransformAndClipRect(const RectTyped<SourceUnits, F>& aRect,
707 const RectTyped<TargetUnits, F>& aClip,
708 PointTyped<TargetUnits, F>* aVerts) const
709 {
710 // Initialize a double-buffered array of points in homogenous space
711 // with the input rectangle, aRect.
712 Point4DTyped<UnknownUnits, F> points[2]kTransformAndClipRectMaxVerts];
713 Point4DTyped<UnknownUnits, F>* dstPoint = points[0];
............
727 // Iterate through each clipping plane and clip the polygon.
728 // In each pass, we double buffer, alternating between points[0] and
729 // points[1].
730 for (int plane=0; plane < 4; plane++) {
731 planeNormals[plane].Normalize();
732
733 Point4DTyped<UnknownUnits, F>* srcPoint = points[plane & 1];
734 Point4DTyped<UnknownUnits, F>* srcPointEnd = dstPoint;
735 dstPoint = points[~plane & 1];
736
737 Point4DTyped<UnknownUnits, F>* prevPoint = srcPointEnd - 1;
738 F prevDot = planeNormals[plane].DotProduct(*prevPoint);
............
I suspect this scenario to happen:
1) On iteration 2 (i == 1) dstPoint becomes points[0] at line 735.
2) Later on iteration 1 dstPoint doesn't change for some reason.
3) On iteration 3 (i == 2) srcPointEnd becomes srcPointEnd = dstPoint (==
point[0]) at line 734.
4) Later on iteration 3 prevPoint = srcPointEnd - 1 (point[-1]) at line 737.
5) At line 738 we use *prevPoint (points[-1]) that leads to ASan report (valid,
because points[-1] overflows).
Could you check this? If this is what happens, than ASan is innocent and
something else went wrong here.