Segfault étrange de SDL_FreeSurface

J’ai le code SDL simple suivant:

#include  #include  #include  // helpers bool init(SDL_Window **win, SDL_Surface **surf) { int const width = 800; int const height = 600; if (SDL_Init(SDL_INIT_VIDEO) != 0) { fprintf(stderr, "Unable to init SDL: %s\n", SDL_GetError()); return false; } *win = SDL_CreateWindow("Picture test", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height, 0); if (*win == NULL) { fprintf(stderr, "Unable to create window: %s\n", SDL_GetError()); return false; } *surf = SDL_GetWindowSurface(*win); return true; } bool load_media(SDL_Surface **surf) { *surf = SDL_LoadBMP("./sample.bmp"); if (*surf == NULL) { fprintf(stderr, "Unable to load data: %s\n", SDL_GetError()); return false; } return true; } void close(SDL_Window **win, SDL_Surface **surf) { SDL_FreeSurface(*surf); SDL_DestroyWindow(*win); SDL_Quit(); } int main() { SDL_Window *win; SDL_Surface *surf; SDL_Surface *img; if (!init(&win, &surf)) { return EXIT_FAILURE; } if (!load_media(&img)) { return EXIT_FAILURE; } SDL_BlitSurface(img, NULL, surf, NULL); SDL_UpdateWindowSurface(win); SDL_Delay(2000); close(&win, &img); } 

Mon code segfaults toujours à la close (l’origine de la segfault selon GDB est la ligne SDL_FreeSurface(*surf) ). Plus étrangement, si je remplace l’appel à close par sa définition, cela segfaible toujours au même endroit. Plus précisément, si je remplace close(&win, &img) par:

 SDL_FreeSurface(img); SDL_DestroyWindow(win); SDL_Quit(); 

le code segfa toujours au même endroit, même si cette fonction n’est même pas appelée. Cela ne fonctionne correctement que si je supprime toute la fonction de close . Je suis complètement confus quant à ce qui pourrait être la cause de cela.

Veuillez renommer votre fonction

 void close(SDL_Window **win, SDL_Surface **surf) 

puisque close est une fonction standard de la bibliothèque C.

Je peux le confirmer. Même scénario. Même avec -Wextra et -Wextra le compilateur n’a pas envoyé d’avertissement de redéclaration. Même chose pour open() .

J’ai besoin de l’avis d’experts s’il s’agit d’un bogue gcc.

  • Solution 1: déclarez close() tant que fonction statique (par exemple, static close() ).
  • Solution 2: renommez votre fonction close() en quelque chose d’autre (par exemple, my_close_foo() ).