Я написал основную "Hello World" программу в C:Какова точка шаблона CRT-функции matherr?
#include <stdio.h>
int main()
{
printf("Hello World!\n");
return 0;
}
Затем я скомпилировал его в MSVC из командной строки, как, например:
cl hello.c /Fd:hello.pdb /Zi /MD /link /NODEFAULTLIB:LIBCMT.LIB
аргументы командной строки в основном скажем, «создать PDB-файл и связать его с MSVCRT.LIB, а не с LIBCMT.LIB».
Затем я разобрал программу и посмотрел на различных шаблонных функций/CRT и нашел в разборках, что было любопытно:
__matherr:
00401550: 33 C0 xor eax,eax
00401552: C3 ret
В основном это функция, которая всегда возвращает 0 в EAX всякий раз, когда это называется. Согласно the documentation этой функции, она возвращает 0, когда есть математическая ошибка и не-0, когда нет ошибки.
Есть ли у кого-нибудь ответ, почему эта функция, которая должна возвращать 0 в случае математической ошибки, включена в исполняемый файл и жестко закодирована до всегда return 0?
У вас есть исходный код CRT на вашем компьютере, посмотрите в каталоге vc/crt/src. Обратите внимание на комментарий: «По умолчанию matherr ничего не делает и возвращает 0». –