0030203: ProjLib_ComputeApproxOnPolarSurface::BuildInitialCurve2d array out of bound
authorifv <ifv@opencascade.com>
Tue, 16 Oct 2018 14:10:44 +0000 (17:10 +0300)
committerapn <apn@opencascade.com>
Tue, 23 Oct 2018 17:09:55 +0000 (20:09 +0300)
Bug fixing: avoiding calculation if tPp == NbOfPnts

src/ProjLib/ProjLib_ComputeApproxOnPolarSurface.cxx
tests/bugs/modalg_7/bug30203 [new file with mode: 0644]

index 14185a3..c104aa0 100644 (file)
@@ -1180,32 +1180,30 @@ Handle(Adaptor2d_HCurve2d)
              }
            }
 
-           if( tPp != 0 ) {
+            if (tPp != 0 && tPp != NbOfPnts) {
              gp_Pnt2d aPp = gp_Pnt2d(u,v);
              gp_Pnt2d aPn;
-             j = 1;
              Standard_Boolean isFound = Standard_False;
-             while( !isFound ) { 
-               Curve->D0( Param.Value(tPp+j), pntproj );
+              for (j = tPp + 1; j <= NbOfPnts; ++j)
+              {
+               Curve->D0( Param.Value(j), pntproj );
                Extrema_ExtPS aTPS( pntproj, Surf->Surface(), TolU, TolV );
-               Dist2Min = 1.e+200;
-               Standard_Integer indExt = 0;
+               Dist2Min = RealLast();
                if( aTPS.IsDone() && aTPS.NbExt() >= 1 ) {
-                 for( i = 1 ; i <= aTPS.NbExt() ; i++ ) {
-                   if( aTPS.SquareDistance(i) < DistTol3d2 && aTPS.SquareDistance(i) < Dist2Min ) {
-                     Dist2Min = aTPS.SquareDistance(i);
-                     indExt = i;
-                     isFound = Standard_True;
-                   }
-                 }
-               }
-               if( isFound ) {
-                 aTPS.Point(indExt).Parameter(u,v);
-                 aPn = gp_Pnt2d(u,v);
-                 break;
+                 Standard_Integer indExt = 0;
+                  for (i = 1; i <= aTPS.NbExt(); i++) {
+                    if (aTPS.SquareDistance(i) < DistTol3d2 && aTPS.SquareDistance(i) < Dist2Min) {
+                      Dist2Min = aTPS.SquareDistance(i);
+                      indExt = i;
+                    }
+                  }
+                  if (indExt > 0) {
+                   aTPS.Point(indExt).Parameter(u,v);
+                   aPn = gp_Pnt2d(u,v);
+                    isFound = Standard_True;
+                   break;
+                 }     
                }
-               j++;
-               if( (tPp+j) > NbOfPnts ) break;
              }
 
              if( isFound ) {
diff --git a/tests/bugs/modalg_7/bug30203 b/tests/bugs/modalg_7/bug30203
new file mode 100644 (file)
index 0000000..f484f2e
--- /dev/null
@@ -0,0 +1,14 @@
+puts "========"
+puts "0030203: ProjLib_ComputeApproxOnPolarSurface::BuildInitialCurve2d array out of bound"
+puts "========"
+puts ""
+
+restore [locate_data_file bug30203_curv.draw] c
+restore [locate_data_file bug30203_surf.draw] s
+
+catch {project cc c s}
+if { [isdraw cc]} {
+  checklength cc -l 1. 
+} else {
+  puts "Error: projection fails"
+}
\ No newline at end of file