Detekce otevírání a zavírání redundantních souborů v COBOLu

Jak detekovat otevírání a zavírání redundantních souborů v COBOLu: Přístup statické analýzy

Práce se soubory v COBOLu je na první pohled zdánlivě jednoduchá. Soubor deklarujete v větvi ENVIRONMENT DIVISION, v větvi DATA DIVISION popíšete rozvržení jeho záznamů a v větvi PROCEDURE DIVISION použijete příkazy OPEN, READ nebo WRITE a CLOSE. Čtyři slovesa, jeden životní cyklus. Problém je v tom, že programy v COBOLu zřídka zůstávají jednoduché, během desetiletí údržby hromadí logiku, cesty k výjimkám, podmíněné větvení a volání PERFORM. Co začíná jako čistý vzorec jednoduchého otevření a zavření, se tiše mění v něco složitějšího: soubory otevřené dvakrát v jedné spouštěcí cestě, příkazy CLOSE, které se spouštějí, když není otevřen žádný soubor, chyba opustí tuto větev za větví CLOSE.

Žádný z těchto problémů není okamžitě viditelný. Program se kompiluje. Často běží bez chyby na vstupech, které testujete. Tiše selhává na vstupních kombinacích, které jste nikdy nepředpokládali, nebo snižuje výkon dávkového okna tak postupně, že nikdo nespojí příčinu s následkem. Statická analýza je najde dříve, než k něčemu z toho dojde.

Detekce úniků napříč všemi jazyky

SMART TS XL mapuje dlouhodobé referenční řetězce a neohraničené datové struktury v celé vaší kódové základně.

Více informací

Čtyři vady stavu souborů, které stojí za to najít

Než se pustíme do detekčních mechanismů, zde je jasný přehled toho, co hledáte. Ne všechny problémy se soubory COBOL jsou stejné.

PřeběhnoutCo se děje za běhuPřísnost
Dvojité otevřeníOTEVŘÍT u již otevřeného souboru → STAV SOUBORU 41 nebo ukončitVysoký
ZAVŘÍT bez předchozího OTEVŘÍTZAVŘENÍ souboru, který nebyl nikdy otevřen → STAV SOUBORU 42 nebo ukončeníVysoký
Chybí tlačítko ZAVŘÍT na normálním výjezduSoubor ponechaný otevřený při STOP RUN → OS jej zavře, ale nevyprázdněné vyrovnávací paměti riskují ztrátu datStřední
Chybí CLOSE při chybném ukončeníProgram se zastaví při otevření souboru → možné poškození záznamů v souborech VSAMVysoký
Redundantní OTEVŘÍT/ZAVŘÍT ve ​​smyčceSoubor se otevíral a zavíral při každé iteraci → vysoká režie I/OStředně vysoká

Klíčové ponaučení: Nejzávažnější chyby, dvojité OPEN a CLOSE bez OPEN, způsobují okamžité selhání za běhu nebo rizika pro integritu dat. Chyby výkonu (otevírání/zavírání na úrovni smyčky) nezpůsobují žádnou chybu, pouze pomalé dávkové úlohy, u kterých nikdo nezjistil příčinu.

Co ztěžuje ruční nalezení

Problém nespočívá v identifikaci vzoru. Každý vývojář ví, že by se soubor neměl otevírat dvakrát. Problém je v tom, že tok řízení COBOLu je nelineární v tom smyslu, že ruční trasování je nespolehlivé.

Uvažujme program s touto strukturou:

cobol

       PROCEDURE DIVISION.
       MAIN-LOGIC.
           PERFORM INITIALIZATION
           PERFORM PROCESS-RECORDS
           PERFORM TERMINATION
           STOP RUN.

       INITIALIZATION.
           OPEN INPUT CUSTOMER-FILE
           OPEN OUTPUT REPORT-FILE
           MOVE 0 TO WS-ERROR-FLAG.

       PROCESS-RECORDS.
           READ CUSTOMER-FILE INTO WS-CUSTOMER-REC
               AT END MOVE 1 TO WS-EOF-FLAG
           END-READ
           IF WS-ERROR-FLAG = 1
               PERFORM ERROR-EXIT
           END-IF
           PERFORM UNTIL WS-EOF-FLAG = 1
               PERFORM PROCESS-ONE-RECORD
               READ CUSTOMER-FILE INTO WS-CUSTOMER-REC
                   AT END MOVE 1 TO WS-EOF-FLAG
               END-EXEC
           END-PERFORM.

       ERROR-EXIT.
           DISPLAY 'Error in processing'
           CLOSE CUSTOMER-FILE    *> CLOSE here...
           STOP RUN.

       TERMINATION.
           CLOSE CUSTOMER-FILE    *> ...and CLOSE here too
           CLOSE REPORT-FILE
           STOP RUN.

