rspec/rules/S3632/cobol/rule.adoc

121 lines
3.5 KiB
Plaintext
Raw Permalink Normal View History

== Why is this an issue?
2021-04-28 16:49:39 +02:00
In general, the clause ``++INDEXED BY++`` should be used whenever possible when handling COBOL tables. If it's not possible, then avoid using a numeric display variable to access the table's elements. Instead, use a ``++BINARY++``/``++COMP++`` variable, which the processor can handle more efficiently.
=== Noncompliant code example
2021-04-28 16:49:39 +02:00
2022-02-04 17:28:24 +01:00
[source,cobol]
2021-04-28 16:49:39 +02:00
----
01 SUBS PIC 9(5).
01 INVENTORY-RECORD.
05 Field-A PIC X OCCURS 10000 TIMES.
...
PERFORM VARYING SUBS FROM 1 BY 1 UNTIL SUBS > 10000
MOVE ITEM1 TO Field-A (SUBS) *> Noncompliant
END-PERFORM.
----
=== Compliant solution
2021-04-28 16:49:39 +02:00
2022-02-04 17:28:24 +01:00
[source,cobol]
2021-04-28 16:49:39 +02:00
----
01 SUBS PIC 9(5) COMP.
01 INVENTORY-RECORD.
05 Field-A PIC X OCCURS 10000 TIMES.
...
PERFORM VARYING SUBS FROM 1 BY 1 UNTIL SUBS > 10000
MOVE ITEM1 TO Field-A (SUBS)
END-PERFORM.
----
or
2022-02-04 17:28:24 +01:00
[source,cobol]
2021-04-28 16:49:39 +02:00
----
01 INVENTORY-RECORD.
05 Field-A PIC X OCCURS 10000 TIMES INDEXED BY IDX1.
...
PERFORM VARYING IDX1 FROM 1 BY 1 UNTIL IDX1 > 10000
MOVE ITEM1 TO Field-A (IDX1)
END-PERFORM.
----
ifdef::env-github,rspecator-view[]
'''
== Implementation Specification
(visible only on this page)
=== Message
Make "xxx" a binary type or use a different variable.
=== Highlighting
The table subscript, i.e. ``++(SUBS)++`` in
----
MOVE F337-CODE2-SPE (SUBS) TO ...
----
'''
== Comments And Links
(visible only on this page)
=== on 8 Nov 2016, 09:43:02 Pierre-Yves Nicolas wrote:
\[~ann.campbell.2], I believe that the compliant solution should include the definition of ``++Row-IDX++`` the same way the non-compliant example includes the definition of ``++SUBS++``. In fact, I think that this is the only thing which should change between the 2 code samples (similarly as the examples for RSPEC-3671).
=== on 8 Nov 2016, 21:36:34 Ann Campbell wrote:
\[~pierre-yves.nicolas] I've added the definition of ``++Row-IDX++`` but not otherwise changed the Compliant Solution; both code samples came directly from the original rule requesters.
Also, I'm wondering if the loop format changes based on what you can do with a ``++PIC 99++`` vs a ``++PIC S9(n) BINARY++``
=== on 21 Nov 2016, 09:48:54 Pierre-Yves Nicolas wrote:
\[~ann.campbell.2] Sorry for replying late. In fact, indexes are usually not declared as data items (see http://www.ibm.com/support/knowledgecenter/SS6SG3_6.1.0/com.ibm.cobol61.ent.doc/PGandLR/tasks/tptbl12.html[some IBM documentation]).
I suggest the following changes:
Noncompliant Code Example
----
01 SUBS PIC 9(5).
01 INVENTORY-RECORD.
05 Field-A PIC X OCCURS 10000 TIMES.
...
PERFORM VARYING SUBS FROM 1 BY 1 UNTIL SUBS > 10000
MOVE ITEM1 TO Field-A (SUBS) *> Noncompliant
END-PERFORM.
----
Compliant Solution without ``++INDEXED BY++``
----
01 SUBS PIC 9(5) COMP.
01 INVENTORY-RECORD.
05 Field-A PIC X OCCURS 10000 TIMES.
...
PERFORM VARYING SUBS FROM 1 BY 1 UNTIL SUBS > 10000
MOVE ITEM1 TO Field-A (SUBS)
END-PERFORM.
----
Compliant Solution with ``++INDEXED BY++``
----
01 INVENTORY-RECORD.
05 Field-A PIC X OCCURS 10000 TIMES INDEXED BY IDX1.
...
PERFORM VARYING IDX1 FROM 1 BY 1 UNTIL IDX1 > 10000
MOVE ITEM1 TO Field-A (IDX1)
END-PERFORM.
----
=== on 21 Nov 2016, 16:16:55 Ann Campbell wrote:
Updated [~pierre-yves.nicolas]
endif::env-github,rspecator-view[]