Варианты…
• Битая память.
• Странная ошибка в прошивке какой-нибудь «железки».
Вот совсем недавно на хабре один товарищ сказал, что в очень специфичных условиях винт Fujitsu портит один бит.
Давно я хакерством не занимался, неспособен быстро восстановить картинку. Почти уверен, что там один байт испорчен.
Олег Цилюрик: Шаблонных функций просто не могло быть в RTL, потому что они должны храниться в полном исходнике в хедерном файле, чтобы компилятор мог их специализировать.
Всё, что либо не шаблонное, либо до конца специализировано — есть там, разумеется.
И вообще, RTL — обычная себе библиотека, только автоматически подключается к любой программе.
Олег Цилюрик: Ну да, malloc — библиотечный вызов и эта функция точно в RTL. Но new — это также вызов некой функции (выделение памяти), которая обязана быть где-то в RTL, а потом — вызов конструктора, он-то уж где попадётся.
Что такое «внутренние функции для обслуживания точки входа»? Под DOS это могло быть перехватить пару прерываний наподобие Ctrl+Break. Получить командную строку и преобразовать её в argc и argv. В консольной программе — создать консоль, и т.д. (мало кто знает, что GUI-программы Windows тоже имеют потоки ввода, вывода и ошибок — просто консольного окна у них нет). Перевести библиотеку в однопоточный режим… В общем, они выполняются до main() и после него.
Олег Цилюрик: nevro: Шаблонные функции не хранятся, а каждый раз при компиляции расшаблониваются и компилируются в нужной специализации. Если вдруг у вас есть std::string где-то, попробуйте пройтись по проге отладчиком — он даже зайдёт в хедеры STL (другой вопрос, что ничего там не поймёшь).
Всё, что не шаблонное (int func(x)) или полностью специализировано (template<> int Type func(x)) — в общем, «по-хорошему» исходник должен быть в CPP — разумеется, хранится. Также стандартная библиотека может — ключевое слово может — специализировать некоторые шаблонные функции, просто чтобы хранить их в RTL. Например, некоторые функции std::string.