¿Cómo obtener qué código fuente ofensor y líneas en C Runtime? -- ampo con pointers campo con runtime-error campo con static-analysis campo con dereference camp Relacionados El problema

How to get which offending source code and lines on C runtime?


1
vote

problema

Español

Estoy usando este código y Uthash ( uthash-dev en Ubuntu)

  // uthash.c #include <string.h>  /* strcpy */ #include <stdlib.h>  /* malloc */ #include <stdio.h>   /* printf */ #include "uthash.h"  const int MAX_DATA = 1230000;  struct kv {     char *key;     double val;     UT_hash_handle hh; };  char i2ch[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'B', 'c', 'D', 'e', 'F'};  int get_first_digit(double d) {     while(d > 10) {         d /= 10;     }     return (int)(d); } char* to_rhex(int v) {     char* hex = malloc(sizeof(char)*9); // because INT_MAX can be divided by 16 maximum 8 times     memset(hex,0,9);     int ctr = 0;     do {         hex[ctr++] = i2ch[v%16];         v /= 16;     } while(v > 0);     return hex; }  char* to_str(int v) {     int len = snprintf(NULL,0,"%d",v);     char *res = malloc(len+1);     snprintf(res, len+1, "%d", v);       return res; }  int set_or_inc(struct kv** m, char* key, int set, int inc, int *ctr) {     struct kv* item = 0;     HASH_FIND_STR(*m, key, item);     if(!item) {         item = malloc(sizeof(*item));         item->key = key;         item->val = (double)(set);         HASH_ADD_KEYPTR(hh, *m, item->key, strlen(item->key), item) ;         return 0;     } else {         item->val += (double)(inc);         *ctr += 1;         return 1; // key not used     } } int main() {     struct kv *m = NULL;     int dup1 =0, dup2 =0, dup3 =0;     for(int z = MAX_DATA; z > 0; z--) {         int val2 = MAX_DATA - z;         int val3 = MAX_DATA*2 - z;         char *key1 = to_str(z);         char *key2 = to_str(val2);         char *key3 = to_rhex(val3);         if(set_or_inc(&m, key1, z, val2, &dup1)) free(key1);         if(set_or_inc(&m, key2, val2, val3, &dup2)) free(key2);         if(set_or_inc(&m, key3, val3, z, &dup3)) free(key3);     }     printf("%d %d %d ",dup1, dup2, dup3);     int total = 0, verify = 0, count = 0;     struct kv *tmp, *item;     HASH_ITER(hh, m, item, tmp) {         total += get_first_digit(item->val);         verify += strlen(item->key);         count += 1;         HASH_DEL(m,item);         free(item->key);         free(item);     }     printf("%d %d %d ",total, verify, count); }   

Cuando use TCC con cheque enlazado:

  time tcc -b -g -run uthash.c bcheck.c __bound_ptr_indir8: 0x7fff3cd67ec8 is outside of the region Runtime error: dereferencing invalid pointer at 0x5626cfebe9b5 set_or_inc() by 0x5626cfec15e9 main() Command exited with non-zero status 255  CPU: 0.00s      Real: 0.00s     RAM: 3480KB   

Ejecución directa (no hay problema cuando se verifica con valgrind -s --track-origins=yes --keep-stacktraces=alloc-and-free6 ):

  time tcc -run uthash.c 637912 641149 67002 3808703 14182513 2343937 Command exited with non-zero status 25  CPU: 2.52s      Real: 2.60s     RAM: 292144KB   

Cuando se usa GCC (tampoco, no hay error de tiempo de ejecución al usar -fstack-protector-all bandera):

  gcc uthash.c && time ./a.out 637912 641149 67002 3808703 14182513 2343937  CPU: 2.47s      Real: 2.57s     RAM: 290492KB   

