// Copyright Epic Games, Inc. All Rights Reserved. #if (defined(__AUTORTFM) && __AUTORTFM) #include "AutoRTFM.h" #include "BuildMacros.h" #include "ContextInlines.h" #include "Memcpy.h" #include "Utils.h" #include #include #include #include // note: introduces additional math overloads #include #include #include #include #include #ifdef __APPLE__ #include #else #include #endif #if AUTORTFM_PLATFORM_WINDOWS #include "WindowsHeader.h" #endif #if AUTORTFM_PLATFORM_LINUX #include #include #include #include #endif #if __has_include() # include # if defined(__SANITIZE_ADDRESS__) # define AUTORTFM_ASAN_ENABLED 1 # elif defined(__has_feature) # if __has_feature(address_sanitizer) # define AUTORTFM_ASAN_ENABLED 1 # endif # endif #endif #ifndef AUTORTFM_ASAN_ENABLED #define AUTORTFM_ASAN_ENABLED 0 #endif #ifdef _MSC_VER // BEGIN: Disable warning about deprecated STD C functions. #pragma warning(push) #pragma warning(disable : 4996) #endif namespace AutoRTFM { namespace { // A helper that opens a FILE to "/dev/null" on first call to Get() // and automatically closes the file on static destruction. class FNullFile { public: static FILE* Get() { static FNullFile Instance; return Instance.File; } private: FNullFile() : File(fopen("/dev/null", "wb")) {} ~FNullFile() { fclose(File); } FILE* const File; }; void ThrowErrorFormatContainsPercentN() { AUTORTFM_WARN("AutoRTFM does not support format strings containing '%%n'"); FContext* Context = FContext::Get(); Context->AbortByLanguageAndThrow(); } // Throws an error if the format string contains a '%n'. static void ThrowIfFormatContainsPercentN(const char* Format) { for (const char* P = Format; *P != '\0'; ++P) { if (*P == '%') { switch (*++P) { case 'n': ThrowErrorFormatContainsPercentN(); break; case '\0': return; } } } } // Throws an error if the format string contains a '%n'. static void ThrowIfFormatContainsPercentN(const wchar_t* Format) { for (const wchar_t* P = Format; *P != L'\0'; ++P) { if (*P == L'%') { switch (*++P) { case L'n': ThrowErrorFormatContainsPercentN(); break; case L'\0': return; } } } } #if AUTORTFM_PLATFORM_WINDOWS // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv AUTORTFM_PLATFORM_WINDOWS vvvvvvvvvvvvvvvvvvvvvvvvvvvvv template RETURN RTFM_StringToFloat(const CHAR* String, CHAR** EndPtr, _locale_t Locale) { if (nullptr != EndPtr) { AutoRTFM::RecordOpenWrite(EndPtr); } return FN(String, EndPtr, Locale); } template RETURN RTFM_StringToIntNoLocale(const CHAR* String, CHAR** EndPtr, int Radix) { if (nullptr != EndPtr) { AutoRTFM::RecordOpenWrite(EndPtr); } return FN(String, EndPtr, Radix); } template RETURN RTFM_StringToInt(const CHAR* String, CHAR** EndPtr, int Radix, _locale_t Locale) { if (nullptr != EndPtr) { AutoRTFM::RecordOpenWrite(EndPtr); } return FN(String, EndPtr, Radix, Locale); } FILE* RTFM___acrt_iob_func(unsigned Index) { switch (Index) { case 1: case 2: return __acrt_iob_func(Index); default: { AUTORTFM_WARN("Attempt to get file descriptor %d (not 1 or 2) in __acrt_iob_func.", Index); FContext* Context = FContext::Get(); Context->AbortByLanguageAndThrow(); return NULL; } } } // FIXME: Does not currently support %n format specifiers. int RTFM___stdio_common_vfprintf( unsigned __int64 Options, FILE* Stream, char const* Format, _locale_t Locale, va_list ArgList) { ThrowIfFormatContainsPercentN(Format); return __stdio_common_vfprintf(Options, Stream, Format, Locale, ArgList); } // FIXME: Does not currently support %n format specifiers. int RTFM___stdio_common_vsprintf( unsigned __int64 Options, char* Buffer, size_t BufferCount, char const* Format, _locale_t Locale, va_list ArgList) { ThrowIfFormatContainsPercentN(Format); if (nullptr != Buffer && 0 != BufferCount) { va_list ArgList2; va_copy(ArgList2, ArgList); int Count = __stdio_common_vsprintf(Options, nullptr, 0, Format, Locale, ArgList2); va_end(ArgList2); if (Count >= 0) { size_t NumBytes = std::min(BufferCount, static_cast(1 + Count)) * sizeof(char); FContext* Context = FContext::Get(); Context->RecordWrite(Buffer, NumBytes); } } return __stdio_common_vsprintf(Options, Buffer, BufferCount, Format, Locale, ArgList); } // FIXME: Does not currently support %n format specifiers. int RTFM___stdio_common_vswprintf( unsigned __int64 Options, wchar_t* Buffer, size_t BufferCount, wchar_t const* Format, _locale_t Locale, va_list ArgList) { ThrowIfFormatContainsPercentN(Format); if (nullptr != Buffer && 0 != BufferCount) { va_list ArgList2; va_copy(ArgList2, ArgList); int Count = __stdio_common_vswprintf(Options, nullptr, 0, Format, Locale, ArgList2); va_end(ArgList2); if (Count >= 0) { size_t NumBytes = std::min(BufferCount, static_cast(1 + Count)) * sizeof(wchar_t); FContext* Context = FContext::Get(); Context->RecordWrite(Buffer, NumBytes); } } return __stdio_common_vswprintf(Options, Buffer, BufferCount, Format, Locale, ArgList); } // FIXME: Does not currently support %n format specifiers. int RTFM___stdio_common_vfwprintf( unsigned __int64 Options, FILE* Stream, wchar_t const* Format, _locale_t Locale, va_list ArgList) { ThrowIfFormatContainsPercentN(Format); return __stdio_common_vfwprintf(Options, Stream, Format, Locale, ArgList); } BOOL RTFM_TlsSetValue(DWORD dwTlsIndex, LPVOID lpTlsValue) { LPVOID CurrentValue = TlsGetValue(dwTlsIndex); AutoRTFM::OnAbort([dwTlsIndex, CurrentValue] { TlsSetValue(dwTlsIndex, CurrentValue); }); return TlsSetValue(dwTlsIndex, lpTlsValue); } // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AUTORTFM_PLATFORM_WINDOWS ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #else // vvvvvvvvvvvvvvvvvvvvvvvvvvvvv !AUTORTFM_PLATFORM_WINDOWS vvvvvvvvvvvvvvvvvvvvvvvvvvvvv extern "C" size_t _ZNSt3__112__next_primeEm(size_t N) __attribute__((weak)); // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ !AUTORTFM_PLATFORM_WINDOWS ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #endif #if AUTORTFM_PLATFORM_LINUX // vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv AUTORTFM_PLATFORM_LINUX vvvvvvvvvvvvvvvvvvvvvvvvvvvvvv int RTFM_stat(const char* Path, struct stat* StatBuf) throw() { FContext* Context = FContext::Get(); Context->RecordWrite(StatBuf, sizeof(*StatBuf)); return stat(Path, StatBuf); } int RTFM_fstat(int Fd, struct stat* StatBuf) throw() { FContext* Context = FContext::Get(); Context->RecordWrite(StatBuf, sizeof(*StatBuf)); return fstat(Fd, StatBuf); } int RTFM___xstat(int Ver, const char* Path, struct stat* StatBuf) throw() { FContext* Context = FContext::Get(); Context->RecordWrite(StatBuf, sizeof(*StatBuf)); return __xstat(Ver, Path, StatBuf); } int RTFM___fxstat(int Ver, int Fd, struct stat* StatBuf) throw() { FContext* Context = FContext::Get(); Context->RecordWrite(StatBuf, sizeof(*StatBuf)); return __fxstat(Ver, Fd, StatBuf); } // ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ AUTORTFM_PLATFORM_LINUX ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ #endif void* RTFM_memcpy(void* Dst, const void* Src, size_t Size) throw() { return Memcpy(Dst, Src, Size, FContext::Get()); } void* RTFM_memmove(void* Dst, const void* Src, size_t Size) throw() { return Memmove(Dst, Src, Size, FContext::Get()); } void* RTFM_memset(void* Dst, int Value, size_t Size) throw() { return Memset(Dst, Value, Size, FContext::Get()); } void* RTFM_malloc(size_t Size) throw() { void* Result = malloc(Size); FContext* Context = FContext::Get(); Context->GetCurrentTransaction()->DeferUntilAbort([Result] { free(Result); }); Context->DidAllocate(Result, Size); return Result; } void* RTFM_calloc(size_t Count, size_t Size) throw() { void* Result = calloc(Count, Size); FContext* Context = FContext::Get(); Context->GetCurrentTransaction()->DeferUntilAbort([Result] { free(Result); }); Context->DidAllocate(Result, Count * Size); return Result; } void RTFM_free(void* Ptr) throw() { if (Ptr) { FContext* Context = FContext::Get(); Context->GetCurrentTransaction()->DeferUntilCommit([Ptr] { free(Ptr); }); } } void* RTFM_realloc(void* Ptr, size_t Size) throw() { void* NewObject = RTFM_malloc(Size); if (Ptr) { #if defined(__APPLE__) const size_t OldSize = malloc_size(Ptr); #elif defined(_WIN32) const size_t OldSize = _msize(Ptr); #else const size_t OldSize = malloc_usable_size(Ptr); #endif FContext* Context = FContext::Get(); MemcpyToNew(NewObject, Ptr, std::min(OldSize, Size), Context); RTFM_free(Ptr); } return NewObject; } char* RTFM_strcpy(char* const Dst, const char* const Src) throw() { const size_t SrcLen = strlen(Src); FContext* Context = FContext::Get(); Context->RecordWrite(Dst, SrcLen + sizeof(char)); return strcpy(Dst, Src); } char* RTFM_strncpy(char* const Dst, const char* const Src, const size_t Num) throw() { FContext* Context = FContext::Get(); Context->RecordWrite(Dst, Num); return strncpy(Dst, Src, Num); } char* RTFM_strcat(char* const Dst, const char* const Src) throw() { const size_t DstLen = strlen(Dst); const size_t SrcLen = strlen(Src); FContext* Context = FContext::Get(); Context->RecordWrite(Dst + DstLen, SrcLen + 1); return strcat(Dst, Src); } char* RTFM_strncat(char* const Dst, const char* const Src, const size_t Num) throw() { const size_t DstLen = strlen(Dst); FContext* Context = FContext::Get(); Context->RecordWrite(Dst + DstLen, Num + 1); return strncat(Dst, Src, Num); } template RETURN RTFM_StringToFloat(const CHAR* String, CHAR** EndPtr) throw() { if (nullptr != EndPtr) { AutoRTFM::RecordOpenWrite(EndPtr); } return FN(String, EndPtr); } template RETURN RTFM_StringToInt(const CHAR* String, CHAR** EndPtr, int Radix) throw() { if (nullptr != EndPtr) { AutoRTFM::RecordOpenWrite(EndPtr); } return FN(String, EndPtr, Radix); } template std::to_chars_result RTFM_ToChars(char* First, char* Last, T Value) { AutoRTFM::RecordOpenWrite(First, Last - First); return FN(First, Last, Value); } template std::to_chars_result RTFM_ToChars(char* First, char* Last, T Value, int Base) { AutoRTFM::RecordOpenWrite(First, Last - First); return FN(First, Last, Value, Base); } template std::to_chars_result RTFM_ToChars(char* First, char* Last, T Value, std::chars_format Format) { AutoRTFM::RecordOpenWrite(First, Last - First); return FN(First, Last, Value, Format); } template std::to_chars_result RTFM_ToChars(char* First, char* Last, T Value, std::chars_format Format, int Precision) { AutoRTFM::RecordOpenWrite(First, Last - First); return FN(First, Last, Value, Format, Precision); } // FIXME: Does not currently support %n format specifiers. int RTFM_vsnprintf(char* Str, size_t Size, const char* Format, va_list ArgList) throw() { ThrowIfFormatContainsPercentN(Format); if (nullptr != Str && 0 != Size) { va_list ArgList2; va_copy(ArgList2, ArgList); int Count = vsnprintf(nullptr, 0, Format, ArgList2); va_end(ArgList2); if (Count >= 0) { size_t NumBytes = std::min(Size, static_cast(1 + Count)) * sizeof(char); FContext* Context = FContext::Get(); Context->RecordWrite(Str, NumBytes); } } return vsnprintf(Str, Size, Format, ArgList); } // FIXME: Does not currently support %n format specifiers. int RTFM_vswprintf(wchar_t* Str, size_t Size, const wchar_t* Format, va_list ArgList) { ThrowIfFormatContainsPercentN(Format); if (nullptr != Str && 0 != Size) { va_list ArgList2; va_copy(ArgList2, ArgList); #if AUTORTFM_PLATFORM_WINDOWS int Count = vswprintf(nullptr, 0, Format, ArgList2); #else // vswprintf(nullptr, 0, ...) will return -1. int Count = vfwprintf(FNullFile::Get(), Format, ArgList2); #endif va_end(ArgList2); size_t NumChars = std::min(Size, static_cast(1 + std::max(Count, 0))); size_t NumBytes = NumChars * sizeof(wchar_t); if (NumBytes >= 0) { FContext* Context = FContext::Get(); Context->RecordWrite(Str, NumBytes); } } return vswprintf(Str, Size, Format, ArgList); } // FIXME: Does not currently support %n format specifiers. int RTFM_swprintf(wchar_t* Buffer, size_t BufferCount, wchar_t const* Format, ...) { va_list ArgList; va_start(ArgList, Format); int Count = RTFM_vswprintf(Buffer, BufferCount, Format, ArgList); va_end(ArgList); return Count; } // FIXME: Does not currently support %n format specifiers. int RTFM_snprintf(char* Str, size_t Size, const char* Format, ...) throw() { va_list ArgList; va_start(ArgList, Format); int Count = RTFM_vsnprintf(Str, Size, Format, ArgList); va_end(ArgList); return Count; } // FIXME: Does not currently support %n format specifiers. int RTFM_printf(const char* Format, ...) { ThrowIfFormatContainsPercentN(Format); va_list ArgList; va_start(ArgList, Format); int Result = vprintf(Format, ArgList); va_end(ArgList); return Result; } // FIXME: Does not currently support %n format specifiers. int RTFM_wprintf(const wchar_t* Format, ...) { ThrowIfFormatContainsPercentN(Format); va_list ArgList; va_start(ArgList, Format); int Result = vwprintf(Format, ArgList); va_end(ArgList); return Result; } wchar_t* RTFM_wcscpy(wchar_t* Dst, const wchar_t* Src) throw() { const size_t SrcLen = wcslen(Src); FContext* Context = FContext::Get(); Context->RecordWrite(Dst, (SrcLen + 1) * sizeof(wchar_t)); return wcscpy(Dst, Src); } wchar_t* RTFM_wcsncpy(wchar_t* Dst, const wchar_t* Src, size_t Count) throw() { FContext* Context = FContext::Get(); Context->RecordWrite(Dst, Count * sizeof(wchar_t)); return wcsncpy(Dst, Src, Count); } int RTFM_atexit(void(*Callback)(void)) throw() { FContext* Context = FContext::Get(); Context->GetCurrentTransaction()->DeferUntilCommit([Callback] { atexit(Callback); }); return 0; } } // anonymous namespace //////////////////////////////////////////////////////////////////////////////// // Register all the open -> closed functions //////////////////////////////////////////////////////////////////////////////// #if AUTORTFM_PLATFORM_LINUX // LibCxx's string.h uses builtin string functions inside inline functions. // We can't take the address of these builtins, but we know they map to these C functions. extern "C" { char* strchr(const char*, int); char* strrchr(const char*, int); char* strstr(const char*, const char*); } #endif #if FORCE_ANSI_ALLOCATOR template UE_AUTORTFM_FORCEINLINE static void* RTFM_ClosedNew(OpenNewFn* New, OpenDeleteFn* Delete, unsigned long Size, ArgTys... Args) { void* Result = New(Size, Args...); FContext* Context = FContext::Get(); Context->GetCurrentTransaction()->DeferUntilAbort([=] { Delete(Result, Args...); }); Context->DidAllocate(Result, Size); return Result; } template UE_AUTORTFM_FORCEINLINE static void RTFM_ClosedDelete(OpenDeleteFn* Delete, void* Pointer, ArgTys... Args) { if (Pointer) { FContext* Context = FContext::Get(); Context->GetCurrentTransaction()->DeferUntilCommit([=] { Delete(Pointer, Args...); }); } } extern "C" { // Operator new and new[] void* _Znwm(unsigned long); void* _Znam(unsigned long); void* _ZnwmRKSt9nothrow_t(unsigned long, const std::nothrow_t&); void* _ZnamRKSt9nothrow_t(unsigned long, const std::nothrow_t&); void* _ZnwmSt11align_val_t(unsigned long, std::align_val_t); void* _ZnamSt11align_val_t(unsigned long, std::align_val_t); void* _ZnwmSt11align_val_tRKSt9nothrow_t(unsigned long, std::align_val_t, const std::nothrow_t&); void* _ZnamSt11align_val_tRKSt9nothrow_t(unsigned long, std::align_val_t, const std::nothrow_t&); // Operator delete and delete[] void _ZdlPv(void*); void _ZdaPv(void*); void _ZdlPvRKSt9nothrow_t(void*, const std::nothrow_t&); void _ZdaPvRKSt9nothrow_t(void*, const std::nothrow_t&); void _ZdlPvm(void*, unsigned long); void _ZdaPvm(void*, unsigned long); void _ZdlPvSt11align_val_t(void*, std::align_val_t); void _ZdaPvSt11align_val_t(void*, std::align_val_t); void _ZdlPvSt11align_val_tRKSt9nothrow_t(void*, std::align_val_t, const std::nothrow_t&); void _ZdaPvSt11align_val_tRKSt9nothrow_t(void*, std::align_val_t, const std::nothrow_t&); void _ZdlPvmSt11align_val_t(void*, unsigned long, std::align_val_t); void _ZdaPvmSt11align_val_t(void*, unsigned long, std::align_val_t); void* RTFM_Znwm(unsigned long Size) { return RTFM_ClosedNew(_Znwm, _ZdlPv, Size); } void* RTFM_Znam(unsigned long Size) { return RTFM_ClosedNew(_Znam, _ZdaPv, Size); } void* RTFM_ZnwmRKSt9nothrow_t(unsigned long Size, const std::nothrow_t& NoThrow) { return RTFM_ClosedNew(_ZnwmRKSt9nothrow_t, _ZdlPvRKSt9nothrow_t, Size, NoThrow); } void* RTFM_ZnamRKSt9nothrow_t(unsigned long Size, const std::nothrow_t& NoThrow) { return RTFM_ClosedNew(_ZnamRKSt9nothrow_t, _ZdaPvRKSt9nothrow_t, Size, NoThrow); } void* RTFM_ZnwmSt11align_val_t(unsigned long Size, std::align_val_t Align) { return RTFM_ClosedNew(_ZnwmSt11align_val_t, _ZdlPvSt11align_val_t, Size, Align); } void* RTFM_ZnamSt11align_val_t(unsigned long Size, std::align_val_t Align) { return RTFM_ClosedNew(_ZnamSt11align_val_t, _ZdaPvSt11align_val_t, Size, Align); } void* RTFM_ZnwmSt11align_val_tRKSt9nothrow_t(unsigned long Size, std::align_val_t Align, const std::nothrow_t& NoThrow) { return RTFM_ClosedNew(_ZnwmSt11align_val_tRKSt9nothrow_t, _ZdlPvSt11align_val_tRKSt9nothrow_t, Size, Align, NoThrow); } void* RTFM_ZnamSt11align_val_tRKSt9nothrow_t(unsigned long Size, std::align_val_t Align, const std::nothrow_t& NoThrow) { return RTFM_ClosedNew(_ZnamSt11align_val_tRKSt9nothrow_t, _ZdaPvSt11align_val_tRKSt9nothrow_t, Size, Align, NoThrow); } void RTFM_ZdlPv(void* Pointer) { RTFM_ClosedDelete(_ZdlPv, Pointer); } void RTFM_ZdaPv(void* Pointer) { RTFM_ClosedDelete(_ZdaPv, Pointer); } void RTFM_ZdlPvRKSt9nothrow_t(void* Pointer, const std::nothrow_t& NoThrow) { RTFM_ClosedDelete(_ZdlPvRKSt9nothrow_t, Pointer, NoThrow); } void RTFM_ZdaPvRKSt9nothrow_t(void* Pointer, const std::nothrow_t& NoThrow) { RTFM_ClosedDelete(_ZdaPvRKSt9nothrow_t, Pointer, NoThrow); } void RTFM_ZdlPvm(void* Pointer, unsigned long Size) { RTFM_ClosedDelete(_ZdlPvm, Pointer, Size); } void RTFM_ZdaPvm(void* Pointer, unsigned long Size) { RTFM_ClosedDelete(_ZdaPvm, Pointer, Size); } void RTFM_ZdlPvSt11align_val_t(void* Pointer, std::align_val_t Align) { RTFM_ClosedDelete(_ZdlPvSt11align_val_t, Pointer, Align); } void RTFM_ZdaPvSt11align_val_t(void* Pointer, std::align_val_t Align) { RTFM_ClosedDelete(_ZdaPvSt11align_val_t, Pointer, Align); } void RTFM_ZdlPvSt11align_val_tRKSt9nothrow_t(void* Pointer, std::align_val_t Align, const std::nothrow_t& NoThrow) { RTFM_ClosedDelete(_ZdlPvSt11align_val_tRKSt9nothrow_t, Pointer, Align, NoThrow); } void RTFM_ZdaPvSt11align_val_tRKSt9nothrow_t(void* Pointer, std::align_val_t Align, const std::nothrow_t& NoThrow) { RTFM_ClosedDelete(_ZdaPvSt11align_val_tRKSt9nothrow_t, Pointer, Align, NoThrow); } void RTFM_ZdlPvmSt11align_val_t(void* Pointer, unsigned long Size, std::align_val_t Align) { RTFM_ClosedDelete(_ZdlPvmSt11align_val_t, Pointer, Size, Align); } void RTFM_ZdaPvmSt11align_val_t(void* Pointer, unsigned long Size, std::align_val_t Align) { RTFM_ClosedDelete(_ZdaPvmSt11align_val_t, Pointer, Size, Align); } } #endif UE_AUTORTFM_REGISTER_OPEN_TO_CLOSED_FUNCTIONS( #if AUTORTFM_ASAN_ENABLED UE_AUTORTFM_MAP_OPEN_TO_SELF(__asan_addr_is_in_fake_stack), UE_AUTORTFM_MAP_OPEN_TO_SELF(__asan_get_current_fake_stack), UE_AUTORTFM_MAP_OPEN_TO_SELF(__asan_poison_memory_region), #endif #if AUTORTFM_PLATFORM_WINDOWS UE_AUTORTFM_MAP_OPEN_TO_CLOSED(_strtoi64, (RTFM_StringToIntNoLocale)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(_wcstoi64, (RTFM_StringToInt)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(_wcstoui64, (RTFM_StringToInt)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(_wcstod_l, (RTFM_StringToFloat)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(_wcstof_l, (RTFM_StringToFloat)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(_wcstold_l, (RTFM_StringToFloat)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(_wcstol_l, (RTFM_StringToInt)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(_wcstoll_l, (RTFM_StringToInt)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(_wcstoul_l, (RTFM_StringToInt)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(_wcstoull_l, (RTFM_StringToInt)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(_wcstoi64_l, (RTFM_StringToInt)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(_wcstoui64_l, (RTFM_StringToInt)), UE_AUTORTFM_MAP_OPEN_TO_SELF(_wtof), UE_AUTORTFM_MAP_OPEN_TO_SELF(_wtof), UE_AUTORTFM_MAP_OPEN_TO_SELF(_wtol), UE_AUTORTFM_MAP_OPEN_TO_SELF(_wtoll), UE_AUTORTFM_MAP_OPEN_TO_SELF(_wtoi), UE_AUTORTFM_MAP_OPEN_TO_SELF(_wtoi64), UE_AUTORTFM_MAP_OPEN_TO_SELF(_wtof_l), UE_AUTORTFM_MAP_OPEN_TO_SELF(_wtol_l), UE_AUTORTFM_MAP_OPEN_TO_SELF(_wtoll_l), UE_AUTORTFM_MAP_OPEN_TO_SELF(_wtoi_l), UE_AUTORTFM_MAP_OPEN_TO_SELF(_wtoi64_l), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(__acrt_iob_func, RTFM___acrt_iob_func), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(__stdio_common_vfprintf, RTFM___stdio_common_vfprintf), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(__stdio_common_vsprintf, RTFM___stdio_common_vsprintf), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(__stdio_common_vswprintf, RTFM___stdio_common_vswprintf), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(__stdio_common_vfwprintf, RTFM___stdio_common_vfwprintf), UE_AUTORTFM_MAP_OPEN_TO_SELF(_tcsncmp), UE_AUTORTFM_MAP_OPEN_TO_SELF(_tcslen), UE_AUTORTFM_MAP_OPEN_TO_SELF(_tcsnlen), UE_AUTORTFM_MAP_OPEN_TO_SELF(_isnan), UE_AUTORTFM_MAP_OPEN_TO_SELF(_fdtest), UE_AUTORTFM_MAP_OPEN_TO_SELF(_dtest), UE_AUTORTFM_MAP_OPEN_TO_SELF(_ldtest), UE_AUTORTFM_MAP_OPEN_TO_SELF(_finite), UE_AUTORTFM_MAP_OPEN_TO_SELF(IsDebuggerPresent), UE_AUTORTFM_MAP_OPEN_TO_SELF(GetSystemTime), UE_AUTORTFM_MAP_OPEN_TO_SELF(QueryPerformanceCounter), UE_AUTORTFM_MAP_OPEN_TO_SELF(QueryPerformanceFrequency), UE_AUTORTFM_MAP_OPEN_TO_SELF(GetCurrentThreadId), UE_AUTORTFM_MAP_OPEN_TO_SELF(GetCurrentProcessId), UE_AUTORTFM_MAP_OPEN_TO_SELF(TlsGetValue), UE_AUTORTFM_MAP_OPEN_TO_SELF(GetLocalTime), UE_AUTORTFM_MAP_OPEN_TO_SELF(GetFileAttributesW), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(TlsSetValue, RTFM_TlsSetValue), UE_AUTORTFM_MAP_OPEN_TO_SELF(_Query_perf_frequency), UE_AUTORTFM_MAP_OPEN_TO_SELF(_Query_perf_counter), #else UE_AUTORTFM_MAP_OPEN_TO_SELF(_ZNSt3__112__next_primeEm), #endif #if AUTORTFM_PLATFORM_LINUX UE_AUTORTFM_MAP_OPEN_TO_SELF(getpid), UE_AUTORTFM_MAP_OPEN_TO_SELF(clock_gettime), UE_AUTORTFM_MAP_OPEN_TO_SELF(gettimeofday), UE_AUTORTFM_MAP_OPEN_TO_SELF(gmtime_r), UE_AUTORTFM_MAP_OPEN_TO_SELF(localtime_r), UE_AUTORTFM_MAP_OPEN_TO_SELF(bcmp), UE_AUTORTFM_MAP_OPEN_TO_SELF(pthread_getspecific), UE_AUTORTFM_MAP_OPEN_TO_SELF(pthread_self), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(strtof32, (RTFM_StringToFloat)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(strtof64, (RTFM_StringToFloat)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(stat, RTFM_stat), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(fstat, RTFM_fstat), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(__xstat, RTFM___xstat), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(__fxstat, RTFM___fxstat), #endif // Linux requires mapping of the C functions, which do not use const on their return pointers. // See comment about LibCxx builtin functions above. #if AUTORTFM_PLATFORM_LINUX UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(char* (const char*, int), strchr), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(char* (const char*, int), strrchr), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(char* (const char*, const char*), strstr), #else UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(const char* (const char*, int), strchr), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(const char* (const char*, int), strrchr), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(const char* (const char*, const char*), strstr), #endif #if FORCE_ANSI_ALLOCATOR UE_AUTORTFM_MAP_OPEN_TO_CLOSED(_Znwm, RTFM_Znwm), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(_Znam, RTFM_Znam), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(_ZnwmRKSt9nothrow_t, RTFM_ZnwmRKSt9nothrow_t), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(_ZnamRKSt9nothrow_t, RTFM_ZnamRKSt9nothrow_t), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(_ZnwmSt11align_val_t, RTFM_ZnwmSt11align_val_t), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(_ZnamSt11align_val_t, RTFM_ZnamSt11align_val_t), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(_ZnwmSt11align_val_tRKSt9nothrow_t, RTFM_ZnwmSt11align_val_tRKSt9nothrow_t), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(_ZnamSt11align_val_tRKSt9nothrow_t, RTFM_ZnamSt11align_val_tRKSt9nothrow_t), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(_ZdlPv, RTFM_ZdlPv), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(_ZdaPv, RTFM_ZdaPv), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(_ZdlPvRKSt9nothrow_t, RTFM_ZdlPvRKSt9nothrow_t), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(_ZdaPvRKSt9nothrow_t, RTFM_ZdaPvRKSt9nothrow_t), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(_ZdlPvm, RTFM_ZdlPvm), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(_ZdaPvm, RTFM_ZdaPvm), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(_ZdlPvSt11align_val_t, RTFM_ZdlPvSt11align_val_t), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(_ZdaPvSt11align_val_t, RTFM_ZdaPvSt11align_val_t), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(_ZdlPvSt11align_val_tRKSt9nothrow_t, RTFM_ZdlPvSt11align_val_tRKSt9nothrow_t), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(_ZdaPvSt11align_val_tRKSt9nothrow_t, RTFM_ZdaPvSt11align_val_tRKSt9nothrow_t), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(_ZdlPvmSt11align_val_t, RTFM_ZdlPvmSt11align_val_t), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(_ZdaPvmSt11align_val_t, RTFM_ZdaPvmSt11align_val_t), #endif UE_AUTORTFM_MAP_OPEN_TO_CLOSED(memcpy, RTFM_memcpy), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(memmove, RTFM_memmove), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(memset, RTFM_memset), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(malloc, RTFM_malloc), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(calloc, RTFM_calloc), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(free, RTFM_free), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(realloc, RTFM_realloc), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(strcpy, RTFM_strcpy), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(strncpy, RTFM_strncpy), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(strcat, RTFM_strcat), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(strncat, RTFM_strncat), UE_AUTORTFM_MAP_OPEN_TO_SELF(memcmp), UE_AUTORTFM_MAP_OPEN_TO_SELF(strcmp), UE_AUTORTFM_MAP_OPEN_TO_SELF(strncmp), UE_AUTORTFM_MAP_OPEN_TO_SELF(strlen), UE_AUTORTFM_MAP_OPEN_TO_SELF(atof), UE_AUTORTFM_MAP_OPEN_TO_SELF(atoi), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(const wchar_t* (const wchar_t*, wchar_t), wcschr), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(wchar_t* (wchar_t*, wchar_t), wcschr), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(wchar_t* (wchar_t*, const wchar_t*), wcsstr), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(const wchar_t*(const wchar_t*, const wchar_t*), wcsstr), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(wchar_t*(wchar_t*, wchar_t), wcsrchr), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(const wchar_t*(const wchar_t*, wchar_t), wcsrchr), UE_AUTORTFM_MAP_OPEN_TO_SELF(wcscmp), UE_AUTORTFM_MAP_OPEN_TO_SELF(wcslen), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(strtol, (RTFM_StringToInt)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(strtoll, (RTFM_StringToInt)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(strtoul, (RTFM_StringToInt)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(strtoull, (RTFM_StringToInt)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(strtof, (RTFM_StringToFloat)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(strtod, (RTFM_StringToFloat)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(wcstod, (RTFM_StringToFloat)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(wcstof, (RTFM_StringToFloat)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(wcstold, (RTFM_StringToFloat)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(wcstol, (RTFM_StringToInt)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(wcstoll, (RTFM_StringToInt)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(wcstoul, (RTFM_StringToInt)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(wcstoull, (RTFM_StringToInt)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED_OVERLOADED( std::to_chars_result(char* First, char* Last, int Value, int Base), std::to_chars, (RTFM_ToChars)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED_OVERLOADED( std::to_chars_result(char* First, char* Last, unsigned int Value, int Base), std::to_chars, (RTFM_ToChars)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED_OVERLOADED( std::to_chars_result(char* First, char* Last, int8_t Value, int Base), std::to_chars, (RTFM_ToChars)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED_OVERLOADED( std::to_chars_result(char* First, char* Last, uint8_t Value, int Base), std::to_chars, (RTFM_ToChars)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED_OVERLOADED( std::to_chars_result(char* First, char* Last, int16_t Value, int Base), std::to_chars, (RTFM_ToChars)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED_OVERLOADED( std::to_chars_result(char* First, char* Last, uint16_t Value, int Base), std::to_chars, (RTFM_ToChars)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED_OVERLOADED( std::to_chars_result(char* First, char* Last, int32_t Value, int Base), std::to_chars, (RTFM_ToChars)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED_OVERLOADED( std::to_chars_result(char* First, char* Last, uint32_t Value, int Base), std::to_chars, (RTFM_ToChars)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED_OVERLOADED( std::to_chars_result(char* First, char* Last, int64_t Value, int Base), std::to_chars, (RTFM_ToChars)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED_OVERLOADED( std::to_chars_result(char* First, char* Last, uint64_t Value, int Base), std::to_chars, (RTFM_ToChars)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED_OVERLOADED( std::to_chars_result(char* First, char* Last, float Value), std::to_chars, (RTFM_ToChars)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED_OVERLOADED( std::to_chars_result(char* First, char* Last, float Value, std::chars_format Format), std::to_chars, (RTFM_ToChars)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED_OVERLOADED( std::to_chars_result(char* First, char* Last, float Value, std::chars_format Format, int Precision), std::to_chars, (RTFM_ToChars)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED_OVERLOADED( std::to_chars_result(char* First, char* Last, double Value), std::to_chars, (RTFM_ToChars)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED_OVERLOADED( std::to_chars_result(char* First, char* Last, double Value, std::chars_format Format), std::to_chars, (RTFM_ToChars)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED_OVERLOADED( std::to_chars_result(char* First, char* Last, double Value, std::chars_format Format, int Precision), std::to_chars, (RTFM_ToChars)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED_OVERLOADED( std::to_chars_result(char* First, char* Last, long double Value), std::to_chars, (RTFM_ToChars)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED_OVERLOADED( std::to_chars_result(char* First, char* Last, long double Value, std::chars_format Format), std::to_chars, (RTFM_ToChars)), UE_AUTORTFM_MAP_OPEN_TO_CLOSED_OVERLOADED( std::to_chars_result(char* First, char* Last, long double Value, std::chars_format Format, int Precision), std::to_chars, (RTFM_ToChars)), UE_AUTORTFM_MAP_OPEN_TO_SELF(iswupper), UE_AUTORTFM_MAP_OPEN_TO_SELF(iswlower), UE_AUTORTFM_MAP_OPEN_TO_SELF(iswalpha), UE_AUTORTFM_MAP_OPEN_TO_SELF(iswgraph), UE_AUTORTFM_MAP_OPEN_TO_SELF(iswprint), UE_AUTORTFM_MAP_OPEN_TO_SELF(iswpunct), UE_AUTORTFM_MAP_OPEN_TO_SELF(iswalnum), UE_AUTORTFM_MAP_OPEN_TO_SELF(iswdigit), UE_AUTORTFM_MAP_OPEN_TO_SELF(iswxdigit), UE_AUTORTFM_MAP_OPEN_TO_SELF(iswspace), UE_AUTORTFM_MAP_OPEN_TO_SELF(iswcntrl), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(float (float), sqrt), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(double (double), sqrt), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(long double (long double), sqrt), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(float (float), sin), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(double (double), sin), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(long double (long double), sin), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(float (float), cos), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(double (double), cos), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(long double (long double), cos), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(float (float), tan), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(double (double), tan), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(long double (long double), tan), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(float (float), asin), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(double (double), asin), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(long double (long double), asin), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(float (float), acos), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(double (double), acos), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(long double (long double), acos), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(float (float), atan), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(double (double), atan), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(long double (long double), atan), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(float (float, float), atan2), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(double (double, double), atan2), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(long double (long double, long double), atan2), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(float (float), sinh), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(double (double), sinh), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(long double (long double), sinh), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(float (float), cosh), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(double (double), cosh), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(long double (long double), cosh), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(float (float), tanh), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(double (double), tanh), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(long double (long double), tanh), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(float (float), asinh), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(double (double), asinh), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(long double (long double), asinh), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(float (float), acosh), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(double (double), acosh), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(long double (long double), acosh), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(float (float), atanh), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(double (double), atanh), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(long double (long double), atanh), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(float (float), exp), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(double (double), exp), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(long double (long double), exp), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(float (float), log), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(double (double), log), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(long double (long double), log), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(float (float, float), pow), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(double (double, double), pow), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(long double (long double, long double), pow), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(long long (float), llrint), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(long long (double), llrint), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(long long (long double), llrint), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(float (float, float), fmod), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(double (double, double), fmod), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(long double (long double, long double), fmod), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(float (float, float*), modf), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(double (double, double*), modf), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(long double (long double, long double*), modf), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(float (float, float), powf), UE_AUTORTFM_MAP_OPEN_TO_SELF_OVERLOADED(double (double, double), pow), UE_AUTORTFM_MAP_OPEN_TO_SELF(sqrtf), UE_AUTORTFM_MAP_OPEN_TO_SELF(sinf), UE_AUTORTFM_MAP_OPEN_TO_SELF(cosf), UE_AUTORTFM_MAP_OPEN_TO_SELF(tanf), UE_AUTORTFM_MAP_OPEN_TO_SELF(asinf), UE_AUTORTFM_MAP_OPEN_TO_SELF(asinhf), UE_AUTORTFM_MAP_OPEN_TO_SELF(acosf), UE_AUTORTFM_MAP_OPEN_TO_SELF(acoshf), UE_AUTORTFM_MAP_OPEN_TO_SELF(atanf), UE_AUTORTFM_MAP_OPEN_TO_SELF(atanhf), UE_AUTORTFM_MAP_OPEN_TO_SELF(atan2f), UE_AUTORTFM_MAP_OPEN_TO_SELF(sinhf), UE_AUTORTFM_MAP_OPEN_TO_SELF(coshf), UE_AUTORTFM_MAP_OPEN_TO_SELF(tanhf), UE_AUTORTFM_MAP_OPEN_TO_SELF(expf), UE_AUTORTFM_MAP_OPEN_TO_SELF(logf), UE_AUTORTFM_MAP_OPEN_TO_SELF(powf), UE_AUTORTFM_MAP_OPEN_TO_SELF(llrintf), UE_AUTORTFM_MAP_OPEN_TO_SELF(fmodf), UE_AUTORTFM_MAP_OPEN_TO_SELF(fmodl), UE_AUTORTFM_MAP_OPEN_TO_SELF(rand), UE_AUTORTFM_MAP_OPEN_TO_SELF(modff), UE_AUTORTFM_MAP_OPEN_TO_SELF(modfl), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(vsnprintf, RTFM_vsnprintf), UE_AUTORTFM_MAP_OPEN_TO_CLOSED_OVERLOADED( int (wchar_t*, size_t, const wchar_t*, va_list), vswprintf, RTFM_vswprintf), UE_AUTORTFM_MAP_OPEN_TO_CLOSED_OVERLOADED( int(wchar_t*, size_t, wchar_t const*, ...), swprintf, RTFM_swprintf), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(snprintf, RTFM_snprintf), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(printf, RTFM_printf), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(wprintf, RTFM_wprintf), UE_AUTORTFM_MAP_OPEN_TO_SELF(putchar), UE_AUTORTFM_MAP_OPEN_TO_SELF(puts), UE_AUTORTFM_MAP_OPEN_TO_SELF(fflush), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(wcscpy, RTFM_wcscpy), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(wcsncpy, RTFM_wcsncpy), UE_AUTORTFM_MAP_OPEN_TO_CLOSED(atexit, RTFM_atexit) ); #ifdef _MSC_VER #pragma warning(pop) // END: Disable warning about deprecated STD C functions. #endif } // namespace AutoRTFM #endif // defined(__AUTORTFM) && __AUTORTFM