CERT C: Rec. MSC15-C

Не зависьте от неопределенного поведения

Описание

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

Не зависьте от неопределенного поведения.[1]

Реализация Polyspace

Это средство проверки проверяет на Неопределенное поведение.

Примеры

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

Проблема

Проблема происходит, когда анализ обнаруживает неопределенное или критическое незаданное поведение. А именно, Polyspace® флаги эти экземпляры неопределенного или критического неопределенного поведения:

  • Использование offsetof на битовых полях.

  • Использование offsetof когда вторым аргументом не является struct поле первого аргумента.

  • Использование defined без идентификатора.

  • Использование массива неполных типов.

  • Использование функции как макросы при помощи неправильного количества аргументов.

Риск

Код С, который приводит к неопределенному или критическому незаданному поведению, может привести к неожиданным или неправильным результатам. Такой код может вести себя по-другому в различных реализациях. Проблемы, вызванные неопределенным поведением в коде, могут затруднить, чтобы анализировать, потому что компиляторы могут оптимизировать код, принимающий, что неопределенное поведение не происходит.

Исправление

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

Пример — избегает неопределенных поведений
#include <stddef.h>     /* offsetof */

struct str {
  char a:8;
  char b[10];
  char c;
};
void foo() {
  
  offsetof(struct str, a);//Noncompliant
  offsetof(struct str, d);//Noncompliant
}

В этом примере, функциональном foo использует макро-offsetof на битовом поле str.a. Это поведение не определено. Polyspace отмечает его. Функция затем вызывает offsetof на str.d. Поскольку d не поле str, Polyspace отмечает его. Эти проблемы могут вызвать ошибки компиляции.

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

Группа: 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". УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИЙ НИКАКОГО ВИДА, ИЛИ ОПИСАЛ ИЛИ ПОДРАЗУМЕВАЛ, ОТНОСИТЕЛЬНО ЛЮБОГО ВОПРОСА ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИЛ, ГАРАНТИЯ ПРИГОДНОСТИ ДЛЯ ЦЕЛИ ИЛИ ВЫСОКОГО СПРОСА, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ ЗАКАНЧИВАЕТСЯ ПОЛУЧЕННЫЙ ИЗ ИСПОЛЬЗОВАНИЯ МАТЕРИАЛА. УНИВЕРСИТЕТ КАРНЕГИ-МЕЛЛОН НЕ ДАЕТ ГАРАНТИИ НИКАКОГО ВИДА ОТНОСИТЕЛЬНО СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКОГО ПРАВА.

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