web-dev-qa-db-fra.com

addressSanitizer: heap-buffer-overflow on address

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

7
Linh Chi Nguyen

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);
6
SHR