Ésto es de gran ayuda, pero muchas veces no es suficiente.
Así que se me ocurrió programar esta función(que también fue usada en un sistema anti-freeze que hice hace algún tiempo).
Convierte una cadena de caracteres en un integro(desde una longitud seleccionada), y a diferencia de un simple sprintf no produce desbordamiento de integro(ni de ningún tipo), si la sucesión del buffer son más caracteres, solo toma el numero ignorando el resto.
Código:
/*
Autor: NvK
Nombre funcion : buff_to_strint
Funcion: Convierte una string dentro de un buffer a un integro.
Fecha: domingo 12 enero 2014.
*/
static int32_t __attribute__((__section__(".text.data")))
buff_to_strint(char *str, char *type_str)
{
int base_int;
char buff[1024];
strncpy(buff, str+strlen(type_str), strlen(str)-0x1);
return simple_strtol((const char*)buff, NULL, base_int);
}
Ejemplo de uso en un driver:#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/sched.h>
static int __section(.init.text) __cold notrace INIT_KERNEL(void)
{
char s[]="{CADENA}50{OTRA_CADENA}";
int x= buff_to_strint(s, "{CADENA}");
printk(KERN_INFO "\n valor de x:%d", x);
return 0x0;
}
static void __section(.exit.data) EXIT_KERNEL(void)
{
// fin de seccion
}
module_init(INIT_KERNEL);
module_exit(EXIT_KERNEL);
Ésto da como resultado 50, como ven, selecciono desde donde copiar(osea "{CADENA}"), y cuando encuentra el integro ignora lo que hay después sin generar desbordamientos...Otro ejemplo:
static int __section(.init.text) __cold notrace INIT_KERNEL(void)
{
char s[]="[MAS_TEXTO]50<$IGNORADO@>";
int x= buff_to_strint(s, "[MAS_TEXTO]") + 50;
printk(KERN_INFO "\n valor de x:%d", x);
return 0x0;
}
En este ejemplo además de ignorar "[MAS_TEXTO]" suma el resultante con 50, dando como resultado 100.Espero que les sirva, y hasta otra.