CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

Visual Studio Warning C

stuart4
stuart4
Niveau 5
15 février 2022 à 21:30:28

Bonjour lorsque j'utilise une fonction permettant de lire un fichier, le copier dans un string et retourner ce string, visual studio community me donne un Warning :
"Warning C6386 Buffer overrun while writing to 'buffer': the writable size is 'size+1' bytes, but '4294967295' bytes might be written."

Voici ma fonction :

static char* readShader(const char* filepath)
{
    FILE* file;
    size_t read_bytes = 0;

    file = fopen(filepath, "r");
    if (file == NULL)
    {
        printf("Could not open shader file");
        return NULL;
    }
    fseek(file, 0L, SEEK_END);
    const int size = ftell(file);
    fseek(file, 0L, SEEK_SET);

    char* buffer = (char*)malloc(size + 1);
    if (buffer == NULL)
    {
        printf("Could not allocate memory");
        return NULL;
    }
    read_bytes = fread(buffer, sizeof(char), size, file);
    buffer[read_bytes] = '\0';
    fclose(file);
    return buffer;
}
CppModerne
CppModerne
Niveau 3
16 février 2022 à 13:24:37

La fonction ftell retourne un long, fread prend un size_t qui, selon l'implémentation, est souvent un simple int. Si tu obtiens -1L (qui est le code de retour d'erreur de ftell) en retour de ftell, tu te retrouves avec un unsigned long !

Pour résoudre ce problème, vérifie la valeur de retour de ftell et assure-toi qu'elle ne vaut pas -1L, puis, lors de l'appel à fread, convertis la variable size en size_t.

stuart4
stuart4
Niveau 5
16 février 2022 à 19:55:39

Je n'ai plus le warning en changeant le type de size de int a size_t :


static char* readShader(const char* filepath)
{
    FILE* file;
    size_t read_bytes = 0;

    file = fopen(filepath, "r");
    if (file == NULL)
    {
        printf("Could not open shader file");
        return NULL;
    }
    fseek(file, 0L, SEEK_END);
    const size_t size = ftell(file);  // ici je change le type de size de int à size_t
    fseek(file, 0L, SEEK_SET);

    char* buffer = (char*)malloc(size + 1);
    if (buffer == NULL)
    {
        printf("Could not allocate memory");
        return NULL;
    }
    read_bytes = fread(buffer, sizeof(char), size, file);
    buffer[read_bytes] = '\0';
    fclose(file);
    return buffer;
}

Cepandant ceci ne fonction pas en typecast size en size_t ;


static char* readShader(const char* filepath)
{
    FILE* file;
    size_t read_bytes = 0;

    file = fopen(filepath, "r");
    if (file == NULL)
    {
        printf("Could not open shader file");
        return NULL;
    }
    fseek(file, 0L, SEEK_END);
    const int size = ftell(file);
    fseek(file, 0L, SEEK_SET);

    char* buffer = (char*)malloc(size + 1);
    if (buffer == NULL)
    {
        printf("Could not allocate memory");
        return NULL;
    }
    read_bytes = fread(buffer, sizeof(char), (size_t)size, file); // ici je typecast size en size_t
    buffer[read_bytes] = '\0';
    fclose(file);
    return buffer;
}
CppModerne
CppModerne
Niveau 3
17 février 2022 à 00:31:29

Tu veux dire quoi par "ça ne fonctionne pas" ?

Lapintade
Lapintade
Niveau 30
17 février 2022 à 11:48:40

ton code a l'air bon.
A mon avis c'est un warning qui indique que tu peux avoir un soucis de debordement, mais il ne veut pas dire que tu va en avoir un.

pour que ce soit plus propre je mettrais dans le fopen "rb" (binary), pour lire exactement ce qu'il y a dans le fichier (sinon en mode ascii, certains caracteres peuvent etre reinteprettés, comme les CR en 1 ou 2 bytes)

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment