www.mikrocontroller.net

Forum: PC-Programmierung PC-Lint und <string.h> Fehlermeldungen


Autor: Matthias (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen!

Ich benötige eure Hilfe bei der Nutzung von PC-Lint. Ich nutze WinAVR 
und möchte folgenden Quellcode durch PC-Lint prüfen lassen:
#include <stdint.h>
#include <string.h>

typedef struct
{
    uint8_t Var1;
}T_MY_DATATYPE;

void TestMain (void)
{
  T_MY_DATATYPE Test;
  memset (&Test, 0x00, sizeof(Test));
}

Daraufhin bekomme ich folgende Fehlermeldungen von PC-Lint ausgegeben:
**** Build of configuration PC-Lint for project 01_Rfm12Test ****

C:\Programme\Lint\LINT-NT.EXE +v -u E:\EclipseWorkspace\Workspace\01_Rfm12Test\Firmware\Project\Specific\Rfm12Test.lnt E:\EclipseWorkspace\Workspace\01_Rfm12Test\Firmware\Application\Specific\Init\Test.c 

PC-lint for C/C++ (NT) Ver. 8.00g, Copyright Gimpel Software 1985-2002
--- Module:   E:\EclipseWorkspace\Workspace\01_Rfm12Test\Firmware\Application\Specific\Init\Test.c
--- Module:   E:\EclipseWorkspace\Workspace\01_Rfm12Test\Firmware\Application\Specific\Init\Test.c
E:\EclipseWorkspace\Workspace\01_Rfm12Test\Firmware\Application\Specific\Init\Test.c:7: Error: Error 129 declaration expected, identifier 'T_MY_DATATYPE' ignored
E:\EclipseWorkspace\Workspace\01_Rfm12Test\Firmware\Application\Specific\Init\Test.c:7: Error: Error 19 Useless Declaration
E:\EclipseWorkspace\Workspace\01_Rfm12Test\Firmware\Application\Specific\Init\Test.c:11: Error: Error 40 Undeclared identifier 'T_MY_DATATYPE'
E:\EclipseWorkspace\Workspace\01_Rfm12Test\Firmware\Application\Specific\Init\Test.c:11: Warning: Warning 522 Expected void type, assignment, increment or decrement
E:\EclipseWorkspace\Workspace\01_Rfm12Test\Firmware\Application\Specific\Init\Test.c:11: Error: Error 10 Expecting ';'
E:\EclipseWorkspace\Workspace\01_Rfm12Test\Firmware\Application\Specific\Init\Test.c:12: Info: Info 718 Symbol 'memset' undeclared, assumed to return int
E:\EclipseWorkspace\Workspace\01_Rfm12Test\Firmware\Application\Specific\Init\Test.c:12: Info: Info 746 call to function 'memset()' not made in the presence of a prototype
E:\EclipseWorkspace\Workspace\01_Rfm12Test\Firmware\Application\Specific\Init\Test.c:12: Error: Error 40 Undeclared identifier 'Test'
E:\EclipseWorkspace\Workspace\01_Rfm12Test\Firmware\Application\Specific\Init\Test.c:12: Error: Error 40 Undeclared identifier 'Test'
E:\EclipseWorkspace\Workspace\01_Rfm12Test\Firmware\Application\Specific\Init\Test.c:14: Info: Info 766 Header file 'C:\Program Files\WinAVR\avr\include\stdint.h' not used in module 'E:\EclipseWorkspace\Workspace\01_Rfm12Test\Firmware\Application\Specific\Init\Test.c'

--- Global Wrap-up

 Note: Note 900 Successful completion, 10 messages produced

Die Präprozessor-Ausgabe von PC-Lint sieht folgendermaßen aus:
**** Build of configuration PC-Lint for project 01_Rfm12Test ****

C:\Programme\Lint\LINT-NT.EXE +v -u -p E:\EclipseWorkspace\Workspace\01_Rfm12Test\Firmware\Project\Specific\Rfm12Test.lnt E:\EclipseWorkspace\Workspace\01_Rfm12Test\Firmware\Application\Specific\Init\Test.c 
PC-lint for C/C++ (NT) Ver. 8.00g, Copyright Gimpel Software 1985-2002

--- Global Wrap-up

E:\EclipseWorkspace\Workspace\01_Rfm12Test\Firmware\Application\Specific\Init\Test.c:14: Note: Note 900 Successful completion, 0 messages produced

/* --- Module:   E:\EclipseWorkspace\Workspace\01_Rfm12Test\Firmware\Application\Specific\Init\Test.c */
/*lint -e725*/
/*lint ++flb*/

typedef signed char int8_t;
typedef unsigned char uint8_t;
typedef signed int int16_t;
typedef unsigned int uint16_t;
typedef signed long int int32_t;
typedef unsigned long int uint32_t;
typedef signed long long int int64_t;
typedef unsigned long long int uint64_t;
typedef int16_t intptr_t;
typedef uint16_t uintptr_t;
typedef int8_t int_least8_t;
typedef uint8_t uint_least8_t;
typedef int16_t int_least16_t;
typedef uint16_t uint_least16_t;
typedef int32_t int_least32_t;
typedef uint32_t uint_least32_t;
typedef int64_t int_least64_t;
typedef uint64_t uint_least64_t;
typedef int8_t int_fast8_t;
typedef uint8_t uint_fast8_t;
typedef int16_t int_fast16_t;
typedef uint16_t uint_fast16_t;
typedef int32_t int_fast32_t;
typedef uint32_t uint_fast32_t;
typedef int64_t int_fast64_t;
typedef uint64_t uint_fast64_t;
typedef int64_t intmax_t;
typedef uint64_t uintmax_t;/*lint --flb*/
/*lint ++flb*/
/*lint ++flb*/

typedef long unsigned int size_t;/*lint --flb*/

extern int ffs (int __val) __attribute__((__const__));
extern int ffsl (long __val) __attribute__((__const__));
extern int ffsll (long long __val) __attribute__((__const__));
extern void *memccpy(void *, const void *, int, size_t);
extern void *memchr(const void *, int, size_t) __attribute__((__pure__));
extern int memcmp(const void *, const void *, size_t) __attribute__((__pure__));
extern void *memcpy(void *, const void *, size_t);
extern void *memmem(const void *, size_t, const void *, size_t) __attribute__((__pure__));
extern void *memmove(void *, const void *, size_t);
extern void *memrchr(const void *, int, size_t) __attribute__((__pure__));
extern void *memset(void *, int, size_t);
extern char *strcat(char *, const char *);
extern char *strchr(const char *, int) __attribute__((__pure__));
extern char *strchrnul(const char *, int) __attribute__((__pure__));
extern int strcmp(const char *, const char *) __attribute__((__pure__));
extern char *strcpy(char *, const char *);
extern int strcasecmp(const char *, const char *) __attribute__((__pure__));
extern char *strcasestr(const char *, const char *) __attribute__((__pure__));
extern size_t strcspn(const char *__s, const char *__reject) __attribute__((__pure__));
extern char *strdup(const char *s1);
extern size_t strlcat(char *, const char *, size_t);
extern size_t strlcpy(char *, const char *, size_t);
extern size_t strlen(const char *) __attribute__((__pure__));
extern char *strlwr(char *);
extern char *strncat(char *, const char *, size_t);
extern int strncmp(const char *, const char *, size_t) __attribute__((__pure__));
extern char *strncpy(char *, const char *, size_t);
extern int strncasecmp(const char *, const char *, size_t) __attribute__((__pure__));
extern size_t strnlen(const char *, size_t) __attribute__((__pure__));
extern char *strpbrk(const char *__s, const char *__accept) __attribute__((__pure__));
extern char *strrchr(const char *, int) __attribute__((__pure__));
extern char *strrev(char *);
extern char *strsep(char **, const char *);
extern size_t strspn(const char *__s, const char *__accept) __attribute__((__pure__));
extern char *strstr(const char *, const char *) __attribute__((__pure__));
extern char *strtok(char *, const char *);
extern char *strtok_r(char *, const char *, char **);
extern char *strupr(char *);/*lint --flb*/

typedef struct
{
uint8_t Var1;
}T_MY_DATATYPE;
void TestMain (void)
{
T_MY_DATATYPE Test;
memset (&Test, 0x00, sizeof(Test));
}

Die Fehlermeldungen scheinen von den 'extern' Anweisungen in <string.h> 
auszugehen. In der PC-Lint Dokumentation habe ich kein Parameter 
gefunden, damit PC-Lint diese korrekt verarbeitet.

Meine PC-Lint-Konfigurationsdatei habe ich angehängt!

Ich hoffe ihr könnt mir Helfen...

Viele Grüße
Matthias

: Verschoben durch Admin
Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Die Fehlermeldungen scheinen von den 'extern' Anweisungen in
> <string.h> auszugehen.

Das glaube ich eigentlich nicht.
Die erste Meldung vom lint bezieht sich auf den T_MY_DATATYPE. Das ist 
schon etwas spät, wenn tatsächlich ein Funktionsprototyp der Übeltäter 
sein sollte. In dem Fall würde ich die erste Diagnostic beim typedef 
erwarten. typedef ist in keinem Kontext eines Funktionsprotoypen ein 
gültiges Schlüsselwort.

Mach aus der anonymen struct mal eine benannte
typedef struct irgendwas
{
    uint8_t Var1;
}T_MY_DATATYPE;

bzw. teile sie in 2 Teile auf
struct irgendwas
{
    uint8_t Var1;
};

typedef struct irgendwas T_MY_DATATYPE;

Eigentlich sollte das einen lint nicht stören, es ist auch im Original 
korrektes C, aber irgendwas stört den lint anscheinend hier.

BTW: der korrekte Header für memset wäre memory.h, nicht string.h

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

Bewertung
0 lesenswert
nicht lesenswert
> Die Fehlermeldungen scheinen von den 'extern' Anweisungen in
> <string.h> auszugehen.

Was geschieht denn, wenn Du string.h erst nach dem typedef einbindest?

Dann sollten zumindest die ersten beiden Fehler (129 und 19) sich 
ändern.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
wenn ich den Header <string.h> nicht mehr einbinden bekomme ich keine 
Fehler mehr.
#include <stdint.h>

typedef struct
{
    uint8_t Var1;
}T_MY_DATATYPE;

void TestMain (void)
{
  T_MY_DATATYPE Test;
  Test.Var1 = 0;

  if (Test.Var1){};

  //memset (&Test, 0x00, sizeof(Test));
}
**** Build of configuration PC-Lint for project 01_Rfm12Test ****

C:\Programme\Lint\LINT-NT.EXE +v -u E:\EclipseWorkspace\Workspace\01_Rfm12Test\Firmware\Project\Specific\Rfm12Test.lnt E:\EclipseWorkspace\Workspace\01_Rfm12Test\Firmware\Application\Specific\Init\Test.c 
PC-lint for C/C++ (NT) Ver. 8.00g, Copyright Gimpel Software 1985-2002

--- Module:   E:\EclipseWorkspace\Workspace\01_Rfm12Test\Firmware\Application\Specific\Init\Test.c
--- Module:   E:\EclipseWorkspace\Workspace\01_Rfm12Test\Firmware\Application\Specific\Init\Test.c

--- Global Wrap-up

 Note: Note 900 Successful completion, 0 messages produced

Die Debug-Ausgabe sieht dann folgendermaßen aus:

**** Build of configuration PC-Lint for project 01_Rfm12Test ****

C:\Programme\Lint\LINT-NT.EXE +v -u -p E:\EclipseWorkspace\Workspace\01_Rfm12Test\Firmware\Project\Specific\Rfm12Test.lnt E:\EclipseWorkspace\Workspace\01_Rfm12Test\Firmware\Application\Specific\Init\Test.c 
PC-lint for C/C++ (NT) Ver. 8.00g, Copyright Gimpel Software 1985-2002


/* --- Module:   E:\EclipseWorkspace\Workspace\01_Rfm12Test\Firmware\Application\Specific\Init\Test.c */
--- Global Wrap-up
/*lint -e725*/

/*lint ++flb*/

E:\EclipseWorkspace\Workspace\01_Rfm12Test\Firmware\Application\Specific\Init\Test.c:17: Note: Note 900 Successful completion, 0 messages produced
typedef signed char int8_t;
typedef unsigned char uint8_t;
typedef signed int int16_t;
typedef unsigned int uint16_t;
typedef signed long int int32_t;
typedef unsigned long int uint32_t;
typedef signed long long int int64_t;
typedef unsigned long long int uint64_t;
typedef int16_t intptr_t;
typedef uint16_t uintptr_t;
typedef int8_t int_least8_t;
typedef uint8_t uint_least8_t;
typedef int16_t int_least16_t;
typedef uint16_t uint_least16_t;
typedef int32_t int_least32_t;
typedef uint32_t uint_least32_t;
typedef int64_t int_least64_t;
typedef uint64_t uint_least64_t;
typedef int8_t int_fast8_t;
typedef uint8_t uint_fast8_t;
typedef int16_t int_fast16_t;
typedef uint16_t uint_fast16_t;
typedef int32_t int_fast32_t;
typedef uint32_t uint_fast32_t;
typedef int64_t int_fast64_t;
typedef uint64_t uint_fast64_t;
typedef int64_t intmax_t;
typedef uint64_t uintmax_t;/*lint --flb*/

typedef struct
{
uint8_t Var1;
}T_MY_DATATYPE;
void TestMain (void)
{
T_MY_DATATYPE Test;
Test.Var1 = 0;
if (Test.Var1){};
}

Die Aufrufzeile ist folgende:
C:\Programme\Lint\LINT-NT.EXE +v -u  ${workspace_loc:/01_Rfm12Test}\Firmware\Project\Specific\Rfm12Test.lnt ${selected_resource_loc:}

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

Bewertung
0 lesenswert
nicht lesenswert
Tja, dann wird man sich wohl mal ansehen müssen, was in Deiner string.h 
so drinsteht. Ansonsten ist das alles recht merkwürdig.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es handelt sich um die standard Datei "string.h" die Bestandteil von 
WinAVR ist. In der Debug-Ausgabe wird direkt ausgegeben, welchen 
Quellcode PC-Lint prüft (inkl. der Header-Dateien).

Ich finde es auch echt merkwürdig. Darum habe ich mich ja auch an euch 
gewendet...

VG
Matthias

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.