It's too constrained to statically-analyze the whole program to determine required stack size. You can't have calls via function pointers (even virtual calls), can't call thirdparty code without sources available, can't call any code from a shared library (since analyzing it is impossible). This may work only in very constrained environments, like in embedded world.
Mostly.
Analyzing a shared library is possible. All you need is call graph and stack depth.
If function pointers are type constrained, the set of callable functions is finite.