Utilice la función bzero en C

Jinku Hu 12 octubre 2023
  1. Utilice la función bzero para poner a cero la región de memoria en C
  2. Utilice la función explicit_bzero para poner a cero la región de memoria en C
  3. Utilice la función memset para poner a cero la región de memoria en C
Utilice la función bzero en C

Este artículo demostrará varios métodos sobre cómo utilizar la función bzero en C.

Utilice la función bzero para poner a cero la región de memoria en C

La gestión de la memoria es una de las tareas centrales de la programación en C, ya que se requiere que el usuario interactúe con las estructuras básicas de la memoria y opere en ellas. Por lo tanto, poner a cero la región de memoria es la operación común que se usa en muchos escenarios. A veces, la memoria dinámica debe sobrescribirse con ceros para borrarla de los valores basura. A veces, hay struct que contiene múltiples valores de máscara de bits que necesitan ser puestos a cero explícitamente antes de la inicialización de sus miembros. En este ejemplo, demostramos el código que pone a cero la estructura de la dirección del socket que luego se usa para enlazar al socket dado. La función bzero se puede utilizar para borrar el área de memoria dada con cero bytes (\0). Toma dos argumentos, la dirección inicial de la región de memoria y el número de bytes que deben ponerse a cero.

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

Utilice la función explicit_bzero para poner a cero la región de memoria en C

Otro método para sobrescribir la región de la memoria con ceros es usar la función explicit_bzero. A diferencia de la función bzero, explicit_bzero garantiza que el área de memoria se sobrescribe incluso si las optimizaciones del compilador deducen que la función es innecesaria. Tenga en cuenta que esta función es una extensión no estándar del lenguaje C y puede que no esté incluida en algunos 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);
}

Utilice la función memset para poner a cero la región de memoria en C

memset es parte de la biblioteca C estándar y también es un método recomendado para la mayoría de escenarios entre estas tres funciones. bzero es una función depreciada y no debe usarse en bases de código modernas. Sin embargo, el compilador puede optimizar la operación de memset en lugar de explicit_bzero.

memset toma tres argumentos:

  • La dirección de la memoria.
  • Byte constante para llenar la memoria.
  • El número de bytes a sobrescribir.

memset devuelve un puntero al área de memoria y se puede usar en llamadas a funciones encadenadas.

#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

Artículo relacionado - C Memory