Подтвердить что ты не робот

Как использовать noreturn с указателем функции?

Я пишу загрузчик в C11. Когда загрузчику необходимо перенести элемент управления на прошивку, он считывает указатель на определенный предопределенный адрес памяти и вызывает его. Код выглядит следующим образом:

typedef void (FirmwareBootFn)(void);

typedef struct
{
    uint32_t stackPointer;
    FirmwareBootFn* programCounter;
}
FirmwareBootControl;

static FirmwareBootControl g_bootControl __attribute__ ((section (".boot_control")));

void
Firmware_boot( void )
{
    setStackPointer( g_bootControl.stackPointer );
    g_bootControl.programCounter();
}

Функция Firmware_boot() никогда не возвращается, поэтому имеет смысл объявить ее как noreturn:

#include <stdnoreturn.h>

noreturn void
Firmware_boot( void );

Но мне нужно объявить FirmwareBootFn как noreturn, чтобы избежать компилятора, жалующегося на то, что Firmware_boot() может вернуться.

Я попробовал (возможно) каждую перестановку noreturn в typedef без какого-либо результата. Также я понял, что атрибут не может быть установлен в typedef, потому что он не является частью этого типа.

Есть ли способ пометить мой Firmware_boot() как noreturn, избегая предупреждения (ну без обмана с предупреждением: -))?

4b9b3361

Ответ 1

_Noreturn в C11 может применяться только к определениям функций или декларациям. Тот факт, что функция не возвращается, к сожалению, не является частью прототипа.

Поскольку у вас, похоже, есть gcc, вы можете использовать расширение

typedef struct
{
    uint32_t stackPointer;
    __attribute__((__noreturn__)) FirmwareBootFn* programCounter;
}
FirmwareBootControl;

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