Use a função bzero em C

Jinku Hu 12 outubro 2023
  1. Use a função bzero para zerar a região da memória em C
  2. Use a função explicit_bzero para zerar a região da memória em C
  3. Use a função memset para zerar a região da memória em C
Use a função bzero 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);
}
Autor: 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

Artigo relacionado - C Memory