CERT C: Rule EXP30-C

Не зависьте от порядка оценки для побочных эффектов

Описание

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

Не зависьте от порядка оценки для побочных эффектов.[1]

Реализация Polyspace

Это средство проверки проверки на значение Выражения зависит от порядка оценки или побочных эффектов.

Примеры

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

Проблема

Проблема происходит, когда значение выражения и его персистентных побочных эффектов различное согласно всем разрешенным порядкам оценки.

Выражение может иметь различные значения при следующих условиях:

  • Та же переменная изменяется несколько раз в выражении, или и считана и записана.

  • Выражение позволяет больше чем один порядок оценки.

  • Выражение содержит один volatile объект, который происходит многократно.

  • Выражение содержит больше чем один volatile объект.

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

Риск

Если выражение приводит к различным значениям в зависимости от порядка оценки, ее значение становится заданным реализацией.

Пример - переменная, модифицированная несколько раз в выражении
int a[10], b[10];
#define COPY_ELEMENT(index) (a[(index)]=b[(index)])

void main () {
    int i=0, k=0;

    COPY_ELEMENT (k);         /* Compliant */
    COPY_ELEMENT (i++);       /* Noncompliant  */
}

В этом примере правило нарушено оператором COPY_ELEMENT(i++) потому что i++ происходит дважды, и порядок оценки этих двух выражений не задан.

Пример - переменная, модифицированная и используемая в нескольких аргументах функции
void f (unsigned int param1, unsigned int param2) {}

void main () {
    unsigned int i=0;
    f ( i++, i );                 /* Non-compliant */ 
}

В этом примере нарушено правило, потому что это не задано ли операция i++ происходит прежде или после того, как второй аргумент передается f. Вызов f(i++,i) может перевести в любой f(0,0) или f(0,1).

Несколько volatile Объекты в выражении
volatile int a, b;
int mathOp(int x, int y);

int foo(void){
	int temp = mathOp(5,a) + mathOp(6,b);//Noncompliant
	return temp * mathOp(a,a);//Noncompliant
}

В этом примере это правило нарушено дважды.

  • Объявление temp использование два volatile объекты в выражении. Поскольку значение volatile объекты могут измениться в любое время, выражение может оценить к различным значениям в зависимости от порядка оценки. Polyspace® отмечает второй volatile объект в выражении.

  • return оператор использует тот же volatile возразите дважды. Поскольку выражение может иметь различные результаты в зависимости от порядка оценки, Polyspace повышает этот дефект.

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

Группа: правило 03. Выражения (EXP)
Введенный в 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". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ОПИСАЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

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