67 votes

Existe-t-il un moyen pour un programme C / C ++ de planter avant main ()?

Y a-t-il un moyen pour un programme de planter avant main ()?

38voto

R Samuel Klatchko Points 44549

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.

34voto

Anders Abel Points 36203

Oui, au moins sous Windows. Si le programme utilise des DLL, elles peuvent être chargées avant le démarrage de main() . Les fonctions DllMain de ces DLL seront exécutées avant main() . S'ils rencontrent une erreur, ils risquent de provoquer l'arrêt complet du processus ou de le bloquer.

20voto

epatel Points 32451

Si vous avez un programme C ++, celui-ci peut initialiser des variables et des objets via des fonctions et des constructeurs avant la saisie de main. Un bogue dans l’un de ceux-ci pourrait faire planter un programme.

20voto

conio Points 568

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!

18voto

pm100 Points 8303

certainement en c ++; les objets statiques avec des constructeurs seront appelés avant la main - ils peuvent mourir

pas sûr de c

voici un échantillon

 class X
{
public:
X()
{
  char *x = 0;
  *x = 1;
}
};

X x;
int main()
{
return 0;
}
 

cela va planter avant principal

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X