Utilisez la fonction bzero en C
-
Utiliser la fonction
bzero
pour mettre à zéro la zone de mémoire en C -
Utilisez la fonction
explicit_bzero
pour mettre à zéro la zone de mémoire en C -
Utiliser la fonction
memset
pour mettre à zéro la zone de mémoire 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);
}
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