Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

294
Visualizações
¿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 Respostas
Responde à pergunta

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda