0031489: Data Exchange - STEP Reader can't read a big file
authordpasukhi <dpasukhi@opencascade.com>
Sat, 5 Sep 2020 11:56:34 +0000 (14:56 +0300)
committerbugmaster <bugmaster@opencascade.com>
Wed, 9 Sep 2020 16:32:00 +0000 (19:32 +0300)
- Add checking for null object for edge_curve within TranslateEdgeLoop;
- Update STEP parser rule allowing empty element in the list of entity parameters;
- Update test case of bug26451 for a new scanner rule;
- Update test case of bug30273 for a new added check for null object

src/StepFile/step.tab.c
src/StepFile/step.yacc
src/StepToTopoDS/StepToTopoDS_TranslateEdgeLoop.cxx
tests/bugs/modalg_7/bug30273
tests/bugs/step/bug26451
tests/bugs/step/bug31489 [new file with mode: 0644]

index aa9cf9a..6fdfbb6 100644 (file)
@@ -397,16 +397,16 @@ union yyalloc
 /* YYFINAL -- State number of the termination state.  */
 #define YYFINAL  7
 /* YYLAST -- Last index in YYTABLE.  */
-#define YYLAST   81
+#define YYLAST   83
 
 /* YYNTOKENS -- Number of terminals.  */
 #define YYNTOKENS  27
 /* YYNNTS -- Number of nonterminals.  */
 #define YYNNTS  27
 /* YYNRULES -- Number of rules.  */
-#define YYNRULES  49
+#define YYNRULES  50
 /* YYNRULES -- Number of states.  */
-#define YYNSTATES  85
+#define YYNSTATES  86
 
 /* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX.  */
 #define YYUNDEFTOK  2
@@ -455,9 +455,10 @@ static const yytype_uint8 yyprhs[] =
 {
        0,     0,     3,     5,     8,    10,    13,    22,    30,    37,
       39,    41,    43,    45,    48,    52,    54,    56,    58,    60,
-      62,    65,    67,    69,    71,    73,    76,    80,    83,    85,
-      89,    92,    94,    97,   102,   110,   117,   119,   122,   126,
-     129,   133,   135,   137,   139,   143,   145,   147,   152,   154
+      62,    65,    67,    69,    71,    73,    76,    80,    85,    88,
+      90,    94,    97,    99,   102,   107,   115,   122,   124,   127,
+     131,   134,   138,   140,   142,   144,   148,   150,   152,   157,
+     159
 };
 
 /* YYRHS -- A `-1'-separated list of the rules' RHS.  */
@@ -471,14 +472,15 @@ static const yytype_int8 yyrhs[] =
       21,    -1,     1,    -1,     6,    -1,    14,    -1,    19,    -1,
       41,    -1,    38,    41,    -1,     1,    -1,    11,    -1,    22,
       -1,    23,    -1,    39,    40,    -1,    39,    42,    40,    -1,
-      39,     1,    -1,    37,    -1,    42,    24,    37,    -1,    42,
-       1,    -1,    44,    -1,    43,    44,    -1,    52,    25,    46,
-      21,    -1,    52,    25,    47,    43,    51,    46,    21,    -1,
-      52,    25,    47,    51,    46,    21,    -1,     1,    -1,    53,
-      41,    -1,    45,    53,    41,    -1,    53,    41,    -1,    22,
-      45,    23,    -1,     8,    -1,    14,    -1,    48,    -1,    49,
-      24,    48,    -1,    26,    -1,     9,    -1,     9,    50,    49,
-      26,    -1,    10,    -1,    11,    -1
+      39,    42,    24,    40,    -1,    39,     1,    -1,    37,    -1,
+      42,    24,    37,    -1,    42,     1,    -1,    44,    -1,    43,
+      44,    -1,    52,    25,    46,    21,    -1,    52,    25,    47,
+      43,    51,    46,    21,    -1,    52,    25,    47,    51,    46,
+      21,    -1,     1,    -1,    53,    41,    -1,    45,    53,    41,
+      -1,    53,    41,    -1,    22,    45,    23,    -1,     8,    -1,
+      14,    -1,    48,    -1,    49,    24,    48,    -1,    26,    -1,
+       9,    -1,     9,    50,    49,    26,    -1,    10,    -1,    11,
+      -1
 };
 
 /* YYRLINE[YYN] -- source line where rule number YYN was defined.  */
