Если статически можно подтвердить, что код не имеет прямой или косвенной рекурсии, статический анализ может привести к использованию стека в худшем случае.Убедитесь, что стек достаточно большой и не будет переполнения стека.Самая большая трудность заключается в том, что может быть трудно определить, какие функции могут вызываться указателями каких функций.Например, если один указатель функции может указывать на foo1 () или foo2 (), другой может указывать на bar1 () или bar2 (), а foo1 () вызывает второй указатель функции (таким образом, достигая bar1 или bar2), не будетвозможность рекурсии, но если компилятор не может определить, что второй указатель может указывать только на bar1 () или bar2 (), он может не знать об этом.
Если приложение может быть определено как нерекурсивноеи если граф вызовов наихудшего случая статического анализа не намного хуже, чем то, что на самом деле может произойти, возможно, удастся полностью избежать стека и статически распределить все переменные.В некоторых случаях (особенно на архитектурах без эффективной индексации) этот подход может существенно повысить производительность по сравнению с использованием стека.
С точки зрения безопасности, хорошим средством предотвращения эксплойтов с переполнением стека / буфера является предотвращение сохранения реальной программы.-счетчик адресов в любом месте, к которому могут обращаться «нормальные» указатели.Храните стек счетчиков программ отдельно от стека параметров / авто-переменных и не храните указатели на функции напрямую.Вместо этого пусть каждый «указатель на функцию» будет индексом в таблице функций, имеющих одинаковую сигнатуру, и проверьте индекс, чтобы убедиться, что он находится в диапазоне перед его использованием;если две или более группы функций имеют разные последствия для безопасности и должны вызываться совершенно разными указателями, при необходимости измените сигнатуру одной группы, чтобы она отличалась от другой (поэтому вызовы функции в первой группе не могут бытьпреобразуется в вызов функции во втором).