Je suis au tout début de l'apprentissage du C.
J'essaie d'écrire une fonction pour ouvrir un fichier, lire un BUFFER_SIZE
, stockez le contenu dans un tableau, puis suivez le caractère '\n'
(parce que je veux obtenir chaque ligne de l'entrée).
quand j'ai défini le BUFFER_SIZE
très grand, je peux obtenir la première ligne. quand j'ai défini le BUFFER_SIZE
raisonnablement petit (disons, 42) qui n'est pas encore la fin de la première ligne, il affiche un symbole étrange à la fin, mais je suppose que c'est un bug dans mon propre code.
cependant, lorsque j'ai défini le BUFFER_SIZE
très petit, disons = 10, et j'utilise le -fsanitizer=address
pour vérifier la fuite de mémoire. il jette un monstre d'erreur:
==90673==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x6020000000fb at pc 0x000108868a95 bp 0x7fff573979a0 sp 0x7fff57397998
READ of size 1 at 0x6020000000fb thread T0
Si quelqu'un peut m'expliquer de manière générale:
qu'est-ce que fsanitizer = flag d'adresse?
qu'est-ce que heap-buffer-overflow?
qu'est-ce que l'adresse et le fil? quel est le drapeau pour voir le fil en couleurs à l'écran?
et pourquoi il est écrit "lire la taille 1 à l'adresse .."?
j'apprécierais vraiment <3
qu'est-ce que fsanitizer = flag d'adresse?
Habituellement, le compilateur C n'ajoute pas de vérification des limites pour l'accès à la mémoire. Parfois, en raison d'une erreur de code, il y a lecture ou écriture de l'extérieur du tampon, une telle erreur est généralement difficile à détecter. En utilisant cet indicateur, le compilateur ajoute une vérification des limites, pour vous assurer que vous n'utiliserez pas de tampon pour atteindre en dehors de son allocation.
qu'est-ce que heap-buffer-overflow?
utiliser un tableau pour atteindre après son allocation,
char* x = malloc(10);
char n=x[11]; //heap-buffer-overflow
(le sous-dépassement est à atteindre avant son allocation)
char* x = malloc(10);
char n=x[-11]; //heap-buffer-underflow
qu'est-ce que l'adresse et le fil?
L'adresse est la position en mémoire, le thread fait partie du processus exécutant la séquence de code.
et pourquoi il est écrit "lire la taille 1 à l'adresse .."?
Cela signifie que vous lisez un seul octet à partir de l'adresse indiquée.
Je pense que votre problème est que vous allouez le BUFFER_SIZE
pour le tampon et lire le même BUFFER_SIZE
dans ça. L'approche correcte consiste à toujours déclarer au moins un octet de plus que vous lisez. comme ça:
char* buff = malloc(BUFFER_SIZE+1);//notice to +1
fread(buff,1,BUFFER_SIZE,fp);