From: | Mario González Troncoso <gonzalemario(at)gmail(dot)com> |
---|---|
To: | Fernando Magariños <mancha(dot)at(dot)me(at)gmail(dot)com> |
Cc: | Jaime Soler <jaime(dot)soler(at)gmail(dot)com>, pgsql-es-ayuda(at)lists(dot)postgresql(dot)org |
Subject: | Re: Segmentation fault en una función en C |
Date: | 2024-08-27 19:48:29 |
Message-ID: | CAFsReFWVg=JMpPMHVeioDNtsXbTmcxxh5QC9rrR3ddkOPrBMWQ@mail.gmail.com |
Views: | Whole Thread | Raw Message | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-es-ayuda |
On Tue, 27 Aug 2024 at 15:33, Fernando Magariños <mancha(dot)at(dot)me(at)gmail(dot)com> wrote:
>
> On Tue, Aug 27, 2024 at 1:03 PM Fernando Magariños <mancha(dot)at(dot)me(at)gmail(dot)com> wrote:
>>
>> On Tue, Aug 27, 2024 at 3:10 AM Jaime Soler <jaime(dot)soler(at)gmail(dot)com> wrote:
>>>
>>> En tu caso, tu función devuelve un número variable de elementos y no veo que reserves memoria para ellos de forma variable , puedes mirar el código de la función del enlace https://github.com/postgres/postgres/blob/master/src/tutorial/funcs.c#L89-L103 y que te guíe en la reserva de memoria y ampliación de la misma cuando los resultados de la consulta son variables.
>
>
> Perdón, olvidé poner esto:
>
> PG_FUNCTION_INFO_V1(c_crea_curp);
>
> Datum c_crea_curp(PG_FUNCTION_ARGS)
> {
> text *nom = PG_GETARG_TEXT_PP(0);
> text *pat = PG_GETARG_TEXT_PP(1);
> /* text *mat = PG_GETARG_TEXT_PP(2); */
> /* int32 ent = PG_GETARG_INT32(3); */
> /* text *genero = PG_GETARG_TEXT_PP(4); */
> /* text *fn = PG_GETARG_TEXT_PP(5); */
> /* text *hm = PG_GETARG_TEXT_PP(6); */
>
> char *nombre, *apepat, *apemat, *sexo, *fecnac, *lahm;
>
Es difícil hacer la depuración con solo un trozo de código. El
segfault lo debes estar generando por un overflow. Por ejemplo si
entiendo bien, estás utilizando 2 tipos de límites para copiar y otro
diferente para pedir memoria. Estos no tienen porqué ser iguales por
lo que eso puede llevar a ese tipo de error dependiendo del sistema
operativo y del compilador. Cuando pasaste de Postgres 9 a v15,
utilizaste la misma versión de gcc?
Lo otro, creo que deberias tambien llamar a pfree() a los argumentos
que devuelve PG_GETARG_TEXT_PP[1]
[1] https://www.postgresql.org/docs/current/spi-examples.html
> nombre = (char *) palloc(MAX_STR);
> memcpy(text_to_cstring(nom), nombre, VARSIZE_ANY_EXHDR(nom));
> apepat = (char *) palloc(MAX_STR);
> memcpy(text_to_cstring(pat), apepat, VARSIZE_ANY_EXHDR(pat));
> /* apemat = (char *) palloc(MAX_STR); */
> /* memcpy(text_to_cstring(mat), apemat, VARSIZE_ANY_EXHDR(mat)); */
> /* sexo = (char *) palloc(MAX_STR); */
> /* memcpy(text_to_cstring(genero), sexo, VARSIZE_ANY_EXHDR(genero)); */
> /* fecnac = (char *) palloc(MAX_STR); */
> /* memcpy(text_to_cstring(fn), fecnac, VARSIZE_ANY_EXHDR(fn)); */
> /* lahm = (char *) palloc(MAX_STR); */
> /* memcpy(text_to_cstring(hm), lahm, VARSIZE_ANY_EXHDR(hm)); */
>
> pfree(nombre);
> pfree(apepat);
> /* pfree(apemat); */
> /* pfree(apemat); */
> /* pfree(sexo); */
> /* pfree(fecnac); */
> /* pfree(lahm); */
>
> PG_RETURN_NULL();
> }
>
> es decir, que sólo reciba 2 argumentos, funciona perfectamente y «procesa» los 71 millones de registros de la base de pruebas. Si lo hago con tres argumentos, truena igual que en el caso de los siete argumentos.
>
> Lo más curioso del asunto es que la versión original se compone de cuatro funciones que funcionaban estupendamente en PostgreSQL versiones 9 y 10, los problemas comenzaron al compilarlo y probarlo para la versión 15.7, por esto construí ejemplos cada vez más pequeños, luego de leer el código de los contrib y tutorial.
>
> Una duda para el moderador. Originalmente esta inscrito en la lista con la dirección mancha(at)mac(dot)com, pero es un engorro las cuentas en Apple, si no las usas con equipos Apple y por eso la redireccioné a mancha(dot)at(dot)me(at)gmail(dot)com, pero al escribir a la lista, pues me envía a moderación y no recuerdo cómo suscribirme para hacerlo desde otra dirección.
>
> --
> Saludos.
>
>
>
From | Date | Subject | |
---|---|---|---|
Next Message | Fernando Magariños | 2024-08-27 20:12:11 | Re: Segmentation fault en una función en C |
Previous Message | Fernando Magariños | 2024-08-27 19:16:58 | Re: Segmentation fault en una función en C |