Usa la funzione bzero in C
-
Usa la funzione
bzero
per azzerare la regione di memoria in C -
Usa la funzione
explicit_bzero
per azzerare la regione di memoria in C -
Usa la funzione
memset
per azzerare la regione di memoria 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);
}
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