exponenta event banner

CERT C: Rec. MSC13-C

Обнаружение и удаление неиспользуемых значений

Описание

Определение правила

Обнаружение и удаление неиспользуемых значений. [1 ]

Внедрение Polyspace

Эта проверка проверяет наличие следующих проблем:

  • Неиспользуемый параметр.

  • Пишите без дальнейшего чтения.

Примеры

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

Проблема

Неиспользуемый параметр возникает, когда параметр функции не считывается и не записывается в тело функции.

Риск

Неиспользуемые параметры функции вызывают следующие проблемы:

  • Укажите, что код может быть неполным. Параметр, возможно, предназначен для операции, которую вы забыли кодировать.

  • Если скопированные объекты большие, избыточные копии могут снизить производительность.

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

Определите, предполагается ли использовать параметры. В противном случае удалите параметры, которые не используются в теле функции.

Можно намеренно использовать неиспользуемые параметры. Например, имеются параметры, которые планируется использовать позднее при добавлении расширений к функции. Добавьте комментарий кода, указывающий на ваше намерение для дальнейшего использования. Комментарий кода помогает вам или проверяющему код понять, почему функция имеет неиспользуемые параметры.

Либо добавьте оператор, например (void)var; в теле функции. var является неиспользуемым параметром. Можно определить макрос, расширяющийся до этой инструкции, и добавить макрос в тело функции.

Пример - Неиспользуемый параметр
void func(int* xptr, int* yptr, int flag) {
    if(flag==1) {
        *xptr=0;
    }
    else {
        *xptr=1;
    }
}

int main() {
    int x,y;
    func(&x,&y,1);
    return 0;
}

В этом примере параметр yptr не используется в теле func.

Коррекция - использовать параметр

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

void func(int* xptr, int* yptr, int flag) {
    if(flag==1) {
        *xptr=0;
        *yptr=1;
    }
    else {
        *xptr=1;
        *yptr=0;
    }
}

int main() {
    int x,y;
    func(&x,&y,1);
    return 0;
}
Исправление - явно указать неиспользуемый параметр

Другой возможной поправкой является явное указание на то, что вы знаете о неиспользуемом параметре.

#define UNUSED(x) (void)x

void func(int* xptr, int* yptr, int flag) {
    UNUSED(yptr);
    if(flag==1) {
        *xptr=0;
    }
    else {
        *xptr=1;
    }
}

int main() {
    int x,y;
    func(&x,&y,1);
    return 0;
}
Проблема

Запись без дальнейшего чтения происходит, когда значение, назначенное переменной, никогда не читается.

Например, вы записываете значение в переменную, а затем записываете второе значение перед прочтением предыдущего значения. Первая операция записи является избыточной.

Риск

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

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

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

Если определено, что операция записи является избыточной, удалите операцию.

Пример - Запись без дополнительной ошибки чтения
void sensor_amplification(void)
{
    extern int getsensor(void);
    int level;

    level = 4 * getsensor();            
    /* Defect: Useless write */
}

После переменной level получает назначенное значение 4 * getsensor(), он не читается.

Коррекция - использовать значение после присвоения

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

#include <stdio.h>

void sensor_amplification(void)
{
    extern int getsensor(void);
    int level;

    level = 4 * getsensor(); 
    
    /* Fix: Use level after assignment */
    printf("The value is %d", level);
    
}

Переменная level распечатывается, читая новое значение.

Проверить информацию

Группа: Rec. 48. Разное (MSC)
Представлен в R2019a

[1] Данное программное обеспечение было создано компанией MathWorks и включает в себя следующие компоненты: «Веб-сайт SEI CERT-C», © 2017 Университет Карнеги-Меллон, веб-сайт SEI CERT-C + + © 2017 Университет Карнеги-Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги-Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ МЕЛЛОНА И/ИЛИ ЕГО ПРОГРАММНОГО ИНЖЕНЕРНОГО ИНСТИТУТА, СОДЕРЖАЩИЙСЯ В НАСТОЯЩЕМ ДОКУМЕНТЕ, ПОСТАВЛЯЕТСЯ КАК ЕСТЬ. УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ, ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, В ОТНОШЕНИИ ЛЮБЫХ ВОПРОСОВ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИИ ПРИГОДНОСТИ ДЛЯ ЦЕЛЕЙ ИЛИ ТОВАРНОЙ ПРИГОДНОСТИ, ИСКЛЮЧИТЕЛЬНОСТИ ИЛИ РЕЗУЛЬТАТОВ, ПОЛУЧЕННЫХ ОТ ИСПОЛЬЗОВАНИЯ УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ В ОТНОШЕНИИ СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКИХ ПРАВ.

Данное программное обеспечение и связанная с ним документация не были рассмотрены и не одобрены Университетом Карнеги-Меллона или его Институтом разработки программного обеспечения.