How does the compiler achieve the CRT remapping?
-
We've noticed that calling C functions such as abs() will call into the C Runtime implementation of abs() for a Debug build but will call into System::Math::Abs in a Release build. This was pretty unexpected as the substitution of System::Math::Abs will trigger .NET exceptions such as System::OverflowException for out of bounds conditions whereas the CRT will always return a value. For example, this will crash in Release but exit normally in Debug. Yes, it's UB so anything is possible but it also calls System::Math::Abs even if the args are normal values. This just illustrates the exception vs non-exception.
#include
#includeint main(int, char**)
{
return std::abs(INT_MIN);
}Does anyone have any links or good search terms for this C Runtime substitution behavior they're doing? ex. Does the loader redirect calls into System:: entrypoints for things besides abs()? I'd like to see that list so I know which calls may need to be guarded with try/catch. I can understand that they do this swap for performance purposes and to avoid extra managed->native->managed transitions but it was news to me that this was ocurring. John