Что является альтернативой вложенному if в C безопасном кодировании? - PullRequest
2 голосов
/ 27 апреля 2020

Например:

#define SUCCESS 1u
status_t status;

/* Initialize a peripheral */
status = start_Timer();

if(status == SUCCESS)
{
    /* Proceed */
    status = another_initialization();

    if(status == SUCCESS)
    {
        /* Proceed further */
    }

}

Это получает много отступов в нескольких последовательных процедурах, что оставляет действительно небольшую ширину линии для реальных алгоритмов в программе. Есть ли альтернатива обработке исключений в C?

Ответы [ 3 ]

3 голосов
/ 27 апреля 2020

Вдохновлено ответом CrisBD, но без возврата в середине исполнения (не рекомендуется MISRA).

#define SUCCESS 1u
status_t status;

/* Initialize a peripheral */
status = start_Timer();

if(status == SUCCESS)
{
   /* Proceed */
   status = another_initialization();
}

if(status == SUCCESS)
{
    /* Proceed further */
}
2 голосов
/ 27 апреля 2020

Мне кажется, лучше инвертировать логику теста c, и вместо того, чтобы продолжать тестирование кода, тестировать до остановки.

#define SUCCESS 1u
status_t status;

/* Initialize a peripheral */
status = start_Timer();

if(status != SUCCESS)
{
   return ;
}
/* Proceed */
status = another_initialization();

if(status != SUCCESS)
{
    return;
}
/* Proceed further */
0 голосов
/ 27 апреля 2020

Для простых примеров кода, подобных приведенному в вопросе, я не вижу проблемы с вложением (с или без скобок и отступов). Но я предполагаю, что фрагмент кода был выбран как minimal reproducible example, чтобы продемонстрировать проблему, которая может стать серьезной при многократном вложении блоков.

Для более сложных примеров я хотел бы указать на важную рекомендацию: ограничить сложность функций (обычно цикломати c сложность). Насколько я знаю, сама MISRA не налагает жестких ограничений на какую-либо меру сложности. Тем не менее, эффективная практика заключается в применении ограничения на цикломатику МакКейба c около 10-20.

Это ограничивает максимальное количество вложенных if s, for s, switch es et c. к небольшому числу, которое может быть обработано даже при значительной ширине отступа и фигурных скобках везде.

...