J'ai joué avec le Digital Mars Compiler gratuit au travail (vilain je sais), et créé du code pour inspecter les fonctions compilées et regarder le code d'octets à des fins d'apprentissage, voir si je peut apprendre quelque chose de précieux de la façon dont le compilateur construit ses fonctions. Cependant, recréer la même méthode dans MSVC++ a échoué lamentablement et les résultats que je reçois sont assez confus. J'ai une fonction comme ceci:Problème lors de l'examen du code d'octet dans MSVC++
unsigned int __stdcall test()
{
return 42;
}
Puis plus tard, je fais:
unsigned char* testCode = (unsigned char*)test;
Je ne peux pas sembler obtenir le C++ static_cast pour travailler dans ce cas (il renvoie une erreur du compilateur) .. d'où le casting de style C, mais c'est d'ailleurs le point ... J'ai également essayé d'utiliser le test de référence &, mais cela ne aide pas. Maintenant, quand j'examine le contenu de la mémoire pointée par testCode, je suis confus parce que ce que je vois ne ressemble même pas à du code valide, et a même un point d'arrêt de débogage coincé là ... ça ressemble à ça (cible est IA-32):
0xE9, 0xBC, 0x18, 0x00, 0x00, 0xcc ...
Ceci est manifestement erronée, 0xE9 est une instruction de saut relatif, et en regardant 0xBC octets loin, il ressemble à ceci:
0xcc, 0xcc, 0xcc ...
c'est-à-dire la mémoire initialisée à l'opcode debug breakpoint comme prévu pour la mémoire non allouée ou non utilisée.
Où que ce que je pense d'une fonction de retour 42 serait quelque chose comme:
0x8b, 0x2a, 0x00, 0x00, 0x00, 0xC3
ou tout au moins un peu de saveur de mov suivi d'un ret (0xc2, 0xc3, 0xca ou 0xcb) un peu plus bas
Est-ce que MSVC++ prend des mesures pour m'empêcher de faire ce genre de chose pour des raisons de sécurité, ou est-ce que je fais quelque chose de stupide sans m'en rendre compte? Cette méthode semble fonctionner correctement en utilisant DMC comme compilateur ...
J'ai aussi des problèmes pour aller dans l'autre sens (en exécutant des octets), mais je soupçonne que la cause sous-jacente est la même.
Toute aide ou conseil serait grandement appréciée.
reinterpret_cast est destiné à la diffusion de pointeurs, static_cast est utilisé pour lancer des types "connexes" qui ne correspondent pas à dynamic_cast –