MISRA C:2012 Rule 1.4

Функции Emergent Language не должны использоваться

Описание

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

Новые языковые функции не должны использоваться.

Объяснение

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

Реализация Polyspace

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

  • The _Generic оператор.

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

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

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

  • The _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 может использоваться (в соответствии с приложением K к C11 стандарту).

Шашка помечает как настройку макроса равную 1, так и определение errno_t переменная, наряду с другими функциями приложения K.

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

Группа: Стандартное окружение C
Категория: Требуемая
Категория AGC: Требуется
Введенный в R2014b