casting — Безопасность reinterpret_cast для указателей на примитивы

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

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 автоматически ли этот тип литья работать безопасно?

Спасибо.

1

Решение

Нет, это не безопасно: поведение программы не определено.

Это потому, что типы указателей не связаны.

4

Другие решения

Любое приведение в стиле C интерпретируется как конкретное приведение в стиле C ++. В ролях в стиле C (unsigned long*)&data действительно означает reinterpret_cast<unsigned long*>(&data), Один из них не может быть в безопасности, когда другой небезопасен.

И ты прав, это небезопасно. Строго говоря, проблема, как правило, не в актерском составе, хотя это может быть. Сам актерский состав — только проблема, если data неправильно выровнен для unsigned long, На самом деле проблема заключается в последующем доступе через неправильный тип. Вы не показываете этот доступ в своем вопросе, но если func просто бросает input вернуться к int *или char *это будет проблемой. И если func действительно отбрасывает его обратно таким образом, тогда он должен быть просто объявлен, чтобы принять правильный тип.

2

По вопросам рекламы [email protected]