В Си абсолютно ничего. Это просто клей компилятора, чтобы помешать вам сделать что-то глупое. В C вызывающая сторона отвечает за поддержание фрейма стека, поэтому приведение необходимо при вызове функции (то есть аргументы и возвращаемое значение помещаются в стек). Это делает его безопасным (r), так как стек вызывающей стороны вряд ли будет изменен неправильно. Однако в некоторых редких случаях вызываемая функция все еще может испортить стек вызывающей программы.
Я должен уточнить, что присвоение копирует указатель функции. Но в C все указатели на функции являются просто указателями. Тип и отливка - все это клей компилятора.
Еще одно уточнение: Стандарт указывает (в 6.5.2.2), что поведение не определено, если вызывающая сторона использует несовместимые типы. Например, приведение функции, которая возвращает void, к функции, которая возвращает int, и затем вызов этой функции, возвращаемое значение не имеет смысла. Перед вызовом функции рекомендуется преобразовать функцию в совместимый тип, иначе вы можете получить неожиданные результаты.