Cuando use Clang (tampoco sin error de tiempo de ejecución al usar # Uncomment following line if your webserver's URL # is not directly related to physical file paths. # Update Your Joomla! Directory (just / for root) # RewriteBase / ########## Begin - Joomla! core SEF Section 0 Flag):

  #  Uncomment following line if your webserver's URL #  is not directly related to physical file paths. #  Update Your Joomla! Directory (just / for root)  # RewriteBase /     ########## Begin - Joomla! core SEF Section 111  

Solo cuando se usa # Uncomment following line if your webserver's URL # is not directly related to physical file paths. # Update Your Joomla! Directory (just / for root) # RewriteBase / ########## Begin - Joomla! core SEF Section 2 Muestra ese error en el tiempo de ejecución, ¿cómo podría saber qué número de línea es la causa?

Original en ingles

I'm using this code and uthash (uthash-dev in ubuntu)

// uthash.c #include <string.h>  /* strcpy */ #include <stdlib.h>  /* malloc */ #include <stdio.h>   /* printf */ #include "uthash.h"  const int MAX_DATA = 1230000;  struct kv {     char *key;     double val;     UT_hash_handle hh; };  char i2ch[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'B', 'c', 'D', 'e', 'F'};  int get_first_digit(double d) {     while(d > 10) {         d /= 10;     }     return (int)(d); } char* to_rhex(int v) {     char* hex = malloc(sizeof(char)*9); // because INT_MAX can be divided by 16 maximum 8 times     memset(hex,0,9);     int ctr = 0;     do {         hex[ctr++] = i2ch[v%16];         v /= 16;     } while(v > 0);     return hex; }  char* to_str(int v) {     int len = snprintf(NULL,0,"%d",v);     char *res = malloc(len+1);     snprintf(res, len+1, "%d", v);       return res; }  int set_or_inc(struct kv** m, char* key, int set, int inc, int *ctr) {     struct kv* item = 0;     HASH_FIND_STR(*m, key, item);     if(!item) {         item = malloc(sizeof(*item));         item->key = key;         item->val = (double)(set);         HASH_ADD_KEYPTR(hh, *m, item->key, strlen(item->key), item) ;         return 0;     } else {         item->val += (double)(inc);         *ctr += 1;         return 1; // key not used     } } int main() {     struct kv *m = NULL;     int dup1 =0, dup2 =0, dup3 =0;     for(int z = MAX_DATA; z > 0; z--) {         int val2 = MAX_DATA - z;         int val3 = MAX_DATA*2 - z;         char *key1 = to_str(z);         char *key2 = to_str(val2);         char *key3 = to_rhex(val3);         if(set_or_inc(&m, key1, z, val2, &dup1)) free(key1);         if(set_or_inc(&m, key2, val2, val3, &dup2)) free(key2);         if(set_or_inc(&m, key3, val3, z, &dup3)) free(key3);     }     printf("%d %d %d\n",dup1, dup2, dup3);     int total = 0, verify = 0, count = 0;     struct kv *tmp, *item;     HASH_ITER(hh, m, item, tmp) {         total += get_first_digit(item->val);         verify += strlen(item->key);         count += 1;         HASH_DEL(m,item);         free(item->key);         free(item);     }     printf("%d %d %d\n",total, verify, count); } 

when using tcc with bound check:

time tcc -b -g -run uthash.c bcheck.c __bound_ptr_indir8: 0x7fff3cd67ec8 is outside of the region Runtime error: dereferencing invalid pointer at 0x5626cfebe9b5 set_or_inc() by 0x5626cfec15e9 main() Command exited with non-zero status 255  CPU: 0.00s      Real: 0.00s     RAM: 3480KB 

direct running (no problem when checked with valgrind -s --track-origins=yes --keep-stacktraces=alloc-and-free):

time tcc -run uthash.c 637912 641149 67002 3808703 14182513 2343937 Command exited with non-zero status 25  CPU: 2.52s      Real: 2.60s     RAM: 292144KB 

when using gcc (also no runtime error when using -fstack-protector-all flag):

gcc uthash.c && time ./a.out 637912 641149 67002 3808703 14182513 2343937  CPU: 2.47s      Real: 2.57s     RAM: 290492KB 

when using clang (also no runtime error when using -fsanitize=address flag):

clang uthash.c && time ./a.out 637912 641149 67002 3808703 14182513 2343937  CPU: 2.50s      Real: 2.59s     RAM: 290448KB 

Only when using tcc it shows that error on runtime, how could I know which line number is the cause?

              
   
   

Lista de respuestas


Relacionados problema

0  ¿Qué es "No se puede manejar la solicitud de paginación del kernel a 00000000313337000"  ( What is unable to handle kernel paging request at 00000000313337000 ) 
Yo quería trabajar a través de este estudio independiente http: //security.cs.rpi .edu / ~ candej2 / syllabus.pdf Yo mismo para recoger algunos conceptos bá...

3  Error: En C, consiguió el error "Dereferencing Pointer a tipo incompleto" en un puntero de estructura  ( Error in c got the error dereferencing pointer to incomplete type in a struc ) 
¡Hola a todos! Obtuve el siguiente error, mientras intentas probar un código para el juego Clever Frog: Error: Dereferencing Pointer a tipo incompleto ...

12  PTR-> HELLO (); / * Versus * / (* PTR) .HELLO ();  ( Ptr hello versus ptr hello ) 
Estaba aprendiendo sobre los punteros de C ++ y el operador -> me pareció extraño. En vez de ptr->hello(); One podría escribir (*ptr).hello(); porque ta...

1  Problema con la deferencia de los punteros  ( Issue with dereferencing of pointers ) 
Recibo un error al intentar asignar un valor a un puntero. He definido 2 estructuras: typedef struct { struct player *next; //pointers struct pla...

2  C ++ rastreo de valor de tipo primitivo cambia  ( C tracking primitive type value change ) 
Tengo un programa complejo con errores extraños de que un valor int se reduce a cero inesperadamente. Así que quiero rastrear este valor de tipo incorporado...

0  Obtención de doble valor fuera de la matriz, iPhone  ( Obtaining double value out of array iphone ) 
NSDecimalNumber *lat = [[NSDecimalNumber alloc]initWithDouble:sqlite3_column_double(selectStatement, 1)]; [latt addObject:lat]; [la...

0  lo que es * P cuando P se declara INT (*) [tamaño] y asignado a una matriz  ( Whats p when p is declared as int size and assigned to an array ) 
Código: int arr[5] = {1,2,3,4,5}; int (*p)[5] = &arr; printf("p:%p ",p); printf("*p:%p ",*p); Resultado: p = *p = arr = 0x7ffee517c830 Son todas las ...

1  ¿Cómo devuelvo una matriz y un hashref?  ( How do i return an array and a hashref ) 
Quiero hacer una subrutina que agregue elementos (claves con valores) a un hash previamente definido. Esta subrutina se llama en un bucle, por lo que el hash ...

-2  Manera limpia de acceder a una estructura de datos anidados  ( Clean way to access a nested data structure ) 
Tengo un segmento de código que, aunque funciona, no se parece a una manera limpia de hacer las cosas. Construyo la estructura usando: foreach my $n (@n...

0  ¿Expandiendo variables en una cadena de AHK?  ( Expanding variables in an ahk string ) 
Estoy atascado tratando de averiguar cómo ampliar las variables en una cadena AutoHotkey. En mi caso específico, leí una línea de un archivo y lo ejecuto. La ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos