NUMCHECK
The NUMCHECK
compiler
option tells the compiler whether to generate extra code to validate
data items when they are used as sending data items. For zoned decimal
(numeric USAGE DISPLAY
) and packed decimal (COMP-3
)
data items, the compiler generates implicit numeric class tests for
each sending field. For alphanumeric senders whose
contents are being moved to a numeric receiver, the compiler treats
the sender as a numeric integer so NUMCHECK
generates
an implicit numeric class test for each alphanumeric sender. For
binary data items, the compiler generates SIZE ERROR
checking
to see whether the data item has more digits than its PICTURE
clause
allows.
The NUMCHECK
option
is updated to remove redundant checks for invalid data, thus improving
runtime performance. There may be fewer runtime messages than before.
The analysis done to remove redundant checks
is more involved at OPT(1|2)
than at OPT(0)
. OPT(0)
does
a simpler form of the analysis to keep compilation time as low as
possible. There may be fewer messages at higher OPT
levels.
When the compiler is able to determine at compile time
that a check will always find invalid data, a compile-time message
is produced and the runtime check is removed. (See MSG|ABD
below.)
Default is: NONUMCHECK
- If no suboption is specified, defaults are
ZON(ALPHNUM,STRICT)
,PAC
,BIN(TRUNCBIN)
, andMSG
. For example,NUMCHECK
has the same effect asNUMCHECK(ZON(ALPHNUM,STRICT),PAC,BIN(TRUNCBIN),MSG)
. - If no datatype suboption is specified, default datatype
suboptions are
ZON(ALPHNUM,STRICT)
,PAC
, andBIN(TRUNCBIN)
. For example,NUMCHECK(ABD)
has the same effect asNUMCHECK(ZON(ALPHNUM,STRICT),PAC,BIN(TRUNCBIN),ABD)
. - If only one datatype suboption is specified, defaults
are
NOZON
,NOPAC
,NOBIN
, andMSG
. For example,NUMCHECK(BIN)
has the same effect asNUMCHECK(NOZON,NOPAC,BIN(TRUNCBIN),MSG)
. - If all datatype suboptions are specified with
NO
, then the listing will showNONUMCHECK
. For example,NUMCHECK(NOZON,NOPAC,NOBIN)
has the same effect asNONUMCHECK
.
Abbreviations are: NONC
| NC
ZON(ALPHNUM|NOALPHNUM,LAX|STRICT) | NOZON
The default is
ZON(ALPHNUM,STRICT)
whenZON
is specified with no suboptions.Specifying
ZON(ALPHNUM)
causes the compiler to generate code for an implicit numeric class test for zoned decimal (numericUSAGE DISPLAY
) data items that are used as sending data items in COBOL statements.Specifying
ZON(NOALPHNUM)
causes the compiler to generate code for an implicit numeric class test for zoned decimal (numeric USAGE DISPLAY) data items that are used as sending data items in COBOL statements, except when they are used in a comparison with an alphanumeric data item, alphanumeric literal, or alphanumeric figurative constant.Receivers are not checked, unless they are both a sender and a receiver, such as data item B in the following sample statements:
ADD A TO B
DIVIDE A INTO B
COMPUTE B = A + B
INITIALIZE B REPLACING ALPHANUMERIC BY B
This checking is done before the data is used in each statement:- If the data is
NOT NUMERIC
, either a warning message forNUMCHECK(ZON,MSG)
or a terminating message forNUMCHECK(ZON,ABD)
is issued. - If the data is
NUMERIC
, the external behavior of the statement is the same asNUMCHECK(NOZON)
, other than being slower.
SpecifyingZON(LAX)
causes the compiler to be more tolerant of invalid data in a zoned decimal data item. Three cases are considered by the compiler as follows:- An unsigned zoned decimal data item redefines a signed trailing
overpunch zoned decimal data item such that the last byte of the unsigned
item overlaps the last byte of the signed item. In this case, the
unsigned redefining item is treated as a signed zoned decimal item
for the purposes of the
NUMCHECK
checking.Notes:- The signed zoned decimal item that is redefined must be a level-01 or level-77 item. The unsigned zoned decimal item can be a level-01 or level-77 item or can be a subordinate item in a group.
- The unsigned zoned decimal item does not need to overlap the entire
signed zoned decimal item. It is only necessary for the last byte
of each item to overlap. For example:
In this case, data item01 NUM1 PIC S9(8). 01 NUM2 REDEFINES NUM1. 03 NUM2-PART1 PIC 9(4). 03 NUM2-PART2 PIC 9(2). 03 NUM2-PART3 PIC 9(2).
NUM2-PART3
will be treated byNUMCHECK
as a signed zoned decimal data item because its last byte overlaps the last byte ofNUM1
, which is a signed trailing overpunch zoned decimal item. Thus, the following values ofNUM2-PART3
are all considered valid:- x'F1F2F3F4F5F6F7F8'
- x'F1F2F3F4F5F6F7C8'
- x'F1F2F3F4F5F6F7D8'
- A zoned decimal data item redefines a numeric-edited data item
that may contain leading spaces, as indicated by the Z symbol in the
numeric-edited item’s
PICTURE
string, and the leading bytes of the zoned decimal data item overlap some or all of the leading bytes of the numeric-edited item. In this case,NUMCHECK
will tolerate spaces in the leading bytes of the zoned decimal data item that overlap those bytes of the numeric-edited item that permit spaces.Notes:- The numeric-edited item that is redefined must be a level-01 or level-77 item. The zoned decimal item can be a level-01 or level-77 item or can be a subordinate item in a group.
- If the zoned decimal item is signed, it must be signed trailing overpunch.
- The first byte of the zoned decimal item must overlap the first
byte of the numeric-edited item to be considered eligible for this
treatment, but the zoned decimal item does not need to overlap the
entire numeric-edited item. For example:
In this case,01 NUMED PIC ZZ99.99. 01 NUM REDEFINES NUMED. 03 INTVAL PIC 9(4). 03 FILLER PIC X. 03 DECVAL PIC 9(2).
NUMCHECK
tolerates spaces in the first two bytes ofINTVAL
because it overlaps the first two bytes ofNUMED
which are defined with the Z symbol in itsPICTURE
string. Thus, the following values ofINTVAL
are all considered valid:- x'F1F2F3F4'
- x'40F1F2F3'
- x'4040F1F2'
- A zoned decimal data item is moved to a zoned or alphanumeric
data item. In this case,
NUMCHECK
will not check the sender of the move. However, if the sender is subsequently used in a numeric context, it will be checked.
If
ZON(STRICT)
is specified,NUMCHECK
does not consider any data items that a zoned decimal data item might redefine, and strict checking of the zoned decimal data is performed as usual.Note: TheZON(LAXREDEF|STRICTREDEF)
option is deprecated but is tolerated for compatibility, and it is replaced by theZON(LAX|STRICT)
option.- If the data is
PAC | NOPAC
Specifying
PAC
causes the compiler to generate code for an implicit numeric class test for packed decimal (COMP-3
) data items that are used as sending data items in COBOL statements. For packed decimal data items that have an even number of digits, the unused bits are checked for ones.Restriction: ForCALL
statements,NUMCHECK(ZON)
andNUMCHECK(PAC)
checkBY CONTENT
data items that are zoned decimal or packed decimal, but they do not checkBY REFERENCE
parameters. (Neither zoned decimal nor packed decimal data items can be specified in aBY VALUE
phrase.)BIN(TRUNCBIN|NOTRUNCBIN) | NOBIN
- Specifying
BIN
causes the compiler to generate code similar toON SIZE ERROR
to test if binary data items contents are bigger than thePICTURE
clause. This extra code will be generated only for binary data items that are used as sending data items, andCOMP-5
data items will not get thisON SIZE ERROR
code generated. MSG | ABD
- Determines whether the message issued for invalid data is a warning
level message to continue processing or a terminating level message
to cause an abend:
- If
MSG
is in effect, a runtime warning message with the line number, data item name, data item content, and program name is issued. Also, the affected statements will still be executed. - If
ABD
is in effect, a terminating message is issued that causes an abend.
When the compiler is able to determine at compile time that a check will always find invalid data, a compile-time error-level message is produced and the check is removed regardless of whether
MSG
orABD
is in effect. - If
Performance considerations: NUMCHECK
is
much slower than NONUMCHECK
, depending on how many
zoned decimal (numeric USAGE DISPLAY) data items, packed decimal (COMP-3)
data items, and binary data items are used in a COBOL program.
Since COBOL V6.2 with service applied, performance of NUMCHECK
has
been improved. However, performance is still best when specifying NONUMCHECK
,
and will be better at a higher OPT
level.
ZONECHECK
is
deprecated but is tolerated for compatibility, and it is replaced
by NUMCHECK(ZON(ALPHNUM))
. - PH27536:
NUMCHECK(ZON)
provides new suboptionsLAXREDEF | STRICTREDEF
to control whether the compiler will check and issue warning messages for redefined items. - PH29542:
NUMCHECK(BIN)
provides new suboptionsTRUNCBIN| NOTRUNCBIN
to control whether the compiler will generate the checking code for binary data items. - PTF UI71591 (no APAR number):
NUMCHECK
is enhanced with the capability to check alphanumeric senders whose contents are being moved to a numeric receiver. For alphanumeric senders whose contents are being moved to a numeric receiver, the compiler treats the sender as a numeric integer soNUMCHECK
generates an implicit numeric class test for each alphanumeric sender. - PH40356:
NUMCHECK(ZON(LAX))
: When a zoned decimal data item is moved to another zoned decimal data item,NUMCHECK
will not check the sender of the move. However, if the sender is subsequently used in a numeric context, it will be checked.