Pourquoi ai-je la faute de segmentation ici?

J’ai le code suivant, où j’essaye d’écrire quelque chose dans la stack. J’écris au bas de la stack, ce que l’application n’a toujours pas touché (notez que la stack croît vers le bas et que stackaddr pointe vers le bas).

Cependant, je reçois une erreur de segmentation même après avoir utilisé mprotect pour donner à la fois des droits d’écriture et de lecture sur cette région mémoire. J’obtiens une erreur de segmentation même si j’utilise l’indicateur de compilation -fno-stack-protector . Que se passe-t-il ici?

pthread_attr_t attr; void * stackaddr; int * plocal_var; size_t stacksize; pthread_getattr_np(pthread_self(), &attr); pthread_attr_getstack( &attr, &stackaddr, &stacksize ); printf( "stackaddr = %p, stacksize = %d\n", stackaddr, stacksize ); plocal_var = (int*)stackaddr; mprotect((void*)plocal_var, 4096, PROT_READ | PROT_WRITE); *plocal_var = 4; printf( "local_var = %d!\n", *plocal_var ); 

Vous essayez certainement de mprotect() pages qui ne sont pas encore mappées. Vous devriez vérifier le code de retour: mprotect() renvoie probablement -1 et initialise errno avec ENOMEM ( ENOMEM page de manuel mprotect(2) ).

Les pages de stack sont mappées à la demande, mais le kernel est assez intelligent pour distinguer les défauts de page causés par un access égal ou supérieur au pointeur de la stack actuel effectuer une lecture ou une écriture sur un décalage positif par rapport à la nouvelle valeur) et des erreurs de page causées par un access situé sous le pointeur de stack (qui ne sont pas valides).