Newsgroup: it.comp.lang.c
Titolo: problema va_list-sprintf e simili...

Da un po' di tempo mi assilla un certo problema, esso
era dato dal fatto che il compilatore (gcc) nel codice che
sto sviluppando non avvisa degli errori sugli
argomenti passati per le funzioni con passaggio di numero
variabile di argomenti (tipo la void test( const char
*fmt, ... ); sotto ).
Però nel codice che sto sviluppando mi avvisa almeno
sugli errori della sprintf.
Nel codice che ho creato per test qui sotto, nemmeno
quello...
Perchè???
Come ovviare ciò?
Come convincere gcc ad avvisarmi degli errori di sintassi
di cui ho riempito il codice sotto?
/* Inizio codice */
#include <stdio.h>
#include <stdarg.h>
void test( const char *fmt, ... );
int main( void )
{
char buf[1024];
int num;
char word[127];
strcpy(word, "ciao");
num = 100;
printf( "%s", word );
printf( "%s", num );
printf( "%s" );
printf( "%s", word, word );
printf( "%s", word, num );
sprintf( buf, "%s", word );
sprintf( buf, "%s", num );
sprintf( buf, "%s" );
sprintf( buf, "%s", word, word );
sprintf( buf, "%s", word, num );
test( "%s", word );
test( "%s", num );
test( "%s" );
test( "%s", word, word );
test( "%s", word, num );
}
void test( const char *fmt, ... )
{
char buf[1024];
va_list args;
va_start( args, fmt );
vsprintf( buf, fmt, args );
va_end( args );
}
/* Fine codice. */
Grazie in anticipo,
Amlugil

di cui ho riempito il codice sotto?
Se fossero errori di sintassi il gcc ti bloccherebbe in compilazione.
Di fatto, non lo sono, sono solo errori "semantici".
Imposta le opzioni -pedantic -Wall, ma ricorda che un compilatore C
non può darti alcuna indicazione sul corretto o meno utilizzo dei
parametri in numero variabile.


grazie :)
cioè ora ho capito almeno perchè non mi avvertiva degli errori semantici per
la sprintf e la printf nel codice di test... dimenticavo di compilare
con -Wall
però... siam sempre lì.. se il compilatore riesce ad avvertirmi con warnings
per le funzioni.
di libreria standard... non esiste proprio un metodino per dirgli di farlo
con altre funzioni almeno similari alla printf & Co?
Manco (utopicamente parlando) ravanando nel codice di gcc e compilando una
versioncina modificata per queste mie "problematiche" funzioni simil-printf?
PS: carina l'opzione -pedantic  :)

con altre funzioni almeno similari alla printf & Co?
Significa chiedere troppo a un compilatore. Il gcc si prende la
libertà di fare un certo tipo di controlli, probabilmente ti
servirebbe avere un programma come il vecchio "lint".

 versioncina modificata per queste mie "problematiche" funzioni simil-printf?
Si`, basta leggere il manuale:
info gcc "C Extensions" "Function Attributes"
cerca l'attributo format.
Kronos
-- 
Home: 
http://kronoz.cjb.net
Il piu` bel momento dell'amore e` quando ci si illude che duri per 
sempre; il piu` brutto, quando ci si accorge che dura da troppo.

 servirebbe avere un programma come il vecchio "lint".
Oppure una sua versione recente: ad esempio splint (
http://www.splint.org
).
-- 
Enrico `Trippo' Porreca

con altre funzioni almeno similari alla printf & Co?
   E' chiaramente la cosa meno portabile del mondo, comunque, cerca la
documentazione su __attribute__
=====================================================================
`format (ARCHETYPE, STRING-INDEX, FIRST-TO-CHECK)'
  The `format' attribute specifies that a function takes `printf',
  `scanf', or `strftime' style arguments which should be type-checked
  against a format string.  For example, the declaration:
       extern int
       my_printf (void *my_object, const char *my_format, ...)
             __attribute__ ((format (printf, 2, 3)));
  causes the compiler to check the arguments in calls to `my_printf'
  for consistency with the `printf' style format string argument
  `my_format'.
  The parameter ARCHETYPE determines how the format string is
  interpreted, and should be either `printf', `scanf', or
  `strftime'.  The parameter STRING-INDEX specifies which argument
  is the format string argument (starting from 1), while
  FIRST-TO-CHECK is the number of the first argument to check
  against the format string.  For functions where the arguments are
  not available to be checked (such as `vprintf'), specify the third
  parameter as zero.  In this case the compiler only checks the
  format string for consistency.
  In the example above, the format string (`my_format') is the second
  argument of the function `my_print', and the arguments to check
  start with the third argument, so the correct parameters for the
  format attribute are 2 and 3.
  The `format' attribute allows you to identify your own functions
  which take format strings as arguments, so that GNU CC can check
  the calls to these functions for errors.  The compiler always
  checks formats for the ANSI library functions `printf', `fprintf',
  `sprintf', `scanf', `fscanf', `sscanf', `strftime', `vprintf',
  `vfprintf' and `vsprintf' whenever such warnings are requested
  (using `-Wformat'), so there is no need to modify the header file
  `stdio.h'.
-- 
S.L.