A called COBOL subprogram can remember values in WORKING-STORAGE from the previous call. That is useful for a counter or cached lookup, but it is dangerous when the next call expects a clean start. The INITIAL compiler option changes that behavior by treating programs as if IS INITIAL was coded on PROGRAM-ID.
What is the COBOL INITIAL compiler option?
INITIAL causes a program and its nested programs to behave as if the IS INITIAL clause was specified on the PROGRAM-ID paragraph. IBM documents NOINITIAL as the default.
The option is useful when a subprogram must start in the same state each time it is entered. It should not be used as a blanket substitute for clear program initialization logic.
INITIAL vs NOINITIAL
| Option | Behavior | Common fit |
|---|---|---|
INITIAL |
Treats the program as initially called each time it is entered. | Subprograms that must not retain prior call values. |
NOINITIAL |
Leaves normal source behavior in place. | Most production programs unless the design needs automatic reset. |
PROGRAM-ID IS INITIAL example
The compiler option applies the same idea as coding IS INITIAL in the source. This short example shows the source-level form.
IDENTIFICATION DIVISION.
PROGRAM-ID. ACCTEDIT IS INITIAL.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-ERROR-COUNT PIC 9(04) VALUE ZERO.
01 WS-LAST-FIELD PIC X(20) VALUE SPACES.
When ACCTEDIT is entered again, the VALUE clauses are used to place those fields back into their starting values.
What happens to WORKING-STORAGE?
IBM documents that WORKING-STORAGE data items normally persist in their last-used state for the duration of the run unit. When a program has INITIAL behavior, WORKING-STORAGE data items are reinitialized each time the program is entered.
There is one important boundary: IBM also notes that INITIAL and IS INITIAL do not affect data items that do not have VALUE clauses. Do not assume every field becomes spaces or zero unless the definition says so.
WORKING-STORAGE vs LOCAL-STORAGE
LOCAL-STORAGE is already allocated for each call or method invocation and freed on return. If a LOCAL-STORAGE item has a VALUE clause, it is initialized on each call. That makes LOCAL-STORAGE a better fit for many temporary fields.
Use INITIAL when the program-level reset behavior is part of the design. Use explicit initialization or LOCAL-STORAGE when only a few fields need fresh values.
When to use INITIAL
- Use it for a subprogram that must not remember values between calls.
- Use it when old accumulator, flag, or error fields have caused repeat-call defects.
- Use it when nested programs also need initial-call behavior.
- Use source-level
IS INITIALwhen only one program should behave that way.
When to avoid INITIAL
Avoid INITIAL when retained state is part of the program design. Some subprograms intentionally keep lookup data, counters, or previous-call information in WORKING-STORAGE. Resetting those fields can create wrong results or extra CPU work.
The old version of this post mentioned heavy call overhead in a very small benchmark. Treat that as a warning, not a universal number. Measure your real program if it calls a subprogram many times and the subprogram has large WORKING-STORAGE.
INITIAL, CANCEL, and dynamic CALL
A dynamically called subprogram can be reset after a CANCEL, because it is loaded again on a later call. INITIAL is different: it applies the initial-state behavior each time the program is entered, without depending on a caller issuing CANCEL.
Do not add CANCEL only to clear data if your site avoids it for performance or program-management reasons. Pick the reset method deliberately.
Common mistakes
Expecting fields without VALUE clauses to reset
INITIAL does not make an undefined field clean by magic. Code VALUE clauses or explicit initialization for fields that need known starting values.
Using INITIAL across every compile
A site-wide compiler option can change behavior in many subprograms at once. Review retained-state programs before changing a compile PROC default.
Ignoring nested programs
IBM documents that INITIAL applies to the program and its nested programs. Check nested routines when a reset changes more than expected.
Review checklist
- Check whether the source already has
PROGRAM-ID ... IS INITIAL. - Confirm whether the compile listing shows
INITIALorNOINITIAL. - List which
WORKING-STORAGEfields are expected to retain values. - Add
VALUEclauses or explicit initialization where fields need known values. - Measure call-heavy code before changing reset behavior in a hot path.
- Retest callers that rely on repeat-call state.
Related Mainframe Forum guides
For nearby topics, read COBOL DYNAM compiler option, COBOL RENT compiler option, COBOL THREAD compiler option, COBOL USAGE clauses, COBOL INITIALIZE statement, and COBOL CALL statement.
External references
IBM documents the INITIAL compiler option, WORKING-STORAGE and LOCAL-STORAGE behavior, and Enterprise COBOL compiler options.
FAQ
What does the COBOL INITIAL compiler option do?
INITIAL makes the program and nested programs behave as if IS INITIAL was coded on PROGRAM-ID.
Is NOINITIAL the default?
Yes. IBM documents NOINITIAL as the default for the Enterprise COBOL INITIAL option.
Does INITIAL reset every WORKING-STORAGE item?
No. INITIAL does not affect data items that do not have VALUE clauses, so fields needing known values still need clear definitions or explicit initialization.
Should INITIAL be used for performance tuning?
No. Use INITIAL for correct reset behavior. If performance is a concern, measure the actual call path and storage size.