Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

575
Views
memcpy unsigned int a error de segmentación de caracteres sin firmar

Me gustaría copiar 4 bytes de un int sin firmar a una matriz de caracteres sin firmar. Una vez ejecutada, la siguiente función get_result va a la falla de segmentación:

 int exec_cmd(unsigned int * apu32Var) { int ret = -1; char cmd[100] = { 0 }; char resp[100] = { 0 }; sprintf(cmd, "%s %s", "/home/send_frames.sh", "read"); ret = exec_cmd_ret_result(cmd, resp); if( apu32Var != NULL ) { *apu32Var = (((unsigned int)resp[0]) <<24)+(((unsigned int)resp[1]) <<16)+(((unsigned int)resp[2]) <<8)+(unsigned int)resp[3]; } return ret; } int get_result(unsigned char * buffer, unsigned short * size) { unsigned int u32Var = 0; exec_cmd(&u32Var); memcpy(buffer, &u32Var, sizeof(unsigned int)); *size += sizeof(unsigned int); return 0; } int main(int argc, char **argv) { unsigned char *buf; unsigned short *size; get_result(buf+4, size); return 0; }

Sin embargo, con respecto a la página de manual de memcpy(), parece que memcpy() está bien administrado. ¿Qué está yendo mal?

over 4 years ago · Santiago Trujillo
2 answers
Answer question

0

Suponiendo que su llamada a test_result en realidad debería llamar a get_result , entonces tiene dos grandes problemas.

La primera y más grave es que pasa variables locales no inicializadas como argumentos a la función. Las variables locales no inicializadas tienen valores indeterminados . Para un puntero, significa que puede apuntar a casi cualquier lugar, y tratar de desreferenciarlo conducirá a un comportamiento indefinido . Debe hacer que estos punteros apunten a algún lugar válido para que funcione. Esto va para ambas variables.

El segundo problema es que no comprende cómo funciona la emulación de paso por referencia en C. Sí, la función debe tomar un puntero, pero en realidad no debe crear una variable de puntero y pasar a la función. En su lugar, debe usar el operador de dirección & en una variable que no sea de puntero.

Para resolver ambos problemas, su código debería verse algo como

 unsigned char buf[256] = { 0 }; // Arbitrary size, all initialized to zero unsigned short size = 0; // To make sure it's properly initialized get_result(buf + 4, &size); // Note use of & to pass a pointer to the variable size

Tenga en cuenta que funciona con una matriz, ya que las matrices se descomponen naturalmente en punteros a su primer elemento.

over 4 years ago · Santiago Trujillo Report

0

buf en main nunca se inicializa, por lo que apunta a una ubicación aleatoria en la memoria. Este es un comportamiento indefinido y una receta perfecta para una falla de segmento.

De manera similar, *size se lee cuando usa += , pero el valor nunca se inicializó en main , por lo que su desreferencia es un valor indefinido.

Debe declarar buf como una matriz de tamaño suficiente y pasarla. Además, declare size como un int , inicialícelo en 0 y pase su dirección:

 int main(int argc, char **argv) { unsigned char buf[100]; unsigned short size = 0; // I'm assuming this was a typo and you ment to call get_result instead of test_result get_result(buf, &size); return 0; }
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!