elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Direccion de memoria + numero != Direccion de memoria esperada
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Direccion de memoria + numero != Direccion de memoria esperada  (Leído 2,378 veces)
dgrip

Desconectado Desconectado

Mensajes: 5


Eres la media de los cinco que te rodean.


Ver Perfil
Direccion de memoria + numero != Direccion de memoria esperada
« en: 21 Abril 2019, 18:09 pm »

Hola,

No sabia que poner en el titulo asi que he puesto lo que me ocurre xd.

Mi problema es el siguiente:
Estoy haciendo un `parseador` de json con instrucciones SSE y tal para ver si hay una diferencia notable entre indexarlos usando SSE4.2 o recorriendo arrays. El problema surge cuando tengo una variable `vv` que quiero que apunte a `v->ao + offset`. `v` es la estructura que contiene los valores de cada json, v->ao es un campo que apunta al siguiente valor del json, la estructura queda asi:
Código
  1. struct _json_value {
  2.  json_type type:3;
  3.  unsigned is_key:1;
  4.  
  5.  size_t len, cap; // len and cap (in bytes) of the key value.
  6.  uchar_t *s; // key field.
  7.  
  8.  size_t ulen, ucap; // len and cap (in bytes) of the union value (number, string or object/array).
  9.  union {
  10.    unsigned b:1;           // boolean value
  11.    long int n;             // int value
  12.    double d;               // float value
  13.    struct _json_value *ao; // string, array or object
  14.  };
  15. } ALIGNED(8);
  16.  

como se puede ver en la union esta el campo *ao, que en caso de ser un valor apuntara al siguiente. Por ejemplo el json `{ "key": "value" }, sera esto:
Código
  1. _json_value {
  2.  type = STRING,
  3.  is_key = 1,
  4.  len = 3, cap = 3,
  5.  s = "key",
  6.  ulen = sizeof(struct _json_value),
  7.  ucap = sizeof(struct _json_value),
  8.  ao = _json_value {
  9.    type = STRING,
  10.    is_key = 0,
  11.    len = 5, cap = 5,
  12.    s = "value",
  13.    ulen = 0, ucap = 0,
  14.    nil,
  15.  }
  16. }
  17.  

A la hora de decodificar los arrays y los objectos guardo un array de _json_value en v->ao, por tanto v->ao = malloc(sizeof(struct _json_value)*x). El puntero va cambiando el tamaño por cada valor nuevo que se inserta.
Explicado el contexto... el error es el siguiente:




Ocurre en la linea 209 (por eso el breakpoint ahi). v->ulen indica el tamaño del puntero de v->ao (eso esta bien), lo que no entiendo es por que v->ao + v->ulen = v->ao+3136, cuando v->ulen = 56.
Por supuesto, como esto no tiene logica, el resultado del programa esta mal. Si alguien consigue encontrar el error.
En cuanto al codigo... no voy a subirlo a Github de momento, asi que no se puede consultar, ya lo hare cuando vea conveniente, ahora no esta decente.

Gracias.


« Última modificación: 21 Abril 2019, 18:15 pm por dgrip » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Direccion de memoria + numero != Direccion de memoria esperada
« Respuesta #1 en: 21 Abril 2019, 18:38 pm »

¿Qué tal si pones el código real de la carga de las dos estructuras (externa e interna)?


En línea

dgrip

Desconectado Desconectado

Mensajes: 5


Eres la media de los cinco que te rodean.


Ver Perfil
Re: Direccion de memoria + numero != Direccion de memoria esperada
« Respuesta #2 en: 21 Abril 2019, 18:43 pm »

¿Qué tal si pones el código real de la carga de las dos estructuras (externa e interna)?

No se a que te refieres exactamente, si lo puedes preguntar de manera mas extensa... xd
Si te refieres a _json_value, tanto v como v->ao son la misma estructura.

De todas formas te pongo la funcion que hace esta operacion (que estoy debuggeando)

Código
  1. #define NEEDED(x) x+sizeof(json_value);
  2. #define INCR(x) x+=json_value;
  3. #define nil NULL

« Última modificación: 21 Abril 2019, 18:45 pm por dgrip » En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Direccion de memoria + numero != Direccion de memoria esperada
« Respuesta #3 en: 21 Abril 2019, 18:51 pm »

No tendría que ser así?
Código:
#define INCR(x) x+=sizeof(json_value);
En línea

dgrip

Desconectado Desconectado

Mensajes: 5


Eres la media de los cinco que te rodean.


Ver Perfil
Re: Direccion de memoria + numero != Direccion de memoria esperada
« Respuesta #4 en: 21 Abril 2019, 18:55 pm »

No tendría que ser así?
Código:
#define INCR(x) x+=sizeof(json_value);

Si, perdona, me he confundido escribiendo. De todas formas el fallo no está ahi
En línea

dgrip

Desconectado Desconectado

Mensajes: 5


Eres la media de los cinco que te rodean.


Ver Perfil
Re: Direccion de memoria + numero != Direccion de memoria esperada
« Respuesta #5 en: 21 Abril 2019, 23:56 pm »

Código:
[code]
Ya he encontrado el error...
Al parecer C es de tan alto nivel que cuando sumas un puntero que tiene una estructura definida (como pasa con _json_value) lo que hace es sumarlo en funcion del numero que le pasas, por tanto:

sizeof(_json_value) = 56;
_json_value += 2 = sizeof(json_value) * 2;

Vaya, que se soluciona poniendo `v->ao += v->ulen/sizeof(json_value)` o `v->ao += ((void *)v->ao) + v->ulen[/code]
« Última modificación: 22 Abril 2019, 12:54 pm por dgrip » En línea

