[#] Стандартная библиотека Visual Studio 2015 и телеметрия
habrabot(difrex,1) — All
2016-04-12 23:00:03


![][1]

#### Преамбула

Программы на C и C++, как правило, проводят бо́льшую часть своей жизни внутри функции `main()` и функций, прямо или косвенно вызываемых из `main()`. Тем не менее, на самом деле выполнение программы начинается вовсе не с `main()`, а с некоторого кода из стандартной библиотеки, поставляемой вместе с компилятором. Таковой код, по идее, должен подготавливать окружение для других функций стандартной библиотеки, которые, возможно, позовёт `main()`, а также параметры самой `main()` (под Windows; Unix-системы имеют тенденцию передавать `argc/argv/envp` в подготовленном виде прямо при запуске процесса, но речь не о них). Симметрично, завершающий `return` в функции `main()` — вовсе не последняя инструкция программы, после него следует ещё немного кода из стандартной библиотеки. В 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;
...


[Ой, а что это за вызовы \_\_telemetry, обрамляющие вызов main?][2]

[1]: https://habrastorage.org/files/5b0/c45/508/5b0c45508fb648f6b44f421b6647b5b2.png
[2]: https://habrahabr.ru/post/281374/#habracut