Skip to content

Commit 1b62759

Browse files
committed
Fix bug #1071 (cobc crashes wen replacing by nothing)
1 parent 06784b0 commit 1b62759

3 files changed

Lines changed: 96 additions & 26 deletions

File tree

cobc/ChangeLog

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11

2+
2026-08-26 Fabrice Le Fessant <fabrice.le_fessant@ocamlpro.com>
3+
4+
* ppparse.y (ppp_replace_list_add): fix bug #1071
5+
"cobc crashes when replacing by nothing"
6+
27
2026-08-23 Fabrice Le Fessant <fabrice.le_fessant@ocamlpro.com>
38

49
* ppparse.y (ppp_replace_list_add): trim spaces before

cobc/ppparse.y

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,8 @@ ppp_replace_list_add (struct cb_replace_list *list,
189189
/* Strictness flag is irrelevant for non-LEADING nor TRAILING
190190
replacements */
191191
src->strict = 0;
192-
} else {
192+
}
193+
if (lead_or_trail && new_text != NULL) {
193194
/* Use replacement text to decide strictness of partial match */
194195
const unsigned char *c;
195196
int has_space = new_text->next != NULL;

tests/testsuite.src/syn_misc.at

Lines changed: 89 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -3383,43 +3383,107 @@ LINE PG/LN A...B............................................................
33833383
AT_CLEANUP
33843384

33853385

3386-
AT_SETUP([missing periods])
3387-
AT_KEYWORDS([misc cobol85 area-a missing-periods])
33883386

3389-
# Check whether the first line is correcly handled:
3390-
AT_DATA([prog.cob], [ IDENTIFICATION DIVISION.
3387+
3388+
AT_SETUP([pseudotext replacement trim spaces])
3389+
AT_KEYWORDS([misc copy replace])
3390+
3391+
# Note: we show the output in listing mode, which is wrong (see
3392+
# comment in #831), since no replacement happens at all. We keep
3393+
# advising devs to checkout the .i file generated by -g instead of
3394+
# listings to check which replacements are really done by the compiler
3395+
3396+
AT_DATA([ok.inc], [
3397+
01 VARIABLE1 PIC X(01) VALUE "O1".
3398+
01 VARI(03)ABLE2 PIC X(02) VALUE "O2".
3399+
01 VARIABLE3 PIC X(04) VALUE "O3".
3400+
01 VARI(05)ABLE4 PIC X(02) VALUE "O4".
3401+
])
3402+
AT_DATA([prog.cob], [
3403+
IDENTIFICATION DIVISION.
33913404
PROGRAM-ID. prog.
33923405

33933406
DATA DIVISION.
33943407
WORKING-STORAGE SECTION.
3395-
01 DONE COMP-1 VALUE ZERO.
3396-
3408+
REPLACE == (04) == BY == (02) ==
3409+
== (05) == BY == ==.
3410+
COPY "ok.inc" REPLACING == (01) == BY == (02) ==
3411+
== (03) == BY == ==.
33973412
PROCEDURE DIVISION.
33983413
MAIN SECTION.
3399-
PERFORM SEC-1.
3400-
IF NOT DONE = 1
3401-
DISPLAY "SEC-1 NOT EXECUTED"
3402-
END-IF
3403-
STOP RUN
3404-
SEC-1 SECTION.
3405-
MOVE 1 TO DONE
3406-
GOBACK.
3414+
DISPLAY VARIABLE1 VARIABLE2 VARIABLE3 VARIABLE4.
3415+
GOBACK.
34073416
])
34083417

3409-
AT_CHECK([$COMPILE_ONLY prog.cob], [1], [],
3410-
[prog.cob: in section 'MAIN':
3411-
prog.cob:15: error: 'SEC-1' is not defined
3412-
prog.cob:15: error: syntax error, unexpected SECTION
3418+
AT_CHECK([SOURCE_DATE_EPOCH=1011960000 $COMPILE -g -Wall -t prog.lst prog.cob])
3419+
3420+
AT_CHECK([$COBCRUN_DIRECT ./prog], [0], [O1O2O3O4
34133421
])
3414-
AT_CHECK([$COMPILE_ONLY -fformat=cobol85 -fmissing-period=error prog.cob], [1], [],
3415-
[prog.cob: in section 'MAIN':
3416-
prog.cob:15: error: optional period used
3422+
3423+
AT_CHECK([cat prog.lst], [0],
3424+
[GnuCOBOL 3.3-dev.0 prog.cob Fri Jan 25 2002 12:00:00 Page 0001
3425+
3426+
LINE PG/LN A...B............................................................
3427+
3428+
000001
3429+
000002 IDENTIFICATION DIVISION.
3430+
000003 PROGRAM-ID. prog.
3431+
000004
3432+
000005 DATA DIVISION.
3433+
000006 WORKING-STORAGE SECTION.
3434+
000007 REPLACE == (04) == BY == (02) ==
3435+
000008 == (05) == BY == ==.
3436+
000009 COPY "ok.inc" REPLACING == (01) == BY == (02) ==
3437+
000001C
3438+
000002C 01 VARIABLE1 PIC X(01) VALUE "O1".
3439+
000003C 01 VARI(03)ABLE2 PIC X(02) VALUE "O2".
3440+
000004C 01 VARIABLE3 PIC X(04) VALUE "O3".
3441+
000005C 01 VARI(05)ABLE4 PIC X(02) VALUE "O4".
3442+
000009 == (03) == BY == ==.
3443+
000010 PROCEDURE DIVISION.
3444+
000011 MAIN SECTION.
3445+
000012 DISPLAY VARIABLE1 VARIABLE2 VARIABLE3 VARIABLE4.
3446+
000013 GOBACK.
3447+
3448+
3449+
0 warnings in compilation group
3450+
0 errors in compilation group
34173451
])
3418-
AT_CHECK([$COMPILE -fformat=cobol85 prog.cob], [0], [],
3419-
[prog.cob: in section 'MAIN':
3420-
prog.cob:15: warning: optional period used
3452+
3453+
AT_CLEANUP
3454+
3455+
3456+
AT_SETUP([bug 1071 with empty replaced text])
3457+
AT_KEYWORDS([copy replacing trailing])
3458+
3459+
AT_DATA([prog.cob], [>>SOURCE FREE
3460+
IDENTIFICATION DIVISION.
3461+
PROGRAM-ID. HELLO.
3462+
3463+
DATA DIVISION.
3464+
WORKING-STORAGE SECTION.
3465+
01 result PIC 9(4).
3466+
3467+
PROCEDURE DIVISION.
3468+
COPY fab.
3469+
DISPLAY "The result is " result.
3470+
STOP RUN.
3471+
])
3472+
AT_DATA([fab.cob], [>>SOURCE IS FREE
3473+
>>DEFINE 1aa AS 2
3474+
ADD 1 to result.
3475+
>>IF 1aa > 1
3476+
COPY fob REPLACING TRAILING ==a== BY ====.
3477+
>>END-IF
3478+
])
3479+
AT_DATA([fob.cob], [DISPLAY resulta.
3480+
])
3481+
3482+
AT_CHECK([$COMPILE --free prog.cob])
3483+
3484+
AT_CHECK([$COBCRUN_DIRECT ./prog], [0], [0001
3485+
The result is 0001
34213486
])
3422-
AT_CHECK([$COBCRUN_DIRECT ./prog], [0], [], [])
34233487

34243488
AT_CLEANUP
34253489

0 commit comments

Comments
 (0)