Utilisez la fonction bzero en C

Jinku Hu 12 octobre 2023
  1. Utiliser la fonction bzero pour mettre à zéro la zone de mémoire en C
  2. Utilisez la fonction explicit_bzero pour mettre à zéro la zone de mémoire en C
  3. Utiliser la fonction memset pour mettre à zéro la zone de mémoire en C
Utilisez la fonction bzero en C

Cet article présente plusieurs méthodes pour utiliser la fonction bzero en C.

Utiliser la fonction bzero pour mettre à zéro la zone de mémoire en C

La gestion de la mémoire est l’une des tâches essentielles de la programmation en C, car l’utilisateur doit interagir avec les structures de base de la mémoire et les exploiter. Ainsi, la mise à zéro de la zone de mémoire est l’opération courante utilisée dans de nombreux scénarios. Parfois, la mémoire dynamique doit être écrasée par des zéros pour la débarrasser des valeurs de la poubelle. Parfois, il existe des struct contenant plusieurs valeurs de masque de bits qui doivent être explicitement mises à zéro avant l’initialisation de leurs membres. Dans cet exemple, nous démontrons le code qui met à zéro la structure d’adresse de socket qui est ensuite utilisée pour se lier à la socket donnée. La fonction bzero peut être utilisée pour effacer la zone de mémoire donnée avec zéro octet (\0). Elle prend deux arguments, l’adresse de départ de la zone de mémoire et le nombre d’octets qui doivent être mis à zéro.

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "sys/socket.h"
#include "sys/un.h"
#include "unistd.h"

const char *SOCKNAME = "/tmp/mysocket";

int main(int argc, char *argv[]) {
  int sfd;
  struct sockaddr_un addr;

  sfd = socket(AF_UNIX, SOCK_STREAM, 0);
  if (sfd == -1) {
    perror("socket");
    exit(EXIT_FAILURE);
  }

  bzero(&addr, sizeof(struct sockaddr_un));

  addr.sun_family = AF_UNIX;
  strncpy(addr.sun_path, SOCKNAME, sizeof(addr.sun_path) - 1);

  if (bind(sfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_un)) == -1) {
    perror("bind");
    exit(EXIT_FAILURE);
  }

  if (close(sfd) == -1) {
    perror("close");
    exit(EXIT_FAILURE);
  }

  exit(EXIT_SUCCESS);
}

Utilisez la fonction explicit_bzero pour mettre à zéro la zone de mémoire en C

Une autre méthode pour écraser la région de mémoire avec des zéros est d’utiliser la fonction explicit_bzero. Contrairement à la fonction bzero, explicit_bzero garantit que la zone de mémoire est écrasée même si les optimisations du compilateur déduisent que la fonction est inécessaire. Notez que cette fonction est une extension non standard du langage C et peut ne pas être incluse dans certains compilateurs.

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "sys/socket.h"
#include "sys/un.h"
#include "unistd.h"

const char *SOCKNAME = "/tmp/mysocket";

int main(int argc, char *argv[]) {
  int sfd;
  struct sockaddr_un addr;

  sfd = socket(AF_UNIX, SOCK_STREAM, 0);
  if (sfd == -1) {
    perror("socket");
    exit(EXIT_FAILURE);
  }

  explicit_bzero(&addr, sizeof(struct sockaddr_un));

  addr.sun_family = AF_UNIX;
  strncpy(addr.sun_path, SOCKNAME, sizeof(addr.sun_path) - 1);

  if (bind(sfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_un)) == -1) {
    perror("bind");
    exit(EXIT_FAILURE);
  }

  if (close(sfd) == -1) {
    perror("close");
    exit(EXIT_FAILURE);
  }

  exit(EXIT_SUCCESS);
}

Utiliser la fonction memset pour mettre à zéro la zone de mémoire en C

memset fait partie de la bibliothèque C standard et est également une méthode recommandée pour la plupart des scénarios entre ces trois fonctions. La fonction bzero est dépréciée et ne doit pas être utilisée dans les bases de code modernes. Cependant, le fonctionnement de memset peut être optimisé par le compilateur par opposition à explicit_bzero.

memset prend trois arguments :

  • L’adresse mémoire.
  • L’octet constant pour remplir la mémoire.
  • Le nombre d’octets à écraser.

memset renvoie un pointeur vers la zone mémoire et peut être utilisé dans des appels de fonctions chaînés.

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "sys/socket.h"
#include "sys/un.h"
#include "unistd.h"

const char *SOCKNAME = "/tmp/mysocket4";

int main(int argc, char *argv[]) {
  int sfd;
  struct sockaddr_un addr;

  sfd = socket(AF_UNIX, SOCK_STREAM, 0);
  if (sfd == -1) {
    perror("socket");
    exit(EXIT_FAILURE);
  }

  memset(&addr, 0, sizeof(struct sockaddr_un));

  addr.sun_family = AF_UNIX;
  strncpy(addr.sun_path, SOCKNAME, sizeof(addr.sun_path) - 1);

  if (bind(sfd, (struct sockaddr *)&addr, sizeof(struct sockaddr_un)) == -1) {
    perror("bind");
    exit(EXIT_FAILURE);
  }

  if (close(sfd) == -1) {
    perror("close");
    exit(EXIT_FAILURE);
  }

  exit(EXIT_SUCCESS);
}
Auteur: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

Article connexe - C Memory