Forum: Mikrocontroller und Digitale Elektronik MISRA Problem IAR_AVR / rule 53 bei PrintF va_end(va)


von Manuel K. (mkauf)


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 ?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

http://www.parasoft.com/jsp/products/article.jsp?label=Misra-Build-In#1011604

Sieh Dir mal die Definition/Deklaration von va_end an. Vermutlich ist 
das ein Makro, das zu einem leeren Block expandiert wird.

von Manuel K. (mkauf)


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)

von Rufus Τ. F. (rufus) Benutzerseite


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.

von Gast (Gast)


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 */
}

von Manuel K. (mkauf)


Lesenswert?

Hi,

das mit _formatted_write hab ich die selben probleme g

ich hab wieder mein va_end und meine Misra rule die meint sie mag keine 
Funktionen mit variablen eingängen...

mfg :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.