Bonjour,
Je butte depuis hier soir sur un problème étrange d'erreur de segmentation. Je fais appel à un scanf, et le programme plante immédiatement après uniquement si un fgets est présent plus loin dans le code, dans un autre scope, avec des instructions les séparant.
Voilà quelques snippets:
main.c (cf l13 et l17)
misc.c
Code : 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
23 #include "../misc.h" #include "../parse_maps.h" #include "../search.h" int main(int argc, char *argv[]) { unsigned long remote_offset; pid_t remote_pid; map_line_t map_line; FILE* map_file = NULL; validate_start(argc, argv, &remote_pid); // Le scanf est dans le corps de cette fonction open_map_file(remote_pid, map_file); load_map_data_for_filename(map_file, &map_line, "[heap]"); // Le fgets est dans le corps de cette fonction //remote_offset = memory_offsets_where_string_equals(remote_pid, map_line, "heapvartwo"); //printf("Offset is at %#lx\n", remote_offset); //fclose(map_file); return 0; }
finalement, parse_maps.c
Code : 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
23
24
25
26
27
28
29 #include "misc.h" #include <stdio.h> #include <stdlib.h> // atoi void validate_start(int argc, char* argv[], pid_t* pid) { char tmp[100]; if (argc == 2) { sprintf(tmp, "%s", argv[1]); *pid = atoi(tmp); } else { puts("Enter the PID of target process: "); int lol; while(scanf("%d", &lol) == 0) // C'est un peu buggé, mais ça fait le taf. Le programme plante après que ce scanf réussisse, cf les commentaires plus bas { puts("Not a valid number, try again:"); getchar(); } } printf("yeye"); // Ceci ne s'affiche jamais, j'ai une erreur de segmentation avant sauf // quand je commente la ligne du fgets dans la fonction montrée plus bas }
Code : 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
23
24
25
26
27
28
29
30
31
32
33
34 #include "parse_maps.h" #include <stdio.h> #include <fcntl.h> #include <string.h> #include "valuetypes.h" void open_map_file(pid_t pid, FILE* map_file) { //code } void read_map_line(char* line, map_line_t* map_line) { //code } void load_map_data_for_filename(FILE* map_file, map_line_t* map_line, char* filename) { char tmp[1000]; map_line_t curr_map; while (fgets(tmp, 999, map_file) != NULL) // Le fgets de cette ligne fait planter le scanf de la première fonction { // read_map_line(tmp, &curr_map); // if(strcmp(curr_map.filename, filename) == 0) // { // read_map_line(tmp, map_line); // return; // } } }
Je peine vraiment à comprendre mon erreur, je suis sûr que c'est quelque chose de stupide comme un pointeur mal utilisé, mais pour l'instant j'ai cherché sans résultat..
Je compile avec GCC 8.2.1 ou tcc 0.9.27 avec le même résultat.
Merci de votre aide!
Partager