@@ -486,9 +488,10 @@ static const yytype_uint8 yyrline[] =
 {
        0,    41,    41,    42,    43,    44,    45,    46,    47,    48,
       48,    48,    51,    52,    54,    55,    57,    60,    61,    62,
-      63,    64,    68,    71,    74,    79,    80,    81,    83,    84,
-      85,    87,    88,    90,    91,    92,    93,    95,    96,    98,
-      99,   101,   104,   107,   108,   110,   113,   115,   120,   123
+      63,    64,    68,    71,    74,    79,    80,    81,    82,    84,
+      85,    86,    88,    89,    91,    92,    93,    94,    96,    97,
+      99,   100,   102,   105,   108,   109,   111,   114,   116,   121,
+     124
 };
 #endif
 
@@ -524,9 +527,10 @@ static const yytype_uint8 yyr1[] =
 {
        0,    27,    28,    28,    29,    29,    30,    31,    32,    33,
       33,    33,    34,    34,    35,    35,    36,    37,    37,    37,
-      37,    37,    38,    39,    40,    41,    41,    41,    42,    42,
-      42,    43,    43,    44,    44,    44,    44,    45,    45,    46,
-      46,    47,    48,    49,    49,    50,    51,    51,    52,    53
+      37,    37,    38,    39,    40,    41,    41,    41,    41,    42,
+      42,    42,    43,    43,    44,    44,    44,    44,    45,    45,
+      46,    46,    47,    48,    49,    49,    50,    51,    51,    52,
+      53
 };
 
 /* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN.  */
@@ -534,9 +538,10 @@ static const yytype_uint8 yyr2[] =
 {
        0,     2,     1,     2,     1,     2,     8,     7,     6,     1,
        1,     1,     1,     2,     3,     1,     1,     1,     1,     1,
-       2,     1,     1,     1,     1,     2,     3,     2,     1,     3,
-       2,     1,     2,     4,     7,     6,     1,     2,     3,     2,
-       3,     1,     1,     1,     3,     1,     1,     4,     1,     1
+       2,     1,     1,     1,     1,     2,     3,     4,     2,     1,
+       3,     2,     1,     2,     4,     7,     6,     1,     2,     3,
+       2,     3,     1,     1,     1,     3,     1,     1,     4,     1,
+       1
 };
 
 /* YYDEFACT[STATE-NAME] -- Default reduction number in state STATE-NUM.
@@ -545,82 +550,82 @@ static const yytype_uint8 yyr2[] =
 static const yytype_uint8 yydefact[] =
 {
        0,     0,     9,    10,    11,     0,     0,     1,    15,     0,
-      49,     0,    12,     0,    16,     0,     0,    13,    23,     0,
-       0,    36,    48,     0,    31,     0,     0,    21,    22,    17,
-      18,    24,    28,     0,    25,    19,     0,    14,    36,     0,
-      32,     0,     0,    20,    30,     0,    26,     7,    41,     0,
-       0,     0,     0,     0,    21,    29,     0,     0,    33,    46,
-       0,     0,    39,     4,     6,    40,     0,    37,    45,     0,
-       0,     0,     2,     5,    38,    42,    43,     0,     0,    35,
-       3,     0,    47,    34,    44
+      50,     0,    12,     0,    16,     0,     0,    13,    23,     0,
+       0,    37,    49,     0,    32,     0,     0,    21,    22,    17,
+      18,    24,    29,     0,    25,    19,     0,    14,    37,     0,
+      33,     0,     0,    20,    31,     0,    26,     7,    42,     0,
+       0,     0,     0,     0,    21,    30,    27,     0,     0,    34,
+      47,     0,     0,    40,     4,     6,    41,     0,    38,    46,
+       0,     0,     0,     2,     5,    39,    43,    44,     0,     0,
+      36,     3,     0,    48,    35,    45
 };
 
 /* YYDEFGOTO[NTERM-NUM].  */
 static const yytype_int8 yydefgoto[] =
 {
-      -1,    73,    64,     2,     3,     4,     5,    11,    12,    15,
-      32,    33,    19,    34,    35,    36,    23,    24,    56,    50,
-      51,    76,    77,    69,    61,    25,    52
+      -1,    74,    65,     2,     3,     4,     5,    11,    12,    15,
+      32,    33,    19,    34,    35,    36,    23,    24,    57,    50,
+      51,    77,    78,    70,    62,    25,    52
 };
 
 /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
    STATE-NUM.  */
