Usa la funzione bzero in C

Jinku Hu 12 ottobre 2023
  1. Usa la funzione bzero per azzerare la regione di memoria in C
  2. Usa la funzione explicit_bzero per azzerare la regione di memoria in C
  3. Usa la funzione memset per azzerare la regione di memoria in C
Usa la funzione bzero in C

Questo articolo mostrerà diversi metodi su come utilizzare la funzione bzero in C.

Usa la funzione bzero per azzerare la regione di memoria in C

La gestione della memoria è uno dei compiti principali della programmazione C poiché all’utente è richiesto di interagire con le strutture di memoria di base e di operare su di esse. Pertanto, l’azzeramento dell’area di memoria è l’operazione comune utilizzata in molti scenari. A volte, la memoria dinamica dovrebbe essere sovrascritta con zeri per cancellarla dai valori di spazzatura. A volte, ci sono struct contenenti più valori di maschera di bit che devono essere azzerati esplicitamente prima dell’inizializzazione dei suoi membri. In questo esempio, viene illustrato il codice che azzera la struttura dell’indirizzo del socket che viene successivamente utilizzata per eseguire il binding al socket specificato. La funzione bzero può essere usata per cancellare la data area di memoria con zero byte (\0). Richiede due argomenti, l’indirizzo iniziale della regione di memoria e il numero di byte che devono essere azzerati.

#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);
}

Usa la funzione explicit_bzero per azzerare la regione di memoria in C

Un altro metodo per sovrascrivere la regione di memoria con zeri consiste nell’usare la funzione explicit_bzero. Contrariamente alla funzione bzero, explicit_bzero garantisce che l’area di memoria venga sovrascritta anche se le ottimizzazioni del compilatore deducono che la funzione è non necessaria. Notare che questa funzione è un’estensione non standard del linguaggio C e potrebbe non essere inclusa in alcuni compilatori.

#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);
}

Usa la funzione memset per azzerare la regione di memoria in C

memset fa parte della libreria C standard ed è anche un metodo consigliato per la maggior parte degli scenari tra queste tre funzioni. bzero è una funzione deprezzata e non dovrebbe essere usata nei codebase moderni. Sebbene l’operazione memset possa essere ottimizzata dal compilatore rispetto a explicit_bzero.

memset richiede tre argomenti:

  • L’indirizzo di memoria.
  • Byte costante con cui riempire la memoria.
  • Il numero di byte da sovrascrivere.

memset restituisce un puntatore all’area di memoria e può essere utilizzato nelle chiamate di funzioni concatenate.

#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);
}
Autore: 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

Articolo correlato - C Memory