Как использовать 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
, избегая предупреждения (ну без обмана с предупреждением: -))?
Ответы
Ответ 1
_Noreturn
в C11 может применяться только к определениям функций или декларациям. Тот факт, что функция не возвращается, к сожалению, не является частью прототипа.
Поскольку у вас, похоже, есть gcc, вы можете использовать расширение
typedef struct
{
uint32_t stackPointer;
__attribute__((__noreturn__)) FirmwareBootFn* programCounter;
}
FirmwareBootControl;
чтобы отметить указатель функции как не возвращаемый. К сожалению, хотя, похоже, нет способа гарантировать, что функция, которую вы назначаете для этого, действительно имеет это свойство по синтаксису allone.