Enterprise COBOL V5
Transcription
Enterprise COBOL V5
Cobol v5 http://www.ibm.com/software/awdtools/cobol http://www.ibm.com/software/products/en/entecoboforzos © 2014 IBM Corporation Incidents rencontrés lors de migrations 2 © 2014 IBM Corporation USAGE DISPLAY Extrait du manuel Enterprise COBOL V5.2 Programming Guide: Each digit of a valid zoned decimal number is represented by a single byte from X’F0’ through X’F9’. The 4 high-order bits of each byte are zone bits, and the 4 low-order bits of each byte contain the value of the digit. The 4 high-order bits of the loworder byte for SIGN TRAILING represent the sign of the item. The sign is in the high-order byte with SIGN LEADING, or in a separate byte for SIGN IS SEPARATE. COBOL V5 considère que tous les bits de zone sont toujours corrects. Il génère des instructions différentes des précédentes versions de COBOL lorsque les bits de zones sont incorrects. Détectez les bits de zone incorrects avec l’option ZONECHECK disponible en COBOL V5.1 dans la version de juin 2015 et en COBOL V5.2 avec les PTF de mai 2015 © 2014 IBM Corporation USAGE DISPLAY (exemple) Exemple de code source 77 VALUE0 PIC X(4) VALUE ‘00 0’. <* x’F0F040F0’; the third byte has x'4' <* for zone bits, legal in PIC X, but 77 VALUE1 REDEFINES VALUE0 PIC 9(4). <* not valid in PIC 9 USAGE DISPLAY PROCEDURE DIVISION. IF VALUE1 = ZERO DISPLAY ‘ZERO' ELSE DISPLAY ‘NOT ZERO' END-IF L’affichage de 'ZERO' ou 'NOT ZERO' dépend des options de compilation utilisées. Si vous êtes certains qu’il n’y a pas de données USAGE DISPLAY incorrectes utilisées par votre programme, vous pouvez utiliser ZONEDATA(PFD) en COBOL V5. Sinon, pour continuer d’avoir le même résultat qu’avec COBOL V4 (ou version plus ancienne), si vous utilisiez l’option utilisez en COBOL V5 NUMPROC(MIG) ZONEDATA(MIG) et NUMPROC(NOPFD) NUMPROC(NOPFD) ZONEDATA(NOPFD) et NUMPROC(NOPFD) NUMPROC(PFD) ZONEDATA(NOPFD) et NUMPROC(PFD) © 2014 IBM Corporation Modification de données d’une table Modification de données en dehors des limites d’une table Ces types de programmes incorrects peuvent être détectés à l’exécution en utilisant l’option de compilation SSRANGE. Vous pouvez constater des résultats différents en COBOL V5 par rapport aux anciennes versions car la mémoire est disposée différemment en COBOL V5. Modification des données suivant une table définie avec INDEXED BY index Modifier des données au-delà de la fin d’une table indexée va écraser l’index en COBOL V5 car les indices sont stockés immédiatement après la table au lieu d’être stockés ailleurs. Ce n’est qu’une extension du cas précédent, dont l’option de compilation SSRANGE permet de détecter cette anomalie lors de l’exécution. © 2014 IBM Corporation Zones surpeuplées : valeur ayant plus de chiffres que la zone prévue Il n’y a pas de moyen de les détecter, mais le problème ne survient que lors de MOVE entre de tells zones. Exemple 01 X PIC X(2). 01 Y REDEFINES X PIC 9(2) PACKED-DECIMAL. 01 Z REDEFINES X PIC 9(4) COMP. MOVE x'123F' TO X. MOVE x'FFFF' TO X. Le premier MOVE affecte la valeur x’123F’, 4671 en binaire (donc correct pour Z) mais +123 en décimal packé (qui occupe plus de 2 positions). Tout code qui présume que les données définies en PACKED-DECIMAL n’ont pas plus de chiffres que ce qui est spécifié peut se comporter incorrectement. Le second MOVE affecte la valeur x’FFFF’ à X, ce qui n’est en aucun cas une valeur normale pour du PACKED-DECIMAL (65535 en binaire non signé). Quasiment toute opération sur Y à ce point se traduit par un ABEND de type data exception, donc le problème est capté. – Si vous avez compilé avec TRUNC(STD), là où vous espérez que le compilateur va toujours tronquer, on aboutit à une valeur COMP plus grande que la description de zone, qui fait que les troncations ne sont pas toujours correctes. – Si vous avez compilé avec TRUNC(OPT), comme l’explique le Programming Guide, des résultats imprédictibles peuvent survenir. © 2014 IBM Corporation Zones de communication Description : spécifier une zone de taille différente dans la LINKAGE SECTION du programme appelé par rapport à sa définition de zone dans le programme appelant : Déclarer un paramètre dans un programme appelé comme plus grand que le paramètre passé est incorrect en COBOL. Les résultats sont imprédictibles. Dans un cas client, le programme appelé finissait par modifier des blocs de contrôle IBM internes dans le programme appelant et modifier un code FILE STATUS, ce qui résultait dans un changement du déroulement du programme appelant. Le compilateur ne peut pas détecter les divergences entre les paramètres puisqu’il s’agit de deux sources différents. Reportez-vous au manuel Enterprise COBOL V5.1 Programming Guide, pg. 484 © 2014 IBM Corporation ODO hors zone Vous pouvez utiliser l’option SSRANGE pour détecter ces cas à l’exécution. Voici un exemple client : 01 X PIC 9(5) BINARY. 01 MY-TABLE. 02 T OCCURS 0 TO 1 TIMES DEPENDING ON X. 05 MY-FIELD PIC X(1). 01 OFLOW PIC X(500). ... MOVE 300 TO X. MOVE ALL 'X' TO MY-TABLE. DISPLAY MY-TABLE DISPLAY OFLOW IGZ0007S The size of variable length group MY-TABLE exceeded the maximum defined length of the group at the time of reference by verb number 01 on line 000023. Dans les versions plus anciennes du compilateur, 300 ‘X’ sont mis dans la zone MY-TABLE, ce qui place 99 ‘X’ au début de la zone OFLOW. En COBOL V5, puisque les déplacements de longueur variable sont traités différemment, le MOVE se traduit par le déplacement de un ‘X’ suivi par 299 octets de données bidons. Le problème ici est que le ‘X’ a été associé à quelque chose en dehors du champ autorisé pour MY-TABLE. © 2014 IBM Corporation Merci ! Questions ou Commentaires ? 9 © 2014 IBM Corporation Comment s’abonner ? Joindre la communauté https://greenhouse.lotus.com/communities/community/cobolfrance © 2014 IBM Corporation
Documents pareils
Cliquez et modifiez le titre
Troisièmeregarding
niveau potential future products is not a commitment,
• The information
promise, or legal