De abort, j'ai proposé l'hypothèse d'un assert, vu qu'assert est connu pour appeler abort() en cas d'échec de l'assertion.
Pourquoi un intptr_t* (qui multiplie donc l'offset par sizeof(intptr_t) au lieu d'un char*?Ben j'avais parlé d'une boucle de recherche. Bon je l'ai retapée car entre temps j'avais fait d'autres trucs mais je pense qu'elle devait ressembler à ceci:
Code c : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 #include <stdio.h> #include <stdint.h> #include <stdlib.h> #include <string.h> #include <assert.h> #include <sys/types.h> #include <sys/types.h> int test(char *adr, size_t i) { uintptr_t *pt=(uintptr_t*)adr; return ((pt + i) > pt); } int main(){ char pt[10]; size_t i; for (i=1; test(pt, i); i++); printf("i=%lu (%x)\n", i, i); }
Sauf que là, je l'ai lancée plusieurs fois et voici ce que j'ai eu
Effectivement la valeur change à chaque appel puisque l'adresse de départ change aussi.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 ~/tmp$ ./essai i=269228476 (100c19bc) ~/tmp$ ./essai i=269393864 (100e9fc8) ~/tmp$ ./essai i=269329524 (100da474) ~/tmp$ ./essai i=268961052 (1008051c) ~/tmp$ ./essai i=268932548 (100795c4)
Oui, c'est ce que j'ai eu quand j'ai passé NULL au lieu de pt
Et quand j'ai remplacé ">" dans le test par ">=" (ton assert), alors je n'ai plus eu de retour pour NULL (effectivement, dans ce cas le test reste toujours vrai)...
Code c : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 gcc essai.c -o essai ~/tmp$ ./essai i=1073741824 (40000000) ~/tmp$ ./essai i=1073741824 (40000000) ~/tmp$ ./essai i=1073741824 (40000000) ~/tmp$ ./essai
Et aussi, ça me paraît bizarre que tu n'affiches pas l'adresse de début alors que tu ne la contrôles pas.
Partager