Use a função bzero em C
-
Use a função
bzero
para zerar a região da memória em C -
Use a função
explicit_bzero
para zerar a região da memória em C -
Use a função
memset
para zerar a região da memória em C
Este artigo demonstrará vários métodos sobre como usar a função bzero
em C.
Use a função bzero
para zerar a região da memória em C
O gerenciamento de memória é uma das principais tarefas da programação C, pois o usuário deve interagir com as estruturas básicas de memória e operar sobre elas. Portanto, zerar a região da memória é a operação comum usada em muitos cenários. Às vezes, a memória dinâmica deve ser substituída por zeros para limpá-la dos valores de lixo. Às vezes, há struct
contendo vários valores de máscara de bits que precisam ser zerados explicitamente antes da inicialização de seus membros. Neste exemplo, demonstramos o código que zera a estrutura de endereço de soquete que é usada posteriormente para vincular ao soquete fornecido. A função bzero
pode ser usada para apagar a área de memória fornecida com zero bytes (\0
). Leva dois argumentos, o endereço inicial da região da memória e o número de bytes que precisam ser zerados.
#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);
}
Use a função explicit_bzero
para zerar a região da memória em C
Outro método para sobrescrever a região da memória com zeros é usar a função explicit_bzero
. Em contraste com a função bzero
, explicit_bzero
garante que a área da memória seja sobrescrita mesmo se as otimizações do compilador deduzirem que a função é desnecessária
. Observe que esta função é uma extensão não padrão da linguagem C e pode não estar incluída em alguns compiladores.
#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);
}
Use a função memset
para zerar a região da memória em C
memset
é parte da biblioteca C padrão e também método recomendado para a maioria dos cenários entre essas três funções. bzero
é uma função depreciada e não deve ser usada em bases de código modernas. Embora, a operação memset
possa ser otimizada pelo compilador em oposição ao explicit_bzero
.
memset
leva três argumentos:
- O endereço da memória.
- Byte constante para preencher a memória.
- O número de bytes a serem substituídos.
memset
retorna um ponteiro para a área de memória e pode ser usado em chamadas de função em cadeia.
#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