Cobol v6.2 NUMCHECK选项兼容性



我们不能关闭新COBOL V6.2编译器的NUMCHECK选项,因为我们不能信任数字变量的内容。当我们打开它时,它与我们以前在组织中使用的COBOL4不完全兼容。

当一个无符号压缩变量包含X'123C'时,COBOL 4会接受它并让我们继续,但带有NUMCHECK(PAC,ABD)的COBOL 6.2会终止,并且只愿意接受X'123F'。这对我们来说是一个真正的问题,涉及汇编程序调用COBOL或从文件中读取等等。是否还有其他选项,甚至可能是一个PTF来纠正这种行为?当NUMCHECK打开时,你能给我们指出其他不兼容的地方吗?非常感谢。Zohar

这是按文档所述进行的。我知道这不是你想听到的,但有时就是这样。你的应用程序正在中止,因为NUMCHECK编译选项检测到了它认为无效的数据。

请注意,IBMCOBOL6.2的NUMCLS安装选项控制IFNUMERIC类测试的行为,该类测试的隐式版本由NUMCHECK编译选项生成。如果您的打包数据是无符号定义的,即

77  XYZ  PIC 999 COMP-3.

则文档指示x'F'的符号半字节是将通过IF NUMERIC类测试的唯一符号半字节。符号半字节的任何其他值都被视为无效。

摘自IBM Documentation for Enterprise COBOL 6.2…

Table 1. NUMCLS(PRIM) and valid signs
NUMPROC(NOPFD) NUMPROC(PFD)
Signed   C, D, F        C, D, +0 (positive zero)  
Unsigned F              F
Table 2. NUMCLS(ALT) and valid signs
NUMPROC(NOPFD) NUMPROC(PFD)
Signed   A to F         C, D, +0 (positive zero)  
Unsigned F              F

IBM COBOL 4.2的NUMCLS选项的文档措辞肯定不同。。。

ALT处理接受十六进制A到F为有效。

使用PRIM进行处理时,接受十六进制的C、D和F作为有效值。

您可能想查看https://www.ibm.com/support/pages/node/604539#112918看看是否有PTF适用于您的情况。

你可以尝试向IBM提出一个问题,但问题是:如果你有未签名的数据,那么可以提出一个论点,即符号半字节指示正(x'C')或负(x'D')符号是无效的。我怀疑这是NUMCHECK选项以这种方式工作的部分原因。

可能的解决方案包括让调用COBOL程序的汇编程序对它们传递的任何打包数据进行符号修复。也许在最后一个字节上进行OI。您可以为商店的SORT实用程序编写控制卡,以修复平面文件中的压缩数据。您可以将COBOL程序中未签名的压缩数据项更改为要签名的。

这完全取决于你想要什么样的行为。你说你不能相信你的数字变量的内容。如果这意味着你有时会用x'a'而不是x'C'的符号半字节来表示正值,那么如果NUMCLS(ALT)有效,你可以使用NUMPROC(NOPFD)。

如果NUMCLS(ALT)有效,另一种可能的解决方案是使用NUMPROC(NOPFD)进行编译,并使用签名字段来初始保存数据。根据文档,将数据移动到无符号字段将修复符号。请注意,NUMPROC(NOPFD)的性能不如NUMPROC。

以下是我对哪些符号半字节导致IF NUMERIC测试为真的文档的理解的扩展。我没有办法对此进行测试,只是尝试将文档的隐式语言翻译成显式表。它强调了IBMEnterpriseCOBOL 4.x和IBMEnterpriseCOBOL v5及更高版本之间的差异。

