2010-06-07 5 views
5

J'expérimente avec un morceau de code C. Quelqu'un peut-il me dire pourquoi VC 9.0 avec SP1 plante-t-il pour moi? Oh, et le code est censé être un exemple utilisé dans une discussion pourquoi quelque chose commeCompilateur de plantage de code: main() renvoyant un struct au lieu d'un int

void main (void) 

est le mal.

struct foo { int i; double d; } main (double argc, struct foo argv) 
{ 

    struct foo a; 
    a.d=0; 
    a.i=0; 
    return a.i; 
} 

Si je mets

return a; 

compilateur ne tombe pas en panne.

+4

Le compilateur ne devrait pas planter du tout, c'est un bug avec le compilateur s'il se bloque en essayant de comprendre votre code. – dreamlax

+2

+1 pour le mauvais exemple. Il m'a fallu un peu de temps pour comprendre ce que vous étiez en train de faire :) En outre, le compilateur VS2010 C++ impose maintenant la signature de main(), mais le code ci-dessus ne se compile plus. – Alan

+1

Essayez de fermer la structure avec un point-virgule. Voir si cela change le comportement du compilateur. Il peut en effet s'agir d'un bug de compilateur. –

Répondre

3

Le code donne un comportement indéfini. Cela ne nécessite pas le crash du compilateur, il dit simplement que vous avez fondamentalement enfreint les règles, donc le compilateur n'a rien fait de mal, quoi qu'il arrive. Edit: cela dit, en tant que problème de qualité d'implémentation, il est absolument vrai qu'il n'y a pratiquement aucune excuse pour que le compilateur plante - raisonnablement, il devrait toujours sortir normalement, quelles que soient les données que vous lui fournissez.

+3

Le code incorrect ne doit jamais planter un compilateur. Si le programme se bloque en raison d'un comportement indéfini, c'est une histoire différente. – Maister

+1

Peut-être que si le compilateur s'écrasait plus fréquemment sur de telles constructions haineuses, nous ne verrions pas un tel code horrible dans la nature. +100 pour crash l'enfer de quiconque essaie de compiler ce qui précède. –

+6

Je me souviens avoir lu quelque part à propos d'un compilateur C "hacker" qui ne produirait rien en cas de succès, mais sur * toute * erreur ne produirait que "Non". – dreamlax

-2

mettre deux points demi entre la fin de votre structure et principale comme ceci:

struct foo {int i; double d; } principale (Double argc, argv struct foo)

vous pouvez également définir un type de retour pour principal si votre chose va de retour:

struct foo {int i; double d; } int main (double argc, struct foo argv)

+9

Son point est qu'il définit main pour retourner une instance d'une structure ... –

2

Ok, vous voulez poser une question ésotérique, alors s'il vous plaît construire un complet.

Comment avez-vous exécuté le test? Que voulez-vous dire par accident? Quelle était votre sortie? Avez-vous simplement compilé, compilé et lié, ou compilé et lié et débogué? Comment votre compilateur est-il configuré? Où allez-vous avec cette expérience?

des phrases comme: « quelque chose comme » le « mal » ne sont pas assez d'information pour être utile

SUIVI:

Instinctivement je vais deviner que cet accident est une conséquence d'un commutateur d'optimisation compilateur avec que vous autorisez le compilateur à faire certaines hypothèses auxquelles vous n'êtes pas conforme.

mes:

suppositions

1- Le principal (vide) vide (sans;) fait partie d'un commentaire que vous faites, mais pas partie du test que vous avez soumis.

2- Votre programme est incorrect, mais cela est délibéré afin d'étudier le comportement de l'environnement de compilation/éditeur de liens/exécution.
Si c'est effectivement le cas, vous devez réduire la complexité du scénario de test.

Veuillez simplifier le test au strict minimum nécessaire pour provoquer un accident. Je ne peux pas le faire pour vous, je n'ai pas les bonnes versions du logiciel installé, de toute façon, c'est votre expérience.

ce plantage?

struct foo { int i; double d; }; 
    struct foo main(void) 
     { 
     int a=0; 
     return a; 
     } 

ou même cet exemple le plus minimal?

void * main(void) 
    { 
    return 0; 
    } 

est-il de cela (je doute):

int main(double argc, char ** argv) 
    { 
    return 0; 
    } 

Vous avez l'idée. réduire le crash à son essence. Venez avec un programme qui est sans erreur, sauf pour le une chose qui va le faire planter.

Puis rapportez.

+0

Ici 'comment reproduire le problème: Démarrez Visual Studio 2008 SP1 et faire un nouveau projet C++ vide. Ajoutez un nouveau fichier source et ajoutez l'extension .c à la main. De cette façon, il sera compilé en C. Appuyez sur F7. Si vous n'avez modifié aucun paramètre, une version de débogage sera générée. Résultat: le compilateur d'optimisation Microsoft a cessé de fonctionner. Nom de l'événement: APPCRASH. Oh, et j'ai relu la question. Le mal et quelque chose comme ça sont assez informatifs. Leur point d'existence est d'éviter les commentaires comme "C standard dit int main (vide) bla bla bla" car je le sais déjà :) et décrit également l'utilisation du code – AndrejaKo

+0

1 nad 2 sont corrects. Je suppose que je ne peux pas m'exprimer d'une bonne manière parfois. Votre réponse nous maintenant utile, donc +1 et merci pour les idées. – AndrejaKo

Questions connexes