0030790: [REGRESSION] Modeling Algorithms - Crash when loading specific step file
authormsv <msv@opencascade.com>
Mon, 15 Jul 2019 16:47:14 +0000 (19:47 +0300)
committerbugmaster <bugmaster@opencascade.com>
Fri, 19 Jul 2019 09:23:00 +0000 (12:23 +0300)
The problem occurred when the algorithm IntCurvesFace_Intersector was called for a face occupying zero extension along V direction. This is obviously a bad face, but we need to have the algorithm not crashing the application. So, the algorithm has been protected against such input data. At attempt to make calculations it establishes NotDone status.

Bad test case tests/de/step_3/D9 has been updated.
False memory leak detection has been suppressed in tests/bugs/fclasses/bug7287_2.

src/IntCurvesFace/IntCurvesFace_Intersector.cxx
src/IntCurvesFace/IntCurvesFace_Intersector.hxx
tests/bugs/fclasses/bug7287_2
tests/bugs/step/bug30790 [new file with mode: 0644]
tests/de/step_3/D9

index 2893608..6c6d3ce 100644 (file)
@@ -132,6 +132,7 @@ IntCurvesFace_Intersector::IntCurvesFace_Intersector(const TopoDS_Face& Face,
 : 
   Tol(aTol),
   done(Standard_False),
+  myReady(Standard_False),
   nbpnt(0),
   PtrOnPolyhedron(NULL),
   PtrOnBndBounding(NULL),
@@ -175,7 +176,7 @@ IntCurvesFace_Intersector::IntCurvesFace_Intersector(const TopoDS_Face& Face,
     if (nbsu > aMaxSamples) nbsu = aMaxSamples;
     if (nbsv > aMaxSamples) nbsv = aMaxSamples;
 
-    if (dU > gp::Resolution() && dV > gp::Resolution()) {
+    if (dU > Precision::Confusion() && dV > Precision::Confusion()) {
       if (Max(dU, dV) > Min(dU, dV) * aTresh)
       {
         aMinSamples = 10;
@@ -190,12 +191,7 @@ IntCurvesFace_Intersector::IntCurvesFace_Intersector(const TopoDS_Face& Face,
       }
     }
     else {
-      if (dU < gp::Resolution()) {
-        nbsu = 1;
-      }
-      if (dV < gp::Resolution()) {
-        nbsv = 1;
-      }
+      return; // surface has no extension along one of directions
     }
 
     Standard_Integer NbUOnS = Hsurface->NbUIntervals(GeomAbs_C2);
@@ -215,6 +211,7 @@ IntCurvesFace_Intersector::IntCurvesFace_Intersector(const TopoDS_Face& Face,
         new IntCurveSurface_ThePolyhedronOfHInter(Hsurface,nbsu,nbsv,U0,V0,U1,V1);
     }
   }
+  myReady = Standard_True;
 }
 //=======================================================================
 //function : InternalCall
@@ -350,6 +347,11 @@ void IntCurvesFace_Intersector::Perform(const gp_Lin& L,
                                        const Standard_Real ParMin,
                                        const Standard_Real ParMax)
 { 
+  done = Standard_False;
+  if (!myReady)
+  {
+    return;
+  }
   done = Standard_True;
   SeqPnt.Clear();
   mySeqState.Clear();
@@ -428,6 +430,11 @@ void IntCurvesFace_Intersector::Perform(const Handle(Adaptor3d_HCurve)& HCu,
                                        const Standard_Real ParMin,
                                        const Standard_Real ParMax) 
 { 
+  done = Standard_False;
+  if (!myReady)
+  {
+    return;
+  }
   done = Standard_True;
   SeqPnt.Clear();
   //  Modified by skv - Wed Sep  3 16:14:10 2003 OCC578 Begin
index c584354..245e5c3 100644 (file)
@@ -160,6 +160,7 @@ private:
   IntCurveSurface_SequenceOfPnt SeqPnt;
   TColStd_SequenceOfInteger mySeqState;
   Standard_Boolean done;
+  Standard_Boolean myReady;
   Standard_Integer nbpnt;
   TopoDS_Face face;
   Standard_Address PtrOnPolyhedron;
index a21bc81..bb2c5a9 100755 (executable)
@@ -26,5 +26,5 @@ for {set i 1} {${i} <= ${NCycles}} {incr i } {
     bop b1 b2
     bopcut r
     lappend listmem [meminfo h]
-    checktrend $listmem 0 100 "Memory leak detected"
 }
+checktrend $listmem 0 100 "Memory leak detected"
diff --git a/tests/bugs/step/bug30790 b/tests/bugs/step/bug30790
new file mode 100644 (file)
index 0000000..bfb71be
--- /dev/null
@@ -0,0 +1,13 @@
+puts "========================"
+puts "0030790: Crash when loading specific step file"
+puts "========================"
+
+puts "TODO 30790 ALL: Faulty shapes in variables faulty_1 to"
+
+stepread [locate_data_file bug30790.step] a *
+
+tpcompound result
+
+checkshape result
+
+checkview -display result -2d -path ${imagedir}/${test_image}.png
index 0f3fbbf..6bed663 100755 (executable)
@@ -1,7 +1,7 @@
 # !!!! This file is generated automatically, do not edit manually! See end script
 puts "TODO CR23096 ALL:  Update of 3D-Parameters has failed" 
 puts "TODO CR23096 ALL: CHECKSHAPE : Faulty" 
-
+puts "TODO CR23096 ALL: Error : 2 differences with reference data found"
 
 set filename 53921163S0.stp