От: | velkin | http://blogs.rsdn.org/effective/ | |
Дата: | 11.01.22 18:10 | ||
Оценка: | 1 (1) +1 |
И возникает вопрос, а можно ли доверять компиляторам майкрософт, то есть не просто IDE, а Microsoft Compilers.Новая волна интереса к теме последовала за постом на Reddit. Его автор обратил внимание на то, что в скомпилированных при помощи Visual Studio C++ исполняемых файлах появляется вызов функции telemetry_main_invoke_trigger. В исходниках этой функции нет, а её название позволяет предположить, что она каким-то образом связана со сбором данных телеметрии Microsoft.
В Visual Studio «настоящая» точка входа в программу называется mainCRTStartup. В комплекте с VS идут исходники стандартной библиотеки, в VS2015 определение mainCRTStartup находится в %PROGRAMFILES(X86)%\VC\crt\src\vcruntime\exe_main.cpp, но, впрочем, всю работу выполняет exe_common.inl рядом. Давайте туда посмотрим.
...
// If this module has any thread-local destructors, register the
// callback function with the Unified CRT to run on exit.
_tls_callback_type const * const tls_dtor_callback = __scrt_get_dyn_tls_dtor_callback();
if (*tls_dtor_callback != nullptr && __scrt_is_nonwritable_in_current_image(tls_dtor_callback))
{
_register_thread_local_exe_atexit_callback(*tls_dtor_callback);
}
__telemetry_main_invoke_trigger(nullptr);
//
// Initialization is complete; invoke main...
//
int const main_result = invoke_main();
//
// main has returned; exit somehow...
//
__telemetry_main_return_trigger(nullptr);
if (!__scrt_is_managed_app())
exit(main_result);
if (!has_cctor)
_cexit();
// Finally, we terminate the CRT:
__scrt_uninitialize_crt(true, false);
return main_result;
...