Използвам PC-Lint 8.00x със следните опции:
+v -wlib(1) +fan +fas
Получавам няколко съобщения за грешка от PC-Lint, когато изпълнявам код, подобен на следния:
typedef union
{
struct
{
unsigned int a : 4;
unsigned int b : 4;
unsigned int c : 4;
unsigned int d : 4;
} bits;
unsigned short value;
} My_Value;
int main (void)
{
My_Value test[] =
{
{
.bits.a = 2,
.bits.b = 3, //Errors 133 and 10
.bits.c = 2,
.bits.d = 3,
},
{
.bits.a = 1,
.bits.b = 1, //Errors 133 and 10
.bits.c = 1,
.bits.d = 0,
},
};
/* Do something meaningful. */
return 0;
}
Докладваните грешки се дефинират от PC-Lint, както следва:
Грешка 133: Твърде много инициализатори за агрегат „неизвестно име“
Грешка 10: Очаква се „}“
Опитах да търся в Gimpel и направих някои търсения в Google, но не мога да намеря нищо полезно. Кодът функционира по предназначение и всичко се инициализира правилно. Ето моите въпроси.
1. PC-Lint 8.00x поддържа ли инициализация в стил C99 на членове на структура?
2. Ако е така, какви опции/флагове трябва да задам, за да може PC-Lint да потиска тези съобщения глобално?
РЕДАКТИРАНЕ
Трябваше да бъда по-подробен по отношение на въпрос 2. Бих искал глобално да премахна тези съобщения по отношение на използването на определени инициализатори, както е показано по-горе. Не мога да ги потискам глобално за всички ситуации, тъй като тези грешки могат да открият истински грешки в кода.
.bits.a
) наистина е добре. Подозирам, че трябва да направите напр.My_value test[] = { { { .a = 2, .b = 3, .c = 2, .d = 3 } }, ... }
. - person Some programmer dude   schedule 03.04.2014.bits.a
отговаря на условията (и gcc и clang го приемат). Но какво се случва, ако преместите.bits
ниво нагоре? - person Keith Thompson   schedule 10.07.2014[0].bits.a = 1
и продължа през[1].bits.d = 0
PC-Lint вече не се оплаква и armcc все още го компилира правилно. Това може да е най-добрият ми вариант. - person embedded_guy   schedule 10.07.2014