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 Университет Карнеги Меллон, с специального разрешения от его Института программной инженерии.

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

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