Dokážete odhalit vadu bez sledování všech cest provádění? Pokud WS-ERROR-FLAG je uvnitř nastaveno na 1 PROCESS-ONE-RECORD (možná volaným podprogramem), řízení pokračuje do ERROR-EXIT, který zavře soubor a zastaví se. To je správně. Ale pokud WS-ERROR-FLAG is ne nastaveno, smyčka se dokončí, PROCESS-RECORDS výnosy a TERMINATION běží, což se také zavírá CUSTOMER-FILEDva zavření, jeden otevření. STAV SOUBORU ZA RUNTÁŽE 42.

Toto je jednoduchý program se třemi částmi. Skutečné programy mají dvacet částí, podmíněná volání PERFORM, příkazy GO TO ve starším kódu a rutiny pro ošetření výjimek, které samy volají jiné rutiny. Ruční trasování je nejen náchylné k chybám, ale také není zvládnutelné.


Jak statická analýza modeluje stav souborů

Statická analýza detekuje tyto vady konstrukcí grafu toku řízení programu a šířením stavu souboru podél každé cesty.

Analýza přiřadí každému souboru stavovou proměnnou se třemi možnými hodnotami:

  • CLOSED, soubor nebyl otevřen nebo byl úspěšně uzavřen
  • OPEN, soubor byl otevřen, ale ještě nebyl uzavřen
  • UNKNOWN, stav nelze určit staticky (např. podmíněné otevření ve větvi, která není plně analyzována)

Při každém příkazu OPEN analýza kontroluje: zda je tento soubor již ve stavu OPENPokud ano → dvojitá závada OTEVŘENO.

Při každém příkazu CLOSE: je tento soubor ve stavu CLOSED or UNKNOWNPokud ZAVŘENO → zavřeno bez závady otevření.

Na každé cestě k STOP RUN nebo EXIT PROGRAM: je nějaký soubor stále ve stavu OPENPokud ano → chybí blízká vada.

U smyček analýza kontroluje, zda je příkaz OPEN nebo CLOSE ovládán hlavičkou smyčky, což znamená, že se provede v každé iteraci.

Dávej si pozor: Nejtěžšími případy pro jakýkoli analyzátor jsou volání PERFORM do sdílených rutin. Pokud ERROR-HANDLER je volána z dvanácti různých míst v programu, stav souboru v okamžiku volání PERFORM určuje, zda se má zavřít uvnitř ERROR-HANDLER je správný nebo chybný. Analyzátor, který nešíří stav prostřednictvím řetězců PERFORM, bude produkovat falešně negativní (chybějící skutečné defekty) nebo falešně pozitivní výsledky (označení správného kódu).


OTEVŘENÍ/ZAVŘENÍ na úrovni smyčky: Výkonnostní vada bez chybového kódu

Tento vzorec neprodukuje žádnou chybu za běhu ani anomálii STAVU SOUBORU. Běží jednoduše pomalu, potenciálně o řády pomaleji, než je nutné.

cobol

      *> PROBLEMATIC: file opened and closed on every iteration
       PROCESS-ALL-REGIONS.
           PERFORM VARYING WS-REGION-ID FROM 1 BY 1
               UNTIL WS-REGION-ID > 10
               OPEN INPUT CUSTOMER-FILE
               PERFORM PROCESS-REGION-RECORDS
               CLOSE CUSTOMER-FILE
           END-PERFORM.

Pokud není soubor fyzicky rozdělen podle oblastí, způsobuje tento přístup zbytečné režijní náklady. V praxi by bylo lepší soubor otevřít jednou, přečíst všechny záznamy a filtrovat v paměti nebo pomocí logiky.

