Skip to content

Instantly share code, notes, and snippets.

@mgarciaisaia
Last active April 14, 2020 11:46
Show Gist options
  • Save mgarciaisaia/57fcca5849f3dbbef0a7d8ae5318793b to your computer and use it in GitHub Desktop.
Save mgarciaisaia/57fcca5849f3dbbef0a7d8ae5318793b to your computer and use it in GitHub Desktop.
`printf` y `log_info` con un format string variable

printf recibe uno o más parámetros, el primero de los cuales es un string de formato, indicando "la plantilla" del mensaje a imprimir. Dependiendo de ese formato, la función puede esperar más parámetros, para interpolarlos según indiquen sus conversiones (las directivas que arrancan con % como %s o %d).

Debido a que el comportamiento de la función cambia según ese formato que reciba (en particular, los accesos a memoria que se intenten realizar), usar un formato variable sin argumentos con printf genera un warning de seguridad del compilador.

Las funciones de log de las commons sufren un problema similar, sólo que no generan el warning (en lo que podríamos considerar un bug de la biblioteca).

$ gcc some_log.c -o some_log -lcommons
some_log.c: In function 'main':
some_log.c:8:3: warning: format not a string literal and no format arguments [-Wformat-security]
printf(message);
^
$ ./some_log
This is a string[INFO] 08:29:03:616 test/(1714:1714): This is a string
$
#include <stdio.h>
#include <commons/log.h>
int main(void) {
char *message = "This is a string";
t_log *logger = log_create("./test.log", "test", 1, LOG_LEVEL_TRACE);
printf(message);
log_info(logger, message);
log_destroy(logger);
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment