[C con Clase] puntero a una funcion

Jorge Medina jorge en bsdchile.cl
Mar Dic 30 15:33:24 CET 2008


On Mon, Dec 29, 2008 at 6:58 PM, Gonzalez Lazaro, Edgar
<edgar.gonzalezlazaro en eds.com> wrote:
> 1.- Por que declaras static la variable buf
solo por convencion no esta declarado asi en realdad es char * buff = NULL
> 2.- todo apuntador se debe inicializar a NULL.
> 3.- El entero len tiene un valor aleatorio y si sql == NULL y val == NULL
>     estaras iniciando un buffer de un tamaño aleatorio generalmente muy grande.
bueno ya puse que si un argumento viene NULL retorne NULL de inmediato;
 4.- buf nunca sera nulo.
mientras encuentre memoria no sera NULL pero si malloc falla es NULL
> 5.- que pasa si yo pongo en val "asdf or 1=1 --" ;-)
se caeria pero val siempre recibirar un campo numerico que esta en la
DB de lo contrario no habria registro ya que es el ID del registro.
>
> ________________________________
>
> De: cconclase-bounces en listas.conclase.net en nombre de Jorge Medina
> Enviado el: mar 23/12/2008 11:02
> Para: Lista de correo sobre C y C++
> Asunto: [C con Clase] puntero a una funcion
>
>
>
> hola lista
>
> Tengo un problemita con un puntero a una funcion, lo que sucede es que
> la funcion hace su trabajo pero el puntero donde espero el resultado a
> un blocke de memoria allocada no obtiene la referencia;
>
> la funcion es la siguiente:
>
> char *mdb_sql(char *sql,char *val)
> {
>    static char *buf;
>    int len;
>
>    if (sql != NULL && val != NULL)
>        len = strlen(sql)+strlen(val)+sizeof(char);
>    buf = (char *)malloc(len);
>    if(buf != NULL)
>        snprintf(buf,len,sql,val);
>    else
>        perror("mdb_strcat no memory");
>    return buf;
> }
>
> la llamada es la siguiente:
>
>            setNewState = mdb_sql("UPDATE empleado SET estado_id = 1
> WHERE empleado_id = %s",PQgetvalue(res,i,0));
>            if (setNewState == NULL)
>                continue;
>            if ( PQresultStatus(PQexec(c,setNewState)) !=
> PGRES_COMMAND_OK ) { // es aqui donde se me cae el programita y la
> variable setNewState esta completamente sin referencia
>                fprintf(stderr,"Failed Update user: %s",PQgetvalue(res, i, 1));
>            }
>
>
> eh aqui la traza:
>
> Breakpoint 1, mdb_sql (cfgsql=0x801408140 "UPDATE empleado SET
> estado_id = 1 WHERE empleado_id = %s", val=0x8014288c0 "2277") at
> src/util.c:49
> 49          if (cfgsql != NULL && val != NULL)
> (gdb) continue
> Continuing.
>
> Breakpoint 2, mdb_sql (cfgsql=0x801408140 "UPDATE empleado SET
> estado_id = 1 WHERE empleado_id = %s", val=0x8014288c0 "2277") at
> src/util.c:50
> 50              len = strlen(cfgsql)+strlen(val)+sizeof(char);
> (gdb) continue
> Continuing.
>
> Breakpoint 3, mdb_sql (cfgsql=0x8014288c5
> "gelatos.cl/istegmaier/Maildir", val=0x39 <Error reading address 0x39:
> Bad address>) at src/util.c:51
> 51          buf = (char *)malloc(len);
> (gdb) continue
> Continuing.
>
> Breakpoint 4, mdb_sql (cfgsql=0x801408140 "UPDATE empleado SET
> estado_id = 1 WHERE empleado_id = %s", val=0x8014288c0 "2277") at
> src/util.c:52
> 52          if(buf != NULL)
> (gdb) continue
> Continuing.
>
> Breakpoint 5, mdb_sql (cfgsql=0x801408140 "UPDATE empleado SET
> estado_id = 1 WHERE empleado_id = %s", val=0x8014288c0 "2277") at
> src/util.c:53
> 53              snprintf(buf,len,cfgsql,val);
> (gdb) continue
> Continuing.
>
> Breakpoint 8, mdb_sql (cfgsql=0x801408140 "UPDATE empleado SET
> estado_id = 1 WHERE empleado_id = %s", val=0x8014288c0 "2277") at
> src/util.c:57
> 57      }
> (gdb) p buf
> $8 = 0x801408040 "UPDATE empleado SET estado_id = 1 WHERE empleado_id = 2277"
> (gdb) continue
> Continuing.
>
> Breakpoint 9, findNewAcounts () at src/mdbuilder.c:118
> 118                 if ( PQresultStatus(PQexec(c,setNewState)) !=
> PGRES_COMMAND_OK ) {
> (gdb) continue
> Continuing.
>
> Program received signal SIGSEGV, Segmentation fault.
> 0x000000080093f572 in strlen () from /lib/libc.so.7
>
>
> Cualquier sugerencia gracias;
>
> --
> Jorge Andrés Medina Oliva.
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>



-- 
Jorge Andrés Medina Oliva.




Más información sobre la lista de distribución Cconclase