Každé OPEN u souboru VSAM zahrnuje vyhledávání v katalogu, inicializaci ACB a alokaci bufferového fondu. Každé CLOSE vyprázdní buffery, aktualizuje katalog a uvolní ACB. U souboru s deseti regiony se to stane desetkrát místo jednou. U souboru s 10 000 záznamy a tisícem regionů se matematika stává složitou.

cobol

      *> CORRECT: open once, filter inside the loop
       PROCESS-ALL-REGIONS.
           OPEN INPUT CUSTOMER-FILE
           PERFORM VARYING WS-REGION-ID FROM 1 BY 1
               UNTIL WS-REGION-ID > 10
               PERFORM PROCESS-REGION-RECORDS
           END-PERFORM
           CLOSE CUSTOMER-FILE.

Statická analýza to detekuje identifikací příkazů OPEN a CLOSE, které jsou dominovány smyčkou, tj. každé provedení těla smyčky provede příkaz OPEN nebo CLOSE. Detekce vyžaduje, aby graf toku řízení reprezentoval strukturu smyčky, nikoli pouze posloupnost příkazů.


STAV SOUBORU: Signál stavu souboru vašeho programu, pokud ho zaškrtnete

Každá operace se souborem v COBOLu nastaví pole FILE STATUS definované v položce FILE-CONTROL. Program, který kontroluje FILE STATUS po každém OPEN, READ, WRITE a CLOSE, dokáže za běhu detekovat a reagovat na každou anomálii stavu souboru. Program, který FILE STATUS ignoruje, letí naslepo.

Kontrolní seznam: Kódy stavu souborů, které by měl znát každý vývojář v COBOLu

  • 00Úspěšné dokončení
  • 10, Konec souboru (ČTENÍ: žádné další záznamy)
  • 35, Soubor nenalezen (OPEN INPUT: soubor neexistuje)
  • 41, Soubor je již otevřený (OPEN u souboru ve stavu OPEN)
  • 42, Soubor se neotevřel (CLOSE nebo READ u souboru v CLOSED stavu)
  • 47, Pokus o ČTENÍ souboru nebyl otevřen VSTUP nebo IO
  • 48, Pokus o zápis do souboru nebyl otevřen. OUTPUT, IO nebo EXTEND
  • 97, Soubor byl úspěšně otevřen (specifické pro IBM, některá prostředí)

cobol

       FILE-CONTROL.
           SELECT CUSTOMER-FILE
               ASSIGN TO CUSTFILE
               FILE STATUS IS WS-CUST-FILE-STATUS.

       WORKING-STORAGE SECTION.
       01 WS-CUST-FILE-STATUS   PIC XX.

       PROCEDURE DIVISION.
           OPEN INPUT CUSTOMER-FILE
           IF WS-CUST-FILE-STATUS NOT = '00'
               DISPLAY 'OPEN failed: ' WS-CUST-FILE-STATUS
               PERFORM ABEND-ROUTINE
           END-IF.

Dávej si pozor: Častou chybou údržby je deklarace stavu souboru (FILE STATUS) v položce FILE-CONTROL, ale nikdy se na něj neodkazuje. WS-CUST-FILE-STATUS v PROCEDURE DIVISION. Pole se vyplní po každé operaci se souborem, ale pokud jej žádný kód nekontroluje, program tiše proběhne přes chyby. Statická analýza může označit tento vzorec: STAV SOUBORU deklarovaný, ale nikdy neodkazovaný v podmíněné logice.


Tři reálné vzory v COBOLu, které způsobují vady

Vzor 1: Problém sdíleného chybového ukončení

Program má více sekcí pro zpracování, z nichž každá má svůj vlastní obslužný rutinu chyb. Několik obslužných rutin chyb soubor před návratem zavře. Normální rutina pro ukončení také soubor zavře. Pokud dojde k chybě a obnova pokračuje přes obslužnou rutinu chyb, soubor se zavře dvakrát.

cobol

       VALIDATE-RECORDS.
           READ CUSTOMER-FILE INTO WS-REC
               AT END MOVE 1 TO WS-EOF
           END-READ
           IF WS-CUST-FILE-STATUS NOT = '00' AND '10'
               CLOSE CUSTOMER-FILE    *> closes here on read error
               PERFORM WRITE-ERROR-LOG
               GO TO TERMINATION      *> skips to close in TERMINATION?
           END-IF.

       TERMINATION.
           CLOSE CUSTOMER-FILE        *> double close if GO TO reached here
           CLOSE REPORT-FILE
           STOP RUN.