-#define YYPACT_NINF -26
+#define YYPACT_NINF -24
 static const yytype_int8 yypact[] =
 {
-      27,    30,   -26,   -26,   -26,    31,    36,   -26,   -26,    55,
-     -26,    49,   -26,    14,   -26,    41,    55,   -26,   -26,    10,
-      42,   -26,   -26,     9,   -26,    37,    41,    -3,   -26,   -26,
-     -26,   -26,   -26,    14,   -26,   -26,     4,   -26,    65,    59,
-     -26,     1,    54,   -26,   -26,    24,   -26,   -26,   -26,    56,
-      48,    47,    14,    61,   -26,   -26,    -7,    14,   -26,    44,
-      47,    -5,   -26,    51,   -26,   -26,    14,   -26,   -26,    58,
-      -5,    52,   -26,    57,   -26,   -26,   -26,   -11,    53,   -26,
-     -26,    58,   -26,   -26,   -26
+       6,     9,   -24,   -24,   -24,    10,    30,   -24,   -24,    23,
+     -24,    31,   -24,    21,   -24,    14,    23,   -24,   -24,    11,
+      25,   -24,   -24,    52,   -24,    -8,    14,    27,   -24,   -24,
+     -24,   -24,   -24,    21,   -24,   -24,     3,   -24,    49,    44,
+     -24,    -3,    55,   -24,   -24,    36,   -24,   -24,   -24,    56,
+      45,    60,    21,    61,   -24,   -24,   -24,     0,    21,   -24,
+      48,    60,    -4,   -24,    51,   -24,   -24,    21,   -24,   -24,
+      62,    -4,    54,   -24,    57,   -24,   -24,   -24,   -10,    58,
+     -24,   -24,    62,   -24,   -24,   -24
 };
 
 /* YYPGOTO[NTERM-NUM].  */
 static const yytype_int8 yypgoto[] =
 {
-     -26,   -26,   -26,   -26,   -26,   -26,   -26,   -26,    64,    60,
-      33,   -26,   -26,    43,   -13,   -26,   -25,   -20,   -26,   -12,
-     -26,    -1,   -26,   -26,    21,   -26,    -4
+     -24,   -24,   -24,   -24,   -24,   -24,   -24,   -24,    67,    64,
+      37,   -24,   -24,    28,   -13,   -24,   -23,   -21,   -24,     1,
+     -24,    -1,   -24,   -24,    22,   -24,    -5
 };
 
 /* YYTABLE[YYPACT[STATE-NUM]].  What to do in state STATE-NUM.  If
    positive, shift that token.  If negative, reduce the rule which
    number is the opposite.  If YYTABLE_NINF, syntax error.  */
-#define YYTABLE_NINF -28
+#define YYTABLE_NINF -29
 static const yytype_int8 yytable[] =
 {
-      20,    42,    13,    40,    10,    44,    10,    13,   -27,    48,
-      38,    27,    10,    81,    39,    82,    65,    49,   -27,    22,
-      43,    28,    40,    49,    29,    54,    60,    31,    45,    30,
-       1,     7,    18,    31,     6,    28,    18,     8,    29,    62,
-      40,     9,    21,    30,    67,    57,    18,    10,    21,    71,
-       8,    22,    66,    74,    16,    21,    59,    22,    78,    53,
-      10,    14,    41,    37,    22,    -8,    47,    10,    63,    58,
-      68,    72,    75,    79,    83,    17,    26,    80,    55,    46,
-      84,    70
+      20,    13,    40,    42,    44,    48,    13,    10,    10,     1,
+       7,    10,    27,     6,    82,    21,    83,    41,    49,    49,
+      43,    40,    28,    66,    22,    29,    31,    45,    61,    14,
+      30,     8,     8,    18,    31,     9,    16,    54,   -28,    63,
+      40,    10,    10,    18,    58,    68,    37,    28,   -28,    -8,
+      29,    47,    67,    38,    75,    30,    21,    39,    18,    31,
+      53,    21,    22,    72,    46,    22,    59,    10,    64,    60,
+      22,    73,    79,    56,    69,    80,    76,    81,    17,    84,
+      26,    85,    55,    71
 };
 
 #define yypact_value_is_default(Yystate) \
