bug dans la correction de mon prof ?

Le problème exposé dans ce sujet a été résolu.

Bonjour,
Mon prof a donné une correction à un exercice. La donnée est la suivante : Ecrire un programme C permettant d’afficher à l’écran l’intégralité d’un fichier texte donné, sans jamais utiliser de boucle

Sa correction est simple, il lit la taille du fichier, alloue un buffer de la taille du fichier, et lis avec fread le nombre d’octet. Jusqu’à la pas de surprise. Là où je suis choqué c’est qu’il fait un printf("%s",buffer) alors que son buffer n’est pas null terminated. Voici un code minimal (sans les checks pour démontrer la chose.)

int main() {

    FILE* file = fopen("../test.txt","r");
    if(file == NULL){
        perror("Youston, we have a problem");
    }
    fseek(file,0,SEEK_END);
    size_t size = (size_t) ftell(file);
    rewind(file);
    char * data = calloc(size,1);
    fread(data,1,size,file);
    printf("%s\n\n",data);
    free(data);
    fclose(file);
}

J’ai fais quelques testes et en mémoire, mes données sont TOUJOURS suivie d’un octet à 0 qui agit comme \0 pour printf.

Ma question est donc d’où provient ce \0 ?

fread n’en met pas
les 0 de calloc sont entièrements réécrit puisque on alloue size octets et qu’on écrit size octets

Merci d’avance :)

+0 -0

L’adress sanitizer est d’accord avec toi:

=================================================================
==9663==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x6140000001fd at pc 0x7f355891e075 bp 0
x7ffec189f3d0 sp 0x7ffec189eb48
READ of size 446 at 0x6140000001fd thread T0
    #0 0x7f355891e074  (/usr/lib/x86_64-linux-gnu/libasan.so.4+0x74074)
    #1 0x7f355899354f  (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xe954f)
    #2 0x7f355891e1ed  (/usr/lib/x86_64-linux-gnu/libasan.so.4+0x741ed)
    #3 0x7f355891edad in vprintf (/usr/lib/x86_64-linux-gnu/libasan.so.4+0x74dad)
    #4 0x7f355891ee9e in __interceptor_printf (/usr/lib/x86_64-linux-gnu/libasan.so.4+0x74e9e)
    #5 0x56095d545d73 in main (/home/moi/dev/tests/c++/fread-san+0xd73)
    #6 0x7f35577b9bf6 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21bf6)
    #7 0x56095d545be9 in _start (/home/moi/dev/tests/c++/fread-san+0xbe9)

0x6140000001fd is located 0 bytes to the right of 445-byte region [0x614000000040,0x6140000001fd)
allocated by thread T0 here:
    #0 0x7f3558988d28 in __interceptor_calloc (/usr/lib/x86_64-linux-gnu/libasan.so.4+0xded28)
    #1 0x56095d545d3e in main (/home/moi/dev/tests/c++/fread-san+0xd3e)
    #2 0x7f35577b9bf6 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21bf6)

SUMMARY: AddressSanitizer: heap-buffer-overflow (/usr/lib/x86_64-linux-gnu/libasan.so.4+0x74074)
........

N’hésite pas à tester ce genre de choses en compilant avec -fsanitize=address,undefined -g -fno-omit-frame-pointer

(avec clang j’ai encore de meilleurs résultats comme les lignes incriminées; avec gcc il y a des détails de configuration qui m’échappent encore)

    char * data = calloc(size,1);

Il manque clairement le caractère de fin de chaîne.

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte