Совместимость типа указателя на функцию C
Создавая библиотеку, которая работает с обратными вызовами функций, я часто приводил (и вызывал) указатели на типы функций к типам с одинаковым соглашением о вызовах и одинаковыми сигнатурами, но с одним исключением: у них были параметры, указывающие на разные типы (все данные), или пустые указатели.
Недавно я обнаружил, что это может быть не так безопасно, согласно этому: /questions/48053841/privedenie-ukazatelya-na-funktsiyu-drugogo-tipa/48053879#48053879
В принципе, как я понял, если типы аргументов совместимы, это означает, что типы указателей на функции также совместимы, и не должно быть никаких проблем.
Теперь у меня есть 3 вопроса.
Первый: означает ли это, что, поскольку указатели на разные типы технически несовместимы, то, что я делаю, может вызвать неопределенное поведение?
Второе: где (на каких архитектурах) мне это сойдет с рук? Версии Windows x86 или x64 среди них?
Третье: где я не могу сойти с рук?
1 ответ
- Да, это UB само по себе
- Вы, вероятно, можете избежать неприятностей в неоптимизированных сборках без отладки. Оптимизатор может использовать преимущества типов указателей, чтобы выяснить, могут ли два указателя иметь псевдонимы, что может привести к сбою, если вы лжете о реальных типах. Конечно, отладочные сборки могут просто проверять наличие несоответствия типов.
- Windows не является компилятором, так что это не разумный вопрос как есть. Обычные компиляторы Windows оптимизируют сборку, и ICC, в частности, как известно, имеет расширенную оптимизацию.