Le débordement de la stack est réduit au silence sous linux?

Sous Linux, j’ai un code qui utilise un tableau déclaré dans la fonction principale avec un sixe de 2 Mo + 1 octet

#include  #include  #define MAX_DATA (2097152) /* 2MB */ int main(int argc, char *argv[]) { /* Reserve 1 byte for null termination */ char data[MAX_DATA + 1]; printf("Bye\n"); return 0; } 

Quand j’ai compilé sous Linux avec gcc, je l’exécute sans aucun problème. Mais sous Windows, je reçois une erreur d’exécution. Au moment de la lancer, j’ai 5 Go de mémoire libre.

Pour résoudre le problème sous Windows, je dois spécifier une autre taille de stack:

 gcc -Wl,--stack,2097153 -o test.exe test.c 

ou déclarer le tableau de données en dehors de la fonction principale.

Parce que le programme compilé sur Linux était lié sans changer la taille de la stack?

Pourquoi ça marche bien sur Linux mais échoue sur Windows? J’utilise le même code source et les mêmes instructions gcc:

 gcc -Wall -O source.c -o source 

Parce que l’implémentation de malloc sur Linux n’est pas fiable, car elle peut renvoyer un pointeur non nul même si la mémoire n’est pas disponible.

Je pense que dans le programme qui s’exécute sur Linux, il peut ignorer en silence un problème de stack?

Est-il possible que le programme qui s’exécute sur Linux qui n’était pas lié à la modification de la taille de la stack, mais pas à l’exécution, contrairement à Windows, ignore silencieusement un problème de stack?

Aussi, pourquoi si je déclare le tableau en dehors de la fonction principale, il fonctionne correctement sous Windows? Dans le cas où il utilise tas pourquoi je n’ai pas besoin de le libérer?

Pourquoi fonctionne-t-il correctement sous Linux mais échoue sous Windows?

Parce que la taille de stack par défaut pour un processus ou un thread dépend du système:

  • Sous Windows, la taille de réservation de stack par défaut utilisée par l’éditeur de liens est de 1 Mo.
  • Sous Linux / Unix, la taille maximale de la stack peut être configurée via la commande ulimit . De plus, vous pouvez configurer la taille de la stack lors de la création d’un nouveau thread.

Parce que l’implémentation de malloc sur Linux n’est pas fiable, car elle peut renvoyer un pointeur non nul même si la mémoire n’est pas disponible.

Je suppose que vous parlez de la question de la surconsommation . Pour surmonter cela, vous pouvez utiliser calloc et vérifier la valeur de retour. Si vous faites cela au tout début de votre application, vous pouvez immédiatement quitter avec un message d’erreur approprié.