-  (!!((Yystate) == (-26)))
+  (!!((Yystate) == (-24)))
 
 #define yytable_value_is_error(Yytable_value) \
   YYID (0)
 
 static const yytype_uint8 yycheck[] =
 {
-      13,    26,     6,    23,    11,     1,    11,    11,    11,     8,
-       1,     1,    11,    24,     5,    26,    23,    22,    21,    10,
-      33,    11,    42,    22,    14,     1,    51,    23,    24,    19,
-       3,     0,    22,    23,     4,    11,    22,     1,    14,    52,
-      60,     5,     1,    19,    57,    49,    22,    11,     1,    61,
-       1,    10,    56,    66,     5,     1,     9,    10,    70,     5,
-      11,     6,    25,    21,    10,     0,     7,    11,     7,    21,
-      26,    20,    14,    21,    21,    11,    16,    20,    45,    36,
-      81,    60
+      13,     6,    23,    26,     1,     8,    11,    11,    11,     3,
+       0,    11,     1,     4,    24,     1,    26,    25,    22,    22,
+      33,    42,    11,    23,    10,    14,    23,    24,    51,     6,
+      19,     1,     1,    22,    23,     5,     5,     1,    11,    52,
+      61,    11,    11,    22,    49,    58,    21,    11,    21,     0,
+      14,     7,    57,     1,    67,    19,     1,     5,    22,    23,
+       5,     1,    10,    62,    36,    10,    21,    11,     7,     9,
+      10,    20,    71,    45,    26,    21,    14,    20,    11,    21,
+      16,    82,    45,    61
 };
 
 /* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
@@ -632,10 +637,10 @@ static const yytype_uint8 yystos[] =
       41,     1,    10,    43,    44,    52,    36,     1,    11,    14,
       19,    23,    37,    38,    40,    41,    42,    21,     1,     5,
       44,    25,    43,    41,     1,    24,    40,     7,     8,    22,
-      46,    47,    53,     5,     1,    37,    45,    53,    21,     9,
-      43,    51,    41,     7,    29,    23,    53,    41,    26,    50,
-      51,    46,    20,    28,    41,    14,    48,    49,    46,    21,
-      20,    24,    26,    21,    48
+      46,    47,    53,     5,     1,    37,    40,    45,    53,    21,
+       9,    43,    51,    41,     7,    29,    23,    53,    41,    26,
+      50,    51,    46,    20,    28,    41,    14,    48,    49,    46,
+      21,    20,    24,    26,    21,    48
 };
 
 #define yyerrok                (yyerrstatus = 0)
@@ -1488,38 +1493,38 @@ yyreduce:
           rec_newent ();  yyerrstatus = 0; }
     break;
 
-  case 41:
+  case 42:
 
     {  scope_debut();  }
     break;
 
-  case 42:
+  case 43:
 
     {  rec_typarg(rec_argIdent);    rec_newarg();  }
     break;
 
-  case 45:
+  case 46:
 
     {  rec_deblist();  }
     break;
 
-  case 46:
+  case 47:
 
     {  scope_fin();  }
     break;
 
-  case 47:
+  case 48:
 
     {  printf("***  Warning : Export List not yet processed\n");
           rec_newent();  scope_fin() ; }
     break;
 
-  case 48:
+  case 49:
 
     {  rec_ident();  }
     break;
 
-  case 49:
+  case 50:
 
     {  rec_type ();  }
     break;
index 2e46e46..78dbbd3 100644 (file)
@@ -78,6 +78,7 @@ finlist       : ')'
        ;
 listarg        : deblist finlist               /* liste vide (peut y en avoir) */
        | deblist arglist finlist       /* liste normale, non vide */
