Detectar fugas de memoria en Visual Studio

Publicado en C/C++, Windows el 10 de March, 2010 por Fran. (Sin comentarios)

Para los que programen en C con Visual Studio y sientan añoranza de valgrind, aquí están los pasos sobre cómo detectar fugas de memoria (memory leaks) en Visual Studio:

  • Añadir la macro _CRTDBG_MAP_ALLOC del preprocesador, ya sea definiéndola en algún archivo del proyecto o en las opciones de compilación del proyecto.
  • Incluir en el siguiente orden stdlib.h y crtdbg.h en los archivos dónde se busquen las fugas de memoria. El archivo crtdgb.h sustituye las funciones malloc y free por unas propias que registran la memoria reservada y liberada.
  • Añadir la función _CrtDumpMemoryLeaks () al final del programa en el que se buscan las fugas de memoria. Esta función muestra por la salida de depuración las fugas de memoria detectadas.

Todo esto sólo funcionará cuando el proyecto se compile con la macro _DEBUG definida, es decir, en lo que debería ser para todos la versión de depuración del programa.

La macro _CRTDBG_MAP_ALLOC sirve para que la función _CrtDumpMemoryLeaks () muestre información sobre el archivo y la línea en la que se produjo la fuga de memoria.

Un pequeño ejemplo de cómo quedaría todo:

#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>

int
main (int argc, char *argv[])
{
    /* Código del programa */

    _CrtDumpMemoryLeaks ();

    return 0;
}

Si este programa tuviera alguna fuga de memoria, al compilarlo en modo depuración y ejecutar el depurador de Visual Studio, se obtendría en la salida de éste un listado con las fugas de memoria del programa.

Para más información, leed el artículo Enabling Memory Leak Detection de la MSDN.

Applets en XHTML 1.1 compatibles con IE

Publicado en (X)HTML, Windows el 26 de August, 2009 por Fran. (3 comentarios)

Creo que cualquiera que haya tenido que realizar algún tipo de web para un público amplio, ha tenido que lidiar con los problemas que da Internet Explorer (IE) al no cumplir los estándares del W3C.

Pero si encima para rematar la faena te toca insertar un applet, quieres que cumpla con XHTML 1.1 y que se vea en IE, pues acojona un poco al ver que la etiqueta applet dejó de formar parte del estándar hace ya un tiempo.

Sin más dilación, os dejo aquí el código:

<!--[if !IE]>-->
<object id="applet" name="applet" classid="java:es.4bits.applet.Applet"
 type="application/x-java-applet"
 archive="applets/Applet.jar"></object>
<!--<![endif]-->

<!--[if IE]>
<object id="applet" name="applet" code="es.4bits.applet.Applet"
 archive="applets/Applet.jar"></object>
<![endif]-->

Al final, lo único necesario es utilizar los asquerosos hacks de IE, para que no cargue la versión que no entiende de la etiqueta object y cargue la que entiende.

Basado en XHTML Strict Applets.

Cifrar una memoria USB

Publicado en Linux, Seguridad, Windows el 30 de July, 2009 por Fran. (3 comentarios)

Hace poco se me ocurrió una forma de aprovechar una memoria USB (o pendrive) antigua (de 256MB) que tenía por ahí. Simplemente, utilizarla para guardar, todo cifrado, un archivo con un listado de contraseñas, documentos personales, claves GPG y/o SSH, …

Así que estuve buscando diferentes opciones, siendo importante que funcionase en Linux y en Windows (por si las moscas). Al final había dos opciones Truecrypt (el archiconocido) y dm-crypt (un gestor de dispositivos cifrados de Linux), me decanté por dm-crypt porque Truecrypt, curiosamente, no está en los repositorios de Debian y porque con dm-crypt no necesitaría de un programa a parte para utilizar mi dispositivo en Linux (aunque sí, en Windows).

Pasos a seguir

Directo al grano, estos son los pasos que realicé:

  1. Paquetes necesarios:
    # apt-get install cryptsetup hashalot dmsetup
  2. Rellenar la memoria con datos aleatorios (no es necesario, aunque sí recomendable):
    # dd if=/dev/urandom of=/dev/sdX
  3. Cargar los siguientes módulos si no lo están ya:
    # modprobe aes
    # modprobe dm_crypt
    # modprobe dm_mod
    # modprobe sha256
  4. Crear el contenedor cifrado (pedirá la contraseña para poder luego descifrarlo):
    # cryptsetup -v --key-size 256 luksFormat /dev/sdX NOMBRE-CONTENEDOR
  5. Formatear el contenedor (yo utilicé FAT para que funcione en Windows) para ello primero hay que montar el contenedor utilizando cryptsetup:
    # cryptsetup -v luksOpen /dev/sdX NOMBRE-CONTENEDOR
    # mkfs.vfat /dev/mapper/NOMBRE-CONTENEDOR
  6. Y ya está, ya se puede montar:
    # mount -t vfat /dev/mapper/NOMBRE-CONTENEDOR /mnt/usb_cifrado

