CERT C: Rec. MSC13-C

Обнаружьте и удалите неиспользованные значения

Описание

Управляйте определением

Обнаружьте и удалите неиспользованный values.[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 Carnegie Mellon University, веб-сайт SEI CERT-C © 2017 Carnegie Mellon University”, CERT SEI C Кодирование Стандарта – Правил для Разработки безопасных, Надежных и Защищенных систем – 2 016 Выпусков”, © 2016 Carnegie Mellon University, and “CERT SEI Стандарт Кодирования C++ – Правил для Разработки безопасных, Надежных и Защищенных систем на C++ – 2 016 Выпусков” © 2016 Carnegie Mellon University, со специальным разрешением от его Института программной инженерии.

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

Это программное обеспечение и сопоставленная документация не были рассмотрены, ни являются подтвержденным Университетом Карнеги-Меллон или его Институтом программной инженерии.