Y a-t-il un moyen pour un programme de planter avant main ()?
Réponses
Trop de publicités?Avec gcc, vous pouvez attribuer une fonction avec le constructeur de l'attribut (ce qui provoque de la fonction à exécuter avant d' main
). Dans la fonction suivante, premain
sera appelée avant d' main
:
#include <stdio.h>
void premain() __attribute__ ((constructor));
void premain()
{
fputs("premain\n", stdout);
}
int main()
{
fputs("main\n", stdout);
return 0;
}
Donc, si il ya un bug dans premain
vous crash avant d' main
.
La réponse est simple: Oui.
Plus précisément, on peut différencier les deux causes de cette. Je vais les appeler dépendant de l'implémentation et de la mise en œuvre indépendante.
Le seul cas qui ne dépend pas de votre environnement à tous , c'est que des objets statiques en C++, ce qui a été mentionné ici. Le code suivant meurt avant d' main()
:
#include <iostream>
class Useless {
public:
Useless() { throw "You can't construct me!"; }
};
static Useless object;
int main() {
std::cout << "This will never be printed" << std::endl;
return 0;
}
Plus intéressantes sont la plate-forme dépendant de causes. Certains ont été mentionnés ici. Celui qui a été mentionné ici une couple de fois a été l'utilisation de la dynamique des librairies (Dll dans windows, SOs dans Linux, etc.) - si votre OS loader de charge avant d' main()
, ils pourraient causer à votre application ne meurent avant d' main()
.
Une manière plus générale, la version de cette cause est de parler de toutes les choses de votre binaire du point d'entrée avant de l'appelant de votre point d'entrée(main()
). Habituellement, lorsque vous construisez votre binaire il y a de très graves bloc de code qui est appelé lors de votre système d'exploitation chargeur commence à exécuter le binaire, et quand c'est fait, il appelle votre main()
. Une chose commune ce code n'est en cours d'initialisation du C/C++ de la bibliothèque standard. Ce code peut échouer pour diverses raisons (manque de tout type de système de ressource qu'il tente d'allouer pour l'un).
Une façon intéressante sur un binaire à exécuter du code avant d' main()
sur windows à l'aide de TLS rappels (google vous en dira plus à ce sujet). Cette technique est généralement trouvé dans les logiciels malveillants comme une base anti-débogage truc (ce truc de fou ollydbg à l'époque, ne sais pas si cela ne fonctionne toujours).
Le point est que votre question est en fait équivalent à "est-il possible que le chargement d'un binaire serait la cause de l'utilisateur d'exécuter du code avant le code en main()
?", et la réponse est l'enfer, oui!