]> OCCT Git - occt.git/commitdiff
0033567: Modeling Data - GeomLib_IsPlanarSurface raises exception SIGFPE Arithmetic... CR0-77-Hybrid-2024010801
authoroan <oan@opencascade.com>
Fri, 5 Jan 2024 14:06:25 +0000 (14:06 +0000)
committeroan <oan@opencascade.com>
Mon, 8 Jan 2024 15:06:35 +0000 (15:06 +0000)
Add protection against zero-division

src/GeomLib/GeomLib_IsPlanarSurface.cxx
tests/bugs/moddata_3/bug33567 [new file with mode: 0644]

index b0c04de57cfb13c178290d03a99e04bac07faf96..e7f64d74c39005be7714199410318a2728546bee 100644 (file)
@@ -76,22 +76,28 @@ static Standard_Boolean Controle(const TColgp_Array1OfPnt& Poles,
       Standard_Real umin, umax, vmin, vmax;
       S->Bounds(umin, umax, vmin, vmax);
       S->D1( (umin+umax)/2, (vmin+vmax)/2, P, DU, DV);
-      // On prend DX le plus proche possible de DU
-      gp_Dir du(DU);
-      Standard_Real Angle1 = du.Angle(DX);
-      Standard_Real Angle2 = du.Angle(DY);
-      if (Angle1 > M_PI/2) Angle1 = M_PI-Angle1;
-      if (Angle2 > M_PI/2) Angle2 = M_PI-Angle2;
-      if (Angle2 < Angle1) {
-       du = DY; DY = DX; DX = du;
-      }
-      if (DX.Angle(DU) > M_PI/2) DX.Reverse();
-      if (DY.Angle(DV) > M_PI/2) DY.Reverse();      
 
-      gp_Ax3 axe(Bary, DX^DY, DX);
-      Plan.SetPosition(axe);
-      Plan.SetLocation(Bary);
-      IsPlan = Standard_True;
+      if (DU.SquareMagnitude() > gp::Resolution() &&
+          DV.SquareMagnitude() > gp::Resolution())
+      {
+        // On prend DX le plus proche possible de DU
+        gp_Dir du(DU);
+        Standard_Real Angle1 = du.Angle(DX);
+        Standard_Real Angle2 = du.Angle(DY);
+        if (Angle1 > M_PI/2) Angle1 = M_PI-Angle1;
+        if (Angle2 > M_PI/2) Angle2 = M_PI-Angle2;
+        if (Angle2 < Angle1)
+        {
+          du = DY; DY = DX; DX = du;
+        }
+        if (DX.Angle(DU) > M_PI/2) DX.Reverse();
+        if (DY.Angle(DV) > M_PI/2) DY.Reverse();
+
+        gp_Ax3 axe(Bary, DX^DY, DX);
+        Plan.SetPosition(axe);
+        Plan.SetLocation(Bary);
+        IsPlan = Standard_True;
+      }
     }
   }   
   return IsPlan;
diff --git a/tests/bugs/moddata_3/bug33567 b/tests/bugs/moddata_3/bug33567
new file mode 100644 (file)
index 0000000..931b06d
--- /dev/null
@@ -0,0 +1,11 @@
+puts "==========================================================="
+puts "0033567: Modeling Data - GeomLib_IsPlanarSurface raises SIGFPE in Release mode"
+puts "==========================================================="
+
+puts "REQUIRED All: Conversion failed"
+
+pload MODELING
+
+restore [locate_data_file bug33567.brep] a
+mksurface s a
+tocanon r s 0.0005