Leer el resto »

Windows System Programming

Publicado en C/C++, Libros, Windows el 30 de June, 2009 por Fran. (1 comentario)

Windows System ProgrammingWindows System Programming es un libro de introducción a la programación sobre Windows (Win32, aunque hay una breve introducción a Win64), con el lenguaje C.

He de decir que este libro no me ha sorprendido mucho, ya que en cuanto llevas algo de tiempo programando sobre Win32 y visitando la MSDN a menudo, te acabas conociendo las partes más utilizadas. Además, este libro es bastante antiguo (del 2004).

En general, no me convence la forma de explicar los temas por parte del autor, casi todos los capítulos se limita a copiar las diferentes funciones que se utilizan para hacer lo que sea, y a explicar cada uno de sus parámetros. Por lo que el libro se transforma en una especie de resumen de la MSDN.

De todo el contenido del libro me quedaría con los capítulos sobre los servicios de Windows y las estructuras de seguridad (SIDs, ACLs, ACEs) de Windows.

Aún así, puede servir como punto de partida para empezar a programar sobre Windows utilizando Win32, si no fuera por las pegas que he comentado.

Recomendación: Baja.
Nivel: Medio.
Idioma: Inglés.

Compartir directorios con Samba

Publicado en Linux, Windows el 8 de June, 2009 por Fran. (3 comentarios)

En el anterior post explicaba cómo compartir impresoras con Samba. Como sé que os gustó, hoy os explico cómo compartir directorios con Samba.

Instrucciones

Voy a partir de qué tenemos la siguiente estructura de directorios que se quiere compartir:

drwxr-x--- user group dir01
drwxr-x--- user group dir02
drwxr-x--- user group dir03

Como se puede ver, a estos directorios sólo puede acceder el usuario user y los usuarios del grupo group, aunque estos últimos sólo con permisos de lectura sobre los directorios.

Lo primero que se debe hacer es añadir el usuario (o los usuarios) que podrán acceder a nuestros datos compartidos. Para ello se ejecuta:

# smbpasswd -a user

Nos pedirá una contraseña, ésta puede ser distinta a la que tenga el usuario para acceder a la máquina.

Una vez añadido el usuario (o los usuarios), se podrá configurar Samba para que comparta los directorios. Para ello se modifica el archivo /etc/samba/smb.conf y se añade un elemento del siguiente tipo por cada directorio a compartir:

[nombre_directorio_a_compartir]
  comment = Comentario del directorio compartido
  path = /ruta/al/directorio
  read only = yes # Indica si el acceso será sólo lectura
  write list = user # Indica los usuarios/grupos que tendrán acceso de escritura
  create mask = 0640 # Máscara de los permisos al crear archivos
  directory mask = 0750 # Máscara de los permisos al crear directorios
  guest ok = no # Acceso sin autenticación

De este modo, para el ejemplo que he puesto se tendrían que añadir tres elementos de este tipo, quedando el archivo similar a este:

[global]
  display charset = UTF-8
  server string = NOMBRE-DE-LA-MAQUINA
  workgroup = GRUPO-DE-TRABAJO
  netbios name = NOMBRE-NETBIOS-MAQUINA
  invalid users = root # Para que no se pueda acceder como root

[dir01]
  comment = Directorio 01
  path = /home/user/dir01
  read only = yes
  write list = user
  create mask = 0640
  directory mask = 0750
  guest ok = no

[dir02]
  comment = Directorio 02
  path = /home/user/dir02
  read only = yes
  write list = user
  create mask = 0640
  directory mask = 0750
  guest ok = no

[dir03]
  comment = Directorio 03
  path = /home/user/dir03
  read only = yes
  write list = user
  create mask = 0640
  directory mask = 0750
  guest ok = no

Después de esto sólo hay que reiniciar Samba y listo, ya se podrá acceder a dichos directorios compartidos utilizando el usuario user.

# /etc/init.d/samba restart

Basado en Compartir directorios con Samba del blog de Iván López.