Многократный выход, вызывающий предупреждения компилятора - PullRequest
2 голосов
/ 03 февраля 2020

У меня есть программа, в которой при нескольких условиях я хотел бы выйти досрочно, а не продолжать через поток и вместо необходимости проверять это условие досрочного выхода при вызове параграфов.

Для этого , У меня есть параграф "EXIT-FAILURE", который проверяет, чтобы убедиться, что общее поле флага возврата не в порядке (0), регистрирует сообщение (DISPLAY) и, наконец, имеет оператор GOBACK.

Однако, делая это, я получаю предупреждение компилятора о каждой PERFORM, которая вызывает этот абзац "EXIT-FAILURE": IGYCB7310-W The "PERFORM" statement at "PERFORM (line [line-number])" cannot reach its exit.

Есть ли способ получить эту логику c (которая в основном множественный выход / ранний выход, а не однократный), без предупреждения компилятора?

Эта идея полностью противоречит способу действий COBOL (мой опыт больше в Java, где это было бы совершенно нормально в контексте защитных заявлений или исключений)?


РЕДАКТИРОВАТЬ: Добавление минимальной программы, запрошенной Саймоном:

IDENTIFICATION DIVISION.
PROGRAM-ID. SOQUEST.
ENVIRONMENT DIVISION.
DATA DIVISION.
PROCEDURE DIVISION.
   PERFORM A100-INITIALIZE
   PERFORM A200-VALIDATE

   PERFORM B200-PROCESS-STEP-1

   GOBACK
   .
A100-INITIALIZE.
   DISPLAY "INITIALIZED"
   .
A200-VALIDATE.
   PERFORM Z900-EXIT-FAILURE
   .
B200-PROCESS-STEP-1.
   DISPLAY "COMPLETED STEP 1"
   .
Z900-EXIT-FAILURE.
   GOBACK
   .

Результаты в этих двух w Арннингс, связанный с моим вопросом:

IGYCB7310-W   The "PERFORM" statement at "PERFORM (line 58.1)" cannot reach its exit.
IGYCB7310-W   The "PERFORM" statement at "PERFORM (line 68.1)" cannot reach its exit.

(строка 58.1 соответствует строке "PERFORM A200-VALIDATE"; линия 68.1 отображается на линию «PERFORM Z900-EXIT-FAILURE»)

Ответы [ 4 ]

3 голосов
/ 03 февраля 2020

Как видно из предупреждения компилятора и дополнительного пояснения из руководства по компилятору, проблема в том, что вы PERFORM что-то и PERFORM говорит "сделайте это, а затем вернетесь".

Если Enterprise COBOL для z / OS добавлена ​​поддержка RAISE exception-name (и, в идеале, определенных пользователем исключений), это будет путь к go (оба - "COBOL", как указано в вопросе, и "исключительные", как в java), и вы поместил бы абзац в DECLARATIVES как EXIT-FAILURE SECTION. USE AFTER EXCEPTION CONDITION exception-name. До тех пор [= возможно навсегда]:

Если нет правил против этого на месте: используйте GO TO EXIT-FAILURE - этот глагол COBOL говорит "go там" (и, вероятно, не возвращайтесь, особенно с хорошо названный абзац, как в вашем случае).

Если есть правило против GO TO - go с подходом от @cschneid - добавьте комментарий в заголовке об этом предупреждении и обращайтесь к нему напрямую, где это происходит с другим комментарием.

Примечание: я лично все равно попытаюсь поместить абзац в DECLARATIVES (без изменений, как сейчас, просто переместите его «вверх» на DECLARATIVES), чтобы еще больше растянуть точку «это называется только в том случае, если что-то идет не так». Но ваш компилятор может выдать другое предупреждение или даже ошибку в этом случае (по крайней мере для «стандартного» -COBOL требуется инструкция использования).

1 голос
/ 03 февраля 2020

Моя реакция на это предупреждение компилятора заключается в добавлении комментария в источник, указывающий, что предупреждение ожидается. IBM Enterprise COBOL 6.3 (последний выпуск на эту дату) не поддерживает оператор RAISE.

Это мало чем отличается от ВЫПОЛНЕНИЯ параграфа, который выполняет EXE C CICS RETURN.

@ SimonSobisch знает больше о COBOL, чем когда-либо, и, надеюсь, предоставит пример того, как решить эту проблему в большей степени в соответствии с «путем COBOL», который будет полезен для будущих искателей знаний здесь.

