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

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


  Mostrar Temas
Páginas: [1]
1  Programación / Programación C/C++ / 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.
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines