Совместимость типа указателя на функцию C

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

Недавно я обнаружил, что это может быть не так безопасно, согласно этому: /questions/48053841/privedenie-ukazatelya-na-funktsiyu-drugogo-tipa/48053879#48053879

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

Теперь у меня есть 3 вопроса.

Первый: означает ли это, что, поскольку указатели на разные типы технически несовместимы, то, что я делаю, может вызвать неопределенное поведение?

Второе: где (на каких архитектурах) мне это сойдет с рук? Версии Windows x86 или x64 среди них?

Третье: где я не могу сойти с рук?

1 ответ

Решение
  1. Да, это UB само по себе
  2. Вы, вероятно, можете избежать неприятностей в неоптимизированных сборках без отладки. Оптимизатор может использовать преимущества типов указателей, чтобы выяснить, могут ли два указателя иметь псевдонимы, что может привести к сбою, если вы лжете о реальных типах. Конечно, отладочные сборки могут просто проверять наличие несоответствия типов.
  3. Windows не является компилятором, так что это не разумный вопрос как есть. Обычные компиляторы Windows оптимизируют сборку, и ICC, в частности, как известно, имеет расширенную оптимизацию.
Другие вопросы по тегам