exponenta event banner

MISRA C:2012 Правило 1.4

Исключительные языковые особенности не должны использоваться

Описание

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

Исключительные языковые особенности не должны использоваться.

Объяснение

Некоторые новые языковые функции в C11 Standard имеют неопределенное, неопределенное или определяемое реализацией поведение. Эти функции также могут демонстрировать четко определенное поведение, которое противоречит ожиданиям разработчиков. Несмотря на то, что правило 1.3 и директива 1.1 запрещают неопределенное и определяемое реализацией поведение, во избежание четко определенного поведения, которое противоречит ожиданиям, некоторые языковые особенности суммарно не поощряются с помощью правила 1.4.

Внедрение Polyspace

Правило запрещает использование следующих языковых функций:

  • _Generic оператор.

  • _Noreturn спецификатор функции и <stdnoreturn.h> файл заголовка

  • _Atomic спецификатор типа и средства, предоставляемые <stdatomic.h> (например, макросы, начинающиеся с ATOMIC_ и функции, начинающиеся с atomic_ реализовано как макросы в <stdatomic.h>).

  • _Thread_local спецификатор класса хранения и средства, предоставляемые <threads.h> (например, такие типы, как thrd_t и такие функции, как thrd_create).

  • _Alignas спецификатор выравнивания, _Alignof оператор и <stdalign.h> заголовочный файл и имеющиеся в нем средства (такие как alignas и alignof макросы).

  • Все объекты в Приложении K к Стандарту C11 о «интерфейсах проверки границ», кроме определения __STDC_WANT_LIB_EXT1__ в «0»

Поиск неисправностей

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

Примеры

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

#define __STDC_WANT_LIB_EXT1__ 1 //Noncompliant
#include <string.h>

void Copying_functions(void) {
    char buf1[10];
    char buf2[10];
    errno_t e;  //Noncompliant
    e = memcpy_s(buf1,sizeof(buf1),buf2,5); //Noncompliant
    e = memmove_s(buf1,sizeof(buf1),buf2,5); //Noncompliant
    e = strcpy_s(buf1,sizeof(buf1),buf2); //Noncompliant
    e = strncpy_s(buf1,sizeof(buf1),buf2,5); //Noncompliant
}

В этом примере макрос __STDC_WANT_LIB_EXT1__ имеет значение 1, чтобы тип errno_t как определено в заголовке stdlib.h может использоваться (в соответствии с приложением К к стандарту C11).

Средство проверки помечает как значение макроса 1, так и определение errno_t переменная, а также другие функции из приложения К.

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

Группа: Стандартная среда C
Категория: Обязательно
Категория СМЖЛ: требуется
Представлен в R2014b