SIGN   COBOL 5+ COBOL 4
NUMCLS NUMPROC SIGNED NIBBLE NUMERIC  NUMERIC
ALT    NOPFD   YES    X'A'   TRUE     TRUE
ALT    NOPFD   YES    X'B'   TRUE     TRUE
ALT    NOPFD   YES    X'C'   TRUE     TRUE
ALT    NOPFD   YES    X'D'   TRUE     TRUE
ALT    NOPFD   YES    X'E'   TRUE     TRUE
ALT    NOPFD   YES    X'F'   TRUE     TRUE
ALT    NOPFD   NO     X'A'   FALSE    TRUE
ALT    NOPFD   NO     X'B'   FALSE    TRUE
ALT    NOPFD   NO     X'C'   FALSE    TRUE
ALT    NOPFD   NO     X'D'   FALSE    TRUE
ALT    NOPFD   NO     X'E'   FALSE    TRUE
ALT    NOPFD   NO     X'F'   TRUE     TRUE
ALT    PFD     YES    X'A'   FALSE    FALSE
ALT    PFD     YES    X'B'   FALSE    FALSE
ALT    PFD     YES    X'C'   TRUE     TRUE
ALT    PFD     YES    X'D'   TRUE     TRUE
ALT    PFD     YES    X'E'   FALSE    FALSE
ALT    PFD     YES    X'F'   FALSE    FALSE
ALT    PFD     NO     X'A'   FALSE    FALSE
ALT    PFD     NO     X'B'   FALSE    FALSE
ALT    PFD     NO     X'C'   FALSE    FALSE
ALT    PFD     NO     X'D'   FALSE    FALSE
ALT    PFD     NO     X'E'   FALSE    FALSE
ALT    PFD     NO     X'F'   TRUE     TRUE
PRIM   NOPFD   YES    X'A'   FALSE    FALSE
PRIM   NOPFD   YES    X'B'   FALSE    FALSE
PRIM   NOPFD   YES    X'C'   TRUE     TRUE
PRIM   NOPFD   YES    X'D'   TRUE     TRUE
PRIM   NOPFD   YES    X'E'   FALSE    FALSE
PRIM   NOPFD   YES    X'F'   TRUE     TRUE
PRIM   NOPFD   NO     X'A'   FALSE    FALSE
PRIM   NOPFD   NO     X'B'   FALSE    FALSE
PRIM   NOPFD   NO     X'C'   FALSE    TRUE
PRIM   NOPFD   NO     X'D'   FALSE    TRUE
PRIM   NOPFD   NO     X'E'   FALSE    FALSE
PRIM   NOPFD   NO     X'F'   TRUE     TRUE
PRIM   PFD     YES    X'A'   FALSE    FALSE
PRIM   PFD     YES    X'B'   FALSE    FALSE
PRIM   PFD     YES    X'C'   TRUE     TRUE
PRIM   PFD     YES    X'D'   TRUE     TRUE
PRIM   PFD     YES    X'E'   FALSE    FALSE
PRIM   PFD     YES    X'F'   FALSE    FALSE
PRIM   PFD     NO     X'A'   FALSE    FALSE
PRIM   PFD     NO     X'B'   FALSE    FALSE
PRIM   PFD     NO     X'C'   FALSE    FALSE
PRIM   PFD     NO     X'D'   FALSE    FALSE
PRIM   PFD     NO     X'E'   FALSE    FALSE
PRIM   PFD     NO     X'F'   TRUE     TRUE

我还没有资格添加评论,所以我必须添加另一个答案。不过,我是Enterprise COBOL的开发人员之一,我可以说的是,V4.2文档有点不太清楚,V6的措辞也有所改变,但编译器的行为没有改变。两个编译器使用的行为与cschneid上表中的V5列相匹配。

对于数值类测试,无论NUMPROC或NUMCLS设置是什么,无符号压缩和分区数据项总是需要x'F'的符号。有符号项允许C和D始终存在,F带有NUMPROC(NOPFD)(与NUMCLS设置无关),A、B和E仅用于NUMCLS=ALT、NUMPROC。NUMCLS的自定义指南中的文档只讨论了签名类测试。

至于最初的问题:NUMCHECK的行为与IS NUMERIC测试完全相同,在这两种情况下,x'C'的符号对于未签名的数据项都被视为无效,而IS NUMERIC测试或NUMCHECK将发现该值不是数字/无效。符号为x'C'的所有其他COBOL语句(比较、算术、MOVEs等)的行为在NUMPROC(PFD)下是未定义的,并且可能在V4/V6、V6中的OPT级别和V6中的ARCH级别之间变化,等等,在使用该数据项中的值之前,未签名项的符号被强制为0xF,因此这保证了特定的行为以及行为兼容性。然而,NUMCHECK是为了匹配is NUMERIC类测试,并查找无效数据,以便对其进行更正(否则,使用NUMCHECK毫无意义,因为它添加到程序中的测试将对性能产生负面影响),因此它将标记所有无效数据,甚至是V4中看起来"工作正常"的数据(这实际上意味着,虽然NUMPROC(PFD)下的行为是未定义的,它至少是一致的)。

最新更新