Я натолкнулся на фрагмент кода в проекте, который я оцениваю, и хотел узнать, безопасен ли следующий приведенный код:
void func(unsigned long* input);
...
int data = 42;
func(reinterpret_cast<unsigned long*>(&data));
// Casting to remove compiler warnings about data type not matching type expected
Я знаю, что с помощью простого приведения в стиле C (то есть: (unsigned long*)&data
) что это напрашивается на неприятности. Есть ли reinterpret_cast
автоматически ли этот тип литья работать безопасно?
Спасибо.
Нет, это не безопасно: поведение программы не определено.
Это потому, что типы указателей не связаны.
Любое приведение в стиле C интерпретируется как конкретное приведение в стиле C ++. В ролях в стиле C (unsigned long*)&data
действительно означает reinterpret_cast<unsigned long*>(&data)
, Один из них не может быть в безопасности, когда другой небезопасен.
И ты прав, это небезопасно. Строго говоря, проблема, как правило, не в актерском составе, хотя это может быть. Сам актерский состав — только проблема, если data
неправильно выровнен для unsigned long
, На самом деле проблема заключается в последующем доступе через неправильный тип. Вы не показываете этот доступ в своем вопросе, но если func
просто бросает input
вернуться к int *
или char *
это будет проблемой. И если func
действительно отбрасывает его обратно таким образом, тогда он должен быть просто объявлен, чтобы принять правильный тип.