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

108
Views
¿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 answers
Answer question

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 Report

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 Report

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 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!