+       | deblist arglist ',' finlist   /* broken list with missing last parameter, see #31756 */
        | deblist error
        ;
 arglist        : unarg
index 786d8ab..42456b7 100644 (file)
@@ -285,6 +285,12 @@ void StepToTopoDS_TranslateEdgeLoop::Init(const Handle(StepShape_FaceBound)& Fac
   for (j=1; j<=NbEdge; j++) {
     OrEdge1  = EL->EdgeListValue(j);
 
+    if (OrEdge1.IsNull() || OrEdge1->EdgeElement().IsNull())
+    {
+      TP->AddWarning(OrEdge1, "Incorrect Oriented_Edge is not translated. Oriented_Edge definition is not correct");
+      continue;
+    }
+
     // see bug #29979: oriented edge contains another oriented edge
     if (OrEdge1->EdgeElement()->IsKind (STANDARD_TYPE(StepShape_OrientedEdge)))
       OrEdge1 = Handle(StepShape_OrientedEdge)::DownCast (OrEdge1->EdgeElement());
@@ -370,6 +376,9 @@ void StepToTopoDS_TranslateEdgeLoop::Init(const Handle(StepShape_FaceBound)& Fac
   for (j=1; j<=NbEdge; j++) {
     OrEdge1  = EL->EdgeListValue (j);
     OrEdge2  = EL->EdgeListValue (j < NbEdge ? j + 1 : 1);
+    if (OrEdge1.IsNull() || OrEdge2.IsNull())
+      continue;
+
     Handle(StepShape_EdgeCurve) EC1 =
       Handle(StepShape_EdgeCurve)::DownCast (OrEdge1->EdgeElement());
     Handle(StepShape_EdgeCurve) EC2 =
@@ -425,6 +434,8 @@ void StepToTopoDS_TranslateEdgeLoop::Init(const Handle(StepShape_FaceBound)& Fac
 #endif
 
     OrEdge1  = EL->EdgeListValue(j);
+    if (OrEdge1.IsNull() || OrEdge1->EdgeElement().IsNull())
+      continue;
 
     // see bug #29979: oriented edge contains another oriented edge
     if (OrEdge1->EdgeElement()->IsKind (STANDARD_TYPE(StepShape_OrientedEdge)))
index a668630..5036910 100644 (file)
@@ -6,4 +6,4 @@ puts ""
 pload XDE
 
 stepread [locate_data_file bug30273.stp] res *
-checknbshapes res_1 -solid 176 -face 9968 -shape 69495
+checknbshapes res_1 -solid 176 -face 10463 -shape 72893
index 3d33b96..0f5fd63 100644 (file)
@@ -14,15 +14,15 @@ checkshape result
 
 set nbshapes_expected "
 Number of shapes in shape
- VERTEX    : 8057
- EDGE      : 8372
- WIRE      : 1988
- FACE      : 1754
- SHELL     : 1754
+ VERTEX    : 8062
+ EDGE      : 8379
+ WIRE      : 1990
+ FACE      : 1756
+ SHELL     : 1756
  SOLID     : 0
  COMPSOLID : 0
  COMPOUND  : 1
- SHAPE     : 21926
+ SHAPE     : 21944
 "
 checknbshapes result -ref ${nbshapes_expected} -t -m "importing file"
 checkview -display result -3d -path ${imagedir}/${test_image}.png
diff --git a/tests/bugs/step/bug31489 b/tests/bugs/step/bug31489
new file mode 100644 (file)
index 0000000..619936b
--- /dev/null
@@ -0,0 +1,17 @@
+puts "===================================="
+puts "0031489: Data Exchange - STEP Reader can't read a big file"
+puts "===================================="
+puts ""
+
+pload DCAF
+
+# Read file
+ReadStep D [locate_data_file bug31489.stp]
+
+# Checking 
+set info [tpstat f]
+if {![regexp {Nb Total:0} $info full]} {
+ puts "Error: file was not correctly read - exception"
+}
+
+Close D