0 голосов
/ 03 мая 2020

Использование EXIT PARAGRAPH может помочь избежать Go TO, предупреждений о компиляции и комментариев ...

IDENTIFICATION DIVISION.
PROGRAM-ID. SOQUEST.
ENVIRONMENT DIVISION.
DATA DIVISION.
WORKING-STORAGE SECTION.
01  FLAGS.
    03  WS-VALIDATION           PIC 9 VALUE ZERO.
     88 WS-VALIDATION-OK        VALUE 0.
     88 WS-VALIDATION-ERROR     VALUE 1.

PROCEDURE DIVISION.
MAIN.
    PERFORM A100-INITIALIZE

    PERFORM A200-VALIDATE
    IF WS-VALIDATION-ERROR
        EXIT PARAGRAPH
    END-IF

    PERFORM B200-PROCESS-STEP-1
    .
CLOSE-FILES.
    CLOSE XXXX
    CLOSE YYY
    .
EXIT-PROGRAM.
    GOBACK
    .
A100-INITIALIZE.
    DISPLAY "INITIALIZED"
    .
A200-VALIDATE.
* Do next when validation fails ...
    MOVE 1 TO WS-VALIDATION

    ANY-VALIDATION-HERE
    IF ERROR-FOUND  
        EXIT PARAGRAPH
    END-IF

    CONTINUE-WITH-OTHER-VALIDATIONS
    IF ERROR-FOUND
        EXIT PARAGRAPH
    END-IF

* Arriving here .. MEANS VALIDATION IS ok
    MOVE O TO WS-VALIDATION
   .
B200-PROCESS-STEP-1.
   DISPLAY "COMPLETED STEP 1"
   .
0 голосов
/ 06 февраля 2020

Попробуйте выполнить следующее:

Z900-EXIT-FAILURE.
    IF <some condition that is always true>
        GOBACK
    END-IF
    .

Поскольку оптимизатор компилятора не может определить тот факт, что условие IF всегда выполняется, предупреждение не будет выдано.

Ответ на комментарий ниже и несколько других предложений ...

Оптимизация компилятора в некоторых будущих выпусках может определить условие как всегда истинное и удалить его: Это может вызвать предупреждение возвращаться. Столкнитесь с этой проблемой, когда это произойдет. Пока что что-то вроде: IF FUNCTION WHEN-COMPILED <= FUNCTION CURRENT-DATE не будет оптимизировано и, вероятно, не будет в течение многих лет.

Может привести к менее эффективному коду: Весь смысл этот пункт для выхода из программы. Дополнительные инструкции, необходимые для теста IF, не должны оказывать ощутимого влияния на производительность.

Отключить диагностику c: Это можно сделать с помощью выхода из компилятора, чтобы перехватить и обнулить сообщение см .: https://www.ibm.com/support/knowledgecenter/en/SS6SG3_6.3.0/pg/ref/rpext10.html. Я бы предостерег от этого, потому что действительные предупреждения также могут быть подавлены, некоторые из которых, вероятно, не следует игнорировать.

Вставьте комментарий в код, указывающий, что предупреждение является приемлемым: Не все программисты настолько усердны, чтобы продолжать просматривать предупреждения компилятора, как только они узнают, что они иногда являются приемлемыми. Скорее всего, в будущем будут пропущены действительные предупреждения.

Использование DECLARATIVES: Компилятор IBM Enterprise COBOL поддерживает DECLARATIVES для ошибок, связанных с вводом / выводом, и отладку, только делая их использование справедливым ограничительный. Кроме того, существует ряд дополнительных ограничений относительно того, можно ли выдавать STOP RUN или GOBACK, пока активна процедура DECLARATIVE. Я бы не посоветовал использовать ДЕКЛАРАТИВНЫЕ. Языковая среда предоставляет средства для sh обработки пользовательских условий, но это довольно продвинутая топи c. см .: https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.1.0/com.ibm.zos.v2r1.ceea800/ceea824.htm

Использование GO TO Z900-EXIT-FAILURE: GO распознается компилятором как go "там и нет" возврат управления передачей и не будет выдавать сообщение IGYCB7310-W при условии, что GO TO выполняется условно (например, содержится в IF или другом условном выражении). Это, вероятно, лучшее решение при условии, что местные стандарты кодирования позволяют использовать GO TO в этих обстоятельствах. В некоторых местах есть неоправданный патологический страх перед GO TO, и он не допустит его ни при каких обстоятельствах.

...