2014-05-11 2 views
-4

Poster connexes: Delete folder with itemsPlus de pointeurs sur struct disponibles que désignés?

Comment peut plus pointeurs dans un tableau de pointeurs sur struct disponibles pour que désigné? Pour un outil d'apprentissage pour ftw/ftwn, j'ai réécrit la solution ftwn dans la publication associée (ci-dessus) pour ftw. Fondamentalement, en utilisant le callback ftw pour remplir un tableau de structures contenant le nom de fichier, le type et la profondeur de chaque fichier. La suppression de fichier est alors passée de maxdepth à 0 en supprimant les fichiers puis les répertoires en cours de route. C'était un test, donc printf montre où unlink ou rmdir devrait être appelé et les commandes de suppression ne sont jamais exécutées.

Le stockage pour le réseau de structures a été essayé de trois manières différentes. (1) désignant statiquement le nombre de pointeurs disponibles struct _rmstat *rmstat [100]; (ftw 'nopenfd' mis à 200), (2) allocation dynamique struct _rmstat **rmstat; et enfin (3) ajout de l'information à une liste chaînée. Tester l'allocation statique, j'ai spécifiquement choisi les répertoires de test avec moins de 100 fichiers, puis les répertoires avec plus de 100 fichiers, pour provoquer l'échec. À ma grande surprise, le test alloué statiquement traiterait automatiquement les répertoires contenant plus de 100 fichiers, et jusqu'à 450! Comment est-ce possible? Je pensais que l'allocation statique struct _rmstat *rmstat [100]; devrait garantir une erreur de segmentation (ou un vidage de noyau similaire) lorsque la 101e affectation de structure a été tentée. Y a-t-il quelque chose dans gcc qui fait cela dans l'allocation pile/tas? Ou, est-ce juste une partie de ce qu'est un comportement «indéfini»? Avec ftw, j'ai défini 'nopenfd' plus grand que les pointeurs de structure disponibles, donc je ne pense pas que cela soit le résultat de la limitation des fichiers de descripteurs ftw et de la fermeture/réouverture des fichiers.

J'ai recherché, mais je ne trouve pas d'explication sur la façon dont vous pourriez obtenir plus de pointeurs que ce que vous avez indiqué. Est-ce que quelqu'un ici sait comment cela peut arriver? Le test program source est disponible. Il est sûr - il supprime NOTHING, imprime simplement avec printf. Construire avec: gcc -Wall -o rmftws rmdir-ftw-static.c Merci pour toute idée que vous pouvez fournir.

+1

Connexe: http://stackoverflow.com/q/2397984/951890 –

Répondre

0

Le dépassement des limites d'une matrice entraîne simplement un comportement indéfini. Ce serait bien si ça se gêne mais ce n'est pas obligatoire.

En termes de question concrète - le compilateur a demandé au système d'allouer un segment pour contenir les données statiques et lui a dit combien il était grand. Lorsqu'il effectue l'allocation, le système peut généralement sur-allouer le stockage jusqu'à une limite de page.

+0

Vaughn, DrC et DNT, les réponses et les liens étaient géniaux.Je n'avais pas beaucoup réfléchi à la distinction entre comportement non spécifié, non défini et comportement défini par l'implémentation. Dans cette situation, plutôt que d'avoir une réponse simple de «ça fait ce mannequin ...», c'est plutôt un exemple de «ce qui peut arriver», quand vous voyez une situation où vous savez que l'exécution complète du code va dépasser une limite prédéfinie qui aurait dû être protégée pour commencer. Le comportement sera simplement indéfini. Je pense que ça le fait. J'ai couru le code de plusieurs machines - avec des résultats variables indéfinis. –

0

Une déclaration de 100 pointeurs dans un tel tableau ne garantit pas toujours un segfault. Ce qu'il garantit est un remplacement de la mémoire si vous utilisez plus de pointeurs que la taille du tableau. Cependant, si la mémoire écrasée appartient à d'autres variables que vous avez déclarées, leurs valeurs seront saccagées, mais vous n'aurez pas de défaut là et ensuite, jusqu'à ce que plus tard dans votre code vous essayiez d'utiliser les valeurs que vous avez stockées dans ces variables, Dans ce cas, votre code peut mal se comporter mais ne pas tomber en panne ou il peut tomber en panne à un moment donné, mais pour une raison qui n'est pas si clairement liée à l'écrasement du tableau initial. Un cas où vous pourriez avoir un plantage immédiatement lors de l'utilisation de la 101ème position de cette matrice est si le tableau arrive à être alloué par le compilateur à la fin exacte de la section de données en cours, puis le suivant est protégé en écriture . Mais ceci est un compilateur et un problème contrôlé par le système d'exploitation.

Questions connexes