exponenta event banner

Строка с несколькими инструкциями

Несколько операторов в строке

Описание

Этот дефект возникает, когда перед началом предварительной обработки анализ обнаруживает дополнительный текст после точки с запятой (;) на линии. Дефект не возникает для комментариев, for-определения контуров, фигурные скобки или обратные косые черты.

Риск

Использование одной инструкции на строку улучшает читаемость кода. Поскольку большинство инструкций в коде появляются в новой строке, использование нескольких инструкций в строке в нескольких случаях в рамках этой схемы может затруднить просмотр кода.

Зафиксировать

Запись одной инструкции на строку.

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

Примеры

развернуть все

int multi_init(void){
int abc = 4; int efg = 0; //defect

    return abc*efg;
}

В этом примере: abc и efg инициализируются во второй строке функции как отдельные операторы.

Исправление - инициализация с разделением запятыми

Одной из возможных корректировок является использование запятой вместо точки с запятой для объявления нескольких переменных в одной строке.

int multi_init(void){
    int a = 4, b = 0;

    return a*b;
}
Исправление - новая строка для каждой инициализации

Одной из возможных корректировок является разделение каждой инициализации. Путем инициализации b на следующей строке код дольше поднимает дефект.

int multi_init(void){
    int a = 4;
    int b = 0;

    return a*b;
}
int multi_loop(void){
    int a, b = 0;
    int index = 1;
    int tab[9] = {1,1,2,3,5,8,13,21};

    for(a=0; a < 3; a++) {b+=a;} // no defect

for(b=0; b < 3; b++) {a+=b; index=b;} //defect

while (index < 7) {index++; tab[index] = index * index;} //defect
    return a*b;
}

В этом примере существует три цикла, закодированных на одной линии, каждая с несколькими точками с запятой.

  • Первое for цикл имеет несколько точек с запятой. Polyspace ® не вызывает дефект для нескольких операторов в for объявление цикла.

  • Polyspace действительно поднимает дефект на втором for цикл, потому что после for объявление цикла.

  • while цикл также имеет несколько операторов после объявления цикла. Polyspace поднимает дефект на этой линии.

Исправление - новая строка для каждого оператора цикла

Одной из возможных корректировок является использование новой строки для каждого оператора после объявления цикла.

int multi_loop(void){
    int a, b = 0;
    int index = 1;
    int tab[9] = {1,1,2,3,5,8,13,21};

    for(a=0; a < 3; a++) {b+=a;}

    for(b=0; b < 3; b++){
      a+=b;
      index=b;
    }

    while (index < 7){
      index++;
      tab[index] = index * index;
    }
    return a*b;
}
int multi_if(void){

    int a, b = 1;
    if(a == 0) { a++;} // no defect 
else if(b == 1) {b++; a *= b;} //defect
}

В этом примере существуют два условных оператора an: if и else if. if строка не вызывает дефект, так как только одна инструкция следует за условием. else if оператор действительно вызывает дефект, потому что два оператора следуют условию.

Корректировка - Новые строки для условий нескольких выписок

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

int multi_if(void){
    int a, b = 1;

    if(a == 0) a++;
    else if(b == 1){
      b++; 
      a *= b;
    }
}

Информация о результатах

Группа: Надлежащая практика
Язык: C | C++
По умолчанию: Откл.
Синтаксис командной строки: MORE_THAN_ONE_STATEMENT
Воздействие: Низкий
Представлен в R2013b