Que se passe-t-il lorsque vous écrivez en mémoire en dehors des limites d’un tableau?

Lors d’une récente question test, on m’a demandé d’imprimer le résultat du programme suivant. La réponse est correcte, mais ce programme m’a causé une grande angoisse mentale, car je ne savais pas quel serait le comportement lorsque j’écrirais dans la mémoire en dehors des limites d’un tableau.

Voici le programme en question, les commentaires sont mes notes:

#include  #define MAX 4 void RecordArgs(int x); int main() { RecordArgs(1); RecordArgs(7); RecordArgs(-11); return 0; } void RecordArgs(int x) { static int i = 0; int call_count = 0; int arg_history[MAX] = {0}; if (call_count == MAX) { # call_count is not static and is initialized to 0 on each call # as a result, under no circumstance can call_count == MAX and # this printf is never executed printf("Too many calls to RecordArgs\n"); } else { # index out of bounds on second/third call (i + call_count will be 4??) arg_history[i + call_count] = x; ++call_count; ++i; for (i = 0; i < MAX; ++i) printf("%d ", arg_history[i]); printf("\n"); } } 

Et le résultat attendu:

 1 0 0 0 0 0 0 0 0 0 0 0 

Lorsque RecordArgs est appelé les deuxième et troisième fois, où les valeurs 7 et -11 sont-elles écrites? J’ai essayé de le comstackr sous différents réglages pour voir si je pouvais obtenir deux écritures sur quelque chose qu’il ne devrait pas mais tout ce que j’ai essayé a abouti à une sortie exacte sans erreur de segmentation.

En développant le commentaire de Patashu, des erreurs de segmentation se produisent lorsque vous accédez à la mémoire à partir d’une page d’une manière qui entre en conflit avec la page des permissions de la mémoire. En d’autres termes, ils se produisent lorsque vous accédez à une page de mémoire d’une manière qui vous est interdite. Ce qui se produit probablement dans votre situation est que vous accédez toujours à la mémoire dans la même page sur laquelle arg_history est stockée, pour laquelle vous avez évidemment l’autorisation de lire et d’écrire.

Un autre scénario possible est que la page de mémoire juste après celle sur laquelle vous travaillez a les mêmes permissions, ce qui vous permet d’y accéder de la même manière.

Dans tous les cas, il s’agit d’un comportement non défini dans C. Bien que vous soyez témoin de “résultats attendus”, cela ne devrait pas vous indiquer que le programme est correct. En fait, il s’agit d’une circonstance dans laquelle une erreur hors du champ pourrait éventuellement passer inaperçue, si elle ne provoquait pas une faute de segmentation.