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

109
Visualizações
¿Es seguro ignorar por completo los argumentos variados de una función C?

Tengo una función que más o menos se ve así:

 typedef struct SomeType { ... } SomeType; void TakesArgs(SomeType *t1, ...) { // iterates through arguments } // usage: TakesArgs(&a, &b, &c);

¿Corro algún riesgo extraño con la memoria (o de otro modo) si tuviera que cambiar TakesArgs a no-op, mientras sigo sin cambiar todo el código de llamada?

 void TakesArgs(SomeType *t1, ...) { return; } // usage unchanged: TakesArgs(&a, &b, &c);

En otras palabras, ¿saltar el baile va_list / va_start que se ejecutó en la implementación original tendrá algún efecto secundario extraño?

over 4 years ago · Santiago Trujillo
3 Respostas
Responde à pergunta

0

Sí, es perfectamente seguro. No es necesario que lea todos los argumentos variados solo por leerlos. Ni siquiera es necesario que inicie la secuencia de lectura de argumentos variádicos dentro TakesArgs .

Bajo el capó, generalmente significa que la carga de realizar cualquier tarea de mantenimiento de paso de argumentos se otorga al código de llamada (la forma en que funciona en lo que generalmente se reconoce como convención de llamadas C "tradicional"). El destinatario de la llamada no tiene que hacer nada.

over 4 years ago · Santiago Trujillo Relatório

0

[Editado en respuesta a los comentarios.]

Hay sistemas en los que, de forma predeterminada, el trabajo de la persona a la que se llama es mostrar los argumentos. Eso obviamente te metería en problemas. Pero , es precisamente por esta razón que las funciones variádicas deben declararse correctamente, y la declaración debe ser visible para las personas que llaman. La razón es que en esos sistemas, las funciones variádicas tienen que usar una secuencia de llamada no predeterminada donde la persona que llama muestra los argumentos, porque solo la persona que llama puede estar seguro de cuántos hay. Por lo tanto, debe estar seguro siempre que sus funciones se declaren correctamente.

over 4 years ago · Santiago Trujillo Relatório

0

Creo que es seguro, aunque el estándar no es muy explícito en este punto.

N1570 7.16 párrafo 3 dice:

Si se desea acceder a los distintos argumentos, la función llamada deberá declarar un objeto (generalmente denominado ap en esta subcláusula) que tenga el tipo va_list .

Tenga en cuenta el comienzo de esa oración: " Si se desea acceder a los diferentes argumentos". La implicación es que si no se desea acceder a los distintos argumentos, no hay necesidad de declarar un objeto va_list , lo que haría imposible invocar va_start , va_arg o va_end .

Un posible contraargumento es que la descripción de va_end (N1570 7.16.1.3) dice:

Si no hay una invocación correspondiente de la macro va_start o va_copy , o si la macro va_end no se invoca antes de la devolución, el comportamiento no está definido.

Sin embargo, dado el contexto, creo que se aplica si no se invoca va_end va_start invocar va_start.

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