MISRA Problem IAR_AVR / rule 53 bei PrintF va_end(va)

OP #703224
Lesenswert?

Hi @ll,

Ich nutze den IAR mit den MISRA Regeln,

Error[Pm049]: all non-null statements shall have a side-effect (MISRA C 
rule 53)

wenn ich
1
void lcprintf(const char *fmt, ...)
2
{
3
va_list va;
4
unsigned int val; 
5
va_start(va, fmt);
6
val = _cprint((void (*)(unsigned char)) _lcdputc, fmt, va);
7
va_end(va);   // <-- hier gibts mecker
8
}

kriege ich eben die Fehlermeldung das die Misra Rule 53 verletzt wird 
vonwegen "alle Nichtnullaussagen haben eine Nebenwirkung"

werde aber aus der MISRA Beschreibung leider nicht ganz schlau in dem 
Punkt,

hat von euch einer ne Idee ?
OP #703257
Lesenswert?

Danke für die super schnelle Antwort :)

#define va_end(ap)  ((void) 0)

so ist es Definiert/Deklariert

werde ich wohl die Rule 69 (für PrintF) und die Rule 53 Abschalten für 
dieses Modul

Falls noch wer ne idee hat ich bin immer offen :)

(schlte die Rules nicht so gern aus)
Persönliche Seite #703469
Lesenswert?

Die Alternative wäre es, bei Verwendung dieses Compilers auf va_end zu 
verzichten ... Portierbar und sauber ist das aber nicht.

Andere Compiler verwenden, je nach Architektur der Zielmaschine 
wenigstens Code, der den der "Funktion" übergebenen Pointer 
deinitialisieren (auf null setzen).

So macht's beispielsweise MSVC++ 6.0

  #define va_end(ap) ap = (va_list)0

Und so macht's Rowley Crossworks (MSP430, aber wohl auch andere

  #define va_end(ap) ((void)((ap) = (void *)0))


Was den armen Teufel geritten hat, der Deine stdarg.h/vararg.h 
geschrieben hat, will ich besser gar nicht wissen.
Gast #703509
Lesenswert?

Verwende doch die Routine _formatted_write(); damit läßt sich jedes 
beliebige printf() erstellen.
z.B.:

int lcd_printf (const char *format, ...)  /* Our main entry */
{
va_list ap;
int nr_of_chars;
  va_start (ap, format);  /* Variable argument begin */
  nr_of_chars = _formatted_write (format, put_one_char, (void *) 0, ap);
  va_end (ap);    /* Variable argument end */
  return (nr_of_chars);  /* According to ANSI */
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren