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

293
Views
¿Hay alguna manera de decirle al analizador de sonido metálico que una función devuelve la memoria malloc ()?

Estoy trabajando en una biblioteca pequeña en la que no quiero lidiar con errores de asignación dondequiera que puedan aparecer, así que he escrito un envoltorio alrededor de malloc() que finaliza el programa (por ahora) si ocurre un error.

 void *cstr_malloc(size_t size) { void *buf = malloc(size); if (!buf) { fprintf(stderr, "Allocation error, terminating\n"); exit(2); } return buf; }

Nada lujoso allí. Ahora, sin embargo, noté que el analizador estático clang, al menos en Xcode, no detecta fugas obvias que habría hecho antes.

Si hago algo como esto:

 void foo(void) { void *p = malloc(100); }

naturalmente me informaría que p probablemente perdería memoria.

Sin embargo, con

 void foo(void) { void *p = malloc(100); void *q = cstr_malloc(100); }

solo informa que p , pero no q , tiene fugas.

Eso tiene sentido; no puede saber en qué lugar el programa podría asignar memoria y aun así analizarla en un tiempo razonable. Maneja bien mi asignador si lo alineo, para que pueda verlo, pero de lo contrario, no lo hace.

¿Hay alguna forma de decirle al analizador que tengo una función que devuelve memoria recién asignada? ¿Algún atributo, como __attribute__((malloc)) o similar?

Puedo, por supuesto, simplemente alinear la función, pero tengo un montón de otras funciones que asignan memoria de manera similar, y sería problemático alinearlas todas .

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

Después de algunas horas de buscar en Google, encontré lo que al menos parece una solución. El truco es usar un atributo, pero no __attribute__((malloc)) .

El atributo que necesitaba era ownership_returns(malloc) . Usando eso, recibo advertencias, al menos para esta función.

 __attribute__((ownership_returns(malloc))) void *cstr_malloc(size_t size);

Ver https://godbolt.org/z/MEfvThKnW

Desafortunadamente, mi alegría duró poco. Si uso ownership_returns(malloc) , el analizador asumirá que la memoria tampoco está inicializada, lo cual no siempre sucede. No tengo idea de cómo insinuar que devuelvo la memoria que debe liberarse, pero no la memoria no inicializada.

Dado que clang puede darse cuenta de que este es el caso de calloc() , podría haber una forma de hacerlo también para mis funciones, pero no la he encontrado.

Aquí hay un ejemplo de cómo clang trata con la memoria devuelta por calloc() y lo que piensa de lo que viene de mi propia función: https://godbolt.org/z/P45o691Tx

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!