RayR

Desconectado Desconectado

Mensajes: 239


Ver Perfil
Re: Direccion de memoria + numero != Direccion de memoria esperada
« Respuesta #6 en: 22 Abril 2019, 03:23 am »

Ojo, que usar la segunda forma:

Código:
((void *)v->ao) + v->ulen

es riesgosa. Tanto en C y C++  no es válido efectuar aritmética de punteros con punteros void. Aunque algún compilador pueda permitirlo, no hay garantía de que siempre funcione, y es el tipo de cosas con las que los compiladores frecuentemente rompen compatibilidad. Para avanzar por un puntero en términos de bytes, mejor hacer el cast a puntero char, que es legal en C/C++.
En línea

dgrip

Desconectado Desconectado

Mensajes: 5


Eres la media de los cinco que te rodean.


Ver Perfil
Re: Direccion de memoria + numero != Direccion de memoria esperada
« Respuesta #7 en: 22 Abril 2019, 12:55 pm »

Ojo, que usar la segunda forma:

Código:
((void *)v->ao) + v->ulen

es riesgosa. Tanto en C y C++  no es válido efectuar aritmética de punteros con punteros void. Aunque algún compilador pueda permitirlo, no hay garantía de que siempre funcione, y es el tipo de cosas con las que los compiladores frecuentemente rompen compatibilidad. Para avanzar por un puntero en términos de bytes, mejor hacer el cast a puntero char, que es legal en C/C++.

Aunque pueda no aplicarse a todos los compiladores que se van a usar (xd) tienes razon, usare mejor `char`.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
imprimir los bits que hay en una direccion de memoria « 1 2 »
ASM
lapras 11 10,363 Último mensaje 4 Diciembre 2009, 16:26 pm
por Yurix
Darle la vuelta a una direccion de memoria.
Análisis y Diseño de Malware
0xDani 2 2,673 Último mensaje 2 Diciembre 2012, 21:02 pm
por 0xDani
Problema representación dirección de memoria en C.
Programación C/C++
lanun 6 2,529 Último mensaje 28 Febrero 2014, 19:44 pm
por lanun
Ubicación de una dirección especifica de memoria
Foro Libre
RamsesML 0 1,172 Último mensaje 3 Agosto 2015, 05:18 am
por RamsesML
Frame y dirección de memoria.
Programación C/C++
LaiaxanIV 2 1,514 Último mensaje 1 Abril 2016, 19:26 pm
por LaiaxanIV
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines