Forum: Mikrocontroller und Digitale Elektronik PC-Lint Fehlermeldung


von Decius (Gast)


Lesenswert?

Ich bekomme von PC-Lint die folgende Fehlermeldung:
Error 40: Undeclared identifier 'var' [MISRA 2004 Rule 1.2, required]

------------------------------------------------------------------------ 
-
datei_1.c:

int var; /*globale variable*/

------------------------------------------------------------------------ 
-
datei_1.h:

#ifndef datei_1_h
#define datei_1_h

extern int var;

#define MACRONAME(){\
 var=1;\
}

#endif

------------------------------------------------------------------------ 
-
datei_2.c:

#include "datei_1.h"


funktion()
{
MACRONAME();
}

------------------------------------------------------------------------ 
-

Der Keil Compiler übersetzt das problemlos. Keine Ahnung warum PC-Lint 
9.0 hier meckert. Kann mir da jemand helfen?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Ist das wirklich exakt so geschrieben?
Du hast hier ja nur einen Exzerpt oder gar ein Gedächtnisprotokoll 
gepostet, nicht, daß Du in Deinen tatsächlichen Sourcen vielleicht doch 
einen Tippfehler hast ...

von Klaus W. (mfgkw)


Lesenswert?

1. Ich sehe da auch nichts, was lint anzumeckern hätte.

2. Nicht jede lint-Warnung ist sinnvoll.

3. Nicht jede MISRA-Regel ist sinnvoll.

4. Wozu das schusselige Makro-Gegurke? Das verwirrt lint ebenso wie 
jeden normal denkenden Leser. Wer so programmiert, kommt mit lint auch 
nicht viel weiter.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

Decius schrieb:
> Der Keil Compiler übersetzt das problemlos. Keine Ahnung warum PC-Lint
> 9.0 hier meckert. Kann mir da jemand helfen?

Wirfst Du dem pclint die Sources in einem Rutsch zum Fraß vor oder 
einzeln? Soweit ich das in Erinnerung habe, solltest Du pclint alle 
Sources auf einmal angeben, also z.B.

  pclint datei_*.c

Dann kann er auch die Definition der Variablen in datei_1.c "sehen".

von Lucius (Gast)


Lesenswert?

Ich weiß, der originale Quelltext wäre besser. Da das aber keine 
Hausaugfgabe ist, kann ich nicht so vorgehen. Den originalen Quelltext 
habe ich aber auf meinen 2. Monitor gesehen, als ich dies geschrieben 
habe.

Aufgrund der Art und Weise wie PC-Lint von Keil uVision 4.50 unterstützt 
wird, kann ich entweder alle Dateien oder jede Datei einzeln überprüfen 
lassen. Bisher habe ich die Dateien einzeln bearbeitet.

Aber es wäre schon möglich, das die Definition der Variable var in 
datei_1.c, so nicht berücksichtigt wird. Denn wenn ich diese Definition 
nach datei_2.c kopiere, ist der Fehler weg.

Ich bin auch kein Freund von MACROS, ich hätte da lieber ein inline 
Funktion. Nur was soll man machen, wenn man vorhandenen Quelltext 
weiterbearbeiten muß?! Ich muß mir das mal anschauen, ob es vertretbar 
ist den gesamten Quellcode zu ändern. Aber wahrscheinlich eher nicht, da 
es ein größeres Projekt ist.

von Decius (Gast)


Lesenswert?

lol, tschuldigung! falscher name.

von Klaus W. (mfgkw)


Lesenswert?

Lucius schrieb:
> Aber wahrscheinlich eher nicht, da
> es ein größeres Projekt ist.

Dann erst recht :-)

von Decius (Gast)


Lesenswert?

Ok bin zwar noch nicht 100%ig sicher, aber alle Dateien überprüfen zu 
lassen, war anscheinend die Lösung.

Aber noch eine andere Frage. Im Moment habe ich das Problem das ich im 
folgenden Konstrukt mit dem pclint beim #error lande.

#if  defined (__ARMCC_VERSION)
.
.
.
#else
 #error "Directives unknown!"
#endif

Beim error bricht pclint dann ab. Ich weiß man kann mit "+fce" pclint 
veranlassen weiterzuarbeiten. Oben ist also __AMRCC_VERSION "nicht 
definiert". Jedenfalls sieht es anscheinend für pclint so aus, da es 
sich hier um eine Compilerdirektive handelt. wie bringe ich pclint bei, 
Compilerdirektiven als definiert anzusehen?

von Karl H. (kbuchegg)


Lesenswert?

die beiden führenden Unterstriche sind ein klares Signal, dass es sich 
bei

  __ARMCC_VERSION

um ein vom Compiler selbst bereit gestelltes Makro handelt.

Musst du halt die Doku vom pclint durchsuchen, wie du dem auf der 
Command Line ein paar define-ments mitgeben kannst.

von Decius (Gast)


Lesenswert?

Habe da im Moment an "+ppw(__ARMCC_VERSION)" gedacht. Funktioniert aber 
nicht.

von Klaus W. (mfgkw)


Lesenswert?

-D __ARMCC_VERSION

bzw.

-D __ARMCC_VERSION=1234

von Decius (Gast)


Lesenswert?

+d__ARMCC_VERSION=410894 habe gerade das benutzt, hat funktioniert. :-)

von Decius (Gast)


Lesenswert?

Danke

von Decius (Gast)


Lesenswert?

Die Zahl stellt die Version des Compilers dar. Das Format der Zahl ist 
so.

P V B B B B
- - -------
| |    |----- Build
| |---------- Minor version
|------------ Major version

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.