Jedno GO TO TERMINATION přenáší kontrolu přímo do TERMINATION, který provádí vlastní CLOSE CUSTOMER-FILESTAV SOUBORU 42.

Oprava: Použijte jednu centralizovanou zavírací rutinu. Každá ukončovací cesta volá stejnou rutinu, která před zavřením kontroluje, zda je soubor otevřený.

Vzor 2: Podmíněný OPEN

Soubor se otevírá podmíněně, pouze když je aktivní určitý režim zpracování. Zavření je však bezpodmínečné a probíhá v každé cestě provádění, včetně těch, kde soubor nebyl nikdy otevřen.

cobol

       INITIALIZATION.
           IF WS-PROCESSING-MODE = 'FULL'
               OPEN OUTPUT AUDIT-FILE   *> only opened in FULL mode
           END-IF.

       TERMINATION.
           CLOSE AUDIT-FILE    *> ALWAYS closes -- FILE STATUS 42 in PARTIAL mode
           STOP RUN.

Tato vada je v testování neviditelná, pokud testy vždy běží v PLNÉM režimu. V produkčním prostředí se objeví při prvním spuštění v ČÁSTEČNÉM režimu.

Vzor 3: PERFORM napříč kompilačními jednotkami

V programech, které používají CALL k vyvolání podprogramů, může být soubor otevřený v hlavním programu předán podprogramu, který jej zavře, a poté jej hlavní program znovu zavře.

cobol

      *> Main program
       CALL 'SUBPROG1' USING CUSTOMER-FILE-STATUS
       *> SUBPROG1 closes CUSTOMER-FILE internally
       CLOSE CUSTOMER-FILE    *> double close

Tento vzorec vyžaduje interprocedurální analýzu , která sleduje stav souboru přes hranici CALL do chování podprogramu, což jednoduchá vnitroprogramová analýza nedokáže detekovat.


Co potřebuje statický analyzátor, aby to zvládl dobře

Ne všechny nástroje pro statickou analýzu zvládají analýzu stavu souborů v COBOLu se stejnou hloubkou. Zde je kontrolní seznam pro vyhodnocení kapacity:

Zvládá nástroj řetězce PERFORM? Programy v COBOLu používají PERFORM k volání pojmenovaných odstavců a sekcí. Operace se soubory uvnitř cíle PERFORM musí být viditelné pro sledování stavu volajícího.

Zpracovává nástroj inline operace PERFORM VARYING (smyčky)? Detekce smyček je nutná k identifikaci operací OPEN/CLOSE s dominantními smyčkami.

Sleduje stav napříč okny GO TO? Starší programy v COBOLu hojně používají oknu GO TO. Analyzátor, který nedokáže sledovat hrany okny GO TO v grafu toku řízení, přehlédne celé třídy defektů.

Zpracovává COPY a REPLACE? Kód pro práci se soubory je často v členech COPY. Analyzátor, který před analýzou nerozšiřuje členy COPY, přehlédne operace definované v přiloženém kódu.

Kontroluje se využití STAVU SOUBORU? Kompletní analýza kontroluje nejen to, zda je STAV SOUBORU deklarován, ale i to, zda je po každé operaci skutečně ověřen.

Provádí interprocedurální analýzu? Volané podprogramy, které provádějí operace se soubory, vytvářejí závislosti na stavech mezi programy. Skutečné pokrytí vyžaduje dodržování řetězců volání.

Klíčové ponaučení: Nástroj, který kontroluje pouze jeden odstavec nebo sekci, přehlédne většinu reálných vad. Vady, které jsou důležité v produkčním prostředí, ty, jejichž objevení trvalo roky a jejich diagnostika hodiny, jsou ty, které se rozprostírají přes více sekcí, podmíněných větví a nazývaných rutin.


Co dělat s výsledky: Rámec pro stanovení priorit

Když statická analýza odhalí vady, ne všechny nálezy jsou stejné. Zde je návod, jak je třídit:

Okamžitě opravte (před dalším dávkovým spuštěním):

  • Dvojité OPEN v jakékoli cestě spuštění, kde by stav souboru 41 způsobil ukončení.
  • CLOSE bez OPEN v cestách, které se spouštějí v produkčním prostředí
  • Chybí CLOSE u chybových výstupních cest pro soubory VSAM (riziko integrity zápisu)

Harmonogram pro další sprint:

  • OTEVŘENÍ/ZAVŘENÍ s dominancí smyčky s měřitelným dopadem na dávkové okno
  • Chybějící kontroly STAVU SOUBORU u kritických souborů (audit, transakce, zpráva)
  • Podmíněné OTEVŘENÍ s bezpodmínečným ZAVŘENÍm v multirežimových programech

Sledování a adresa během další modernizační jízdy:

  • Chybějící deklarace FILE STATUS
  • ZAVŘÍT pouze na normálních výstupních cestách (OS to zvládá, ale je to špatný postup)
  • Meziprocedurální vady, kde oprava vyžaduje koordinaci změn napříč více programy

Jak SMART TS XL Analyzuje stav souboru COBOL

SMART TS XLJe statická analýza kódu vytváří model toku řízení každého programu v COBOLu v daném prostředí, rozšiřuje členy COPY, sleduje řetězce PERFORM, trasuje hrany GO TO a šíří stav souboru každou větví každého podmíněného příkazu. Nejedná se o porovnávání vzorů; jedná se o strukturální model toho, co program skutečně dělá v každém dosažitelném bodě svého provádění.

Schopnost mapování závislostí aplikací rozšiřuje tuto funkci i na interprocedurální dimenzi: když program v COBOLu volá podprogram, který provádí operace se soubory, mapa závislostí představuje tento vztah, což umožňuje analýzu, která překračuje hranice kompilačních jednotek. Defekty dvojitého OPEN, které se rozprostírají v hlavním programu a volaném podprogramu, jsou ve strukturálním modelu viditelné způsobem, jakým nejsou viditelné v žádné intraprogramové analýze.

Díky podpůrnému vyhledávání lze výsledky aplikovat ve velkém měřítku: během několika sekund lze nalézt každý program v portfoliu, který otevírá konkrétní datovou sadu, každý člen COPY obsahující příkaz CLOSE, každý program, jehož cíl PERFORM obsahuje příkaz OPEN, napříč miliony řádků jazyka COBOL. Pro modernizační tým, který se připravuje na migraci dávkové úlohy do cloudu, tato vyhledávací funkce promění týdenní manuální audit v cílený dotaz.

Možnost rozšíření JCL přidává operační kontext: které kroky úlohy JCL vyvolávají každý program, na které datové sady se odkazuje každý příkaz DD a jak se zpracování souborů v kódu COBOL připojuje k fyzickým datovým sadám definovaným v JCL. Defekt CLOSE v souboru, který JCL definuje jako kritickou výstupní datovou sadu, má vyšší prioritu než stejný defekt v dočasném pracovním souboru a toto stanovení priorit vyžaduje znalost kontextu JCL každého programu COBOL.


Širší ponaučení: Stav souboru je jen jeden rozměr

Redundantní operace se soubory jsou specifickým příkladem obecnějšího problému: programy v COBOLu, které se vyvíjely po celá desetiletí, obsahují chování závislé na stavu, stav souboru, stavy přepínačů, stavy čítačů, které lze správně pochopit pouze sledováním všech možných cest provádění v celém grafu toku řízení.

Lidská kontrola tohoto druhu kódu je pomalá, neúplná a nekonzistentní. Různí vývojáři nacházejí různé chyby. Stejný vývojář, který kontroluje stejný program dvakrát, najde různé chyby. Statická analýza je systematická: aplikuje stejná pravidla na každou cestu v každém programu, pokaždé, bez únavy nebo předpokladů.

Pro týmy spravující rozsáhlá portfolia v COBOLu, ať už se jedná o průběžnou údržbu, programy modernizace starších systémů nebo audity shody s předpisy, není odměnou systematické analýzy stavu souborů pouze nalezené vady. Je to jistota, že portfolio bylo kompletně analyzováno a že zbývající vady jsou známé, nikoli skryté.