Рубрики

CRASH () макрос — интерпретация

Ниже приведен небольшой фрагмент кода из проекта с открытым исходным кодом,

#ifndef __cplusplus

  

typedef enum BoolenTag

{

   false,

   true

} bool;

  
#endif

  
#define CRASH() do { \

      ((void(*)())0)(); \

   } while(false)

  

int main()

{

   CRASH();

   return 0;

}

Можете ли вы интерпретировать код выше?

Это просто, пошаговый подход приведен ниже,

Утверждение while (false) предназначено только для целей тестирования. Рассмотрим следующую операцию,

((void(*)())0)();

Это может быть достигнуто следующим образом,

0;                      /* literal zero */
(0); ( ()0 );                /* 0 being casted to some type */
( (*) 0 );              /* 0 casted some pointer type */
( (*)() 0 );            /* 0 casted as pointer to some function */
( void (*)(void) 0 );   /* Interpret 0 as address of function 
 taking nothing and returning nothing */
( void (*)(void) 0 )(); /* Invoke the function */

Таким образом, данный код вызывает функцию, код которой хранится в нулевом местоположении, другими словами, пытается выполнить инструкцию, сохраненную в нулевом местоположении. В системах с защитой памяти (MMU) ОС будет выдавать исключение (ошибка сегментации), а в системах без такой защиты (небольшие встроенные системы) она будет выполняться, и ошибка будет распространяться дальше.

Венки . Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

CRASH () макрос — интерпретация

0.00 (0%) 0 votes