mikrocontroller.net

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


Autor: Manuel Kauf (mkauf)
Datum:

Bewertung
0 lesenswert
nicht 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
void lcprintf(const char *fmt, ...)
{
va_list va;
unsigned int val; 
va_start(va, fmt);
val = _cprint((void (*)(unsigned char)) _lcdputc, fmt, va);
va_end(va);   // <-- hier gibts mecker
}

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 ?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.parasoft.com/jsp/products/article.jsp?l...

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

Autor: Manuel Kauf (mkauf)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 */
}

Autor: Manuel Kauf (mkauf)
Datum:

Bewertung
0 lesenswert
nicht 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 :)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.