Brakuje warninga przy kompilacji

0

Witam!

Jaką flagę dodać do kompilatora, by ten wywalał warninga przy takim kodzie?

struct foo_t{
	int a;
	int b;
};

int main(){
	struct foo_t foo = {
		.a = 1,
		// .b = 2, // brak inicjalizacji dla pola "b" WARNING!
	};
	/* ... */
	return 0;
}

Wpisanie -Wall nic nie daje.

0

-Wmissing-field-initializers
albo -Wextra, które doda powyższe + inne

Edit: to działa dla C++ (g++), nie dla C (gcc)

1

@twonek u mnie nie działa :(

[pts/0:krzaq@ArchVM:~/tmp]% gcc -std=c11 test.c -c -Wextra -Wall -Wmissing-field-initializers
[pts/0:krzaq@ArchVM:~/tmp]% clang -std=c11 test.c -c -Wextra -Wall -Wmissing-field-initializers
[pts/0:krzaq@ArchVM:~/tmp]% cat test.c
struct foo_t{
        int a;
        int b;
};

void use_foo(struct foo_t*);

int main(){
        struct foo_t foo = {
        .a = 1,
        // .b = 2, // brak inicjalizacji dla pola "b" WARNING!
        };
        use_foo(&foo);
}

nawet clangowe -Weverything nie łapie.

0

Też popróbowałem wcześniej te flagi, uciekły mi przy pisaniu tematu :(
Ten warning jest dla mnie krytyczny, czasami coś zapomnę dopisać (szczególnie jak rozbuduję strukturę) i siedzę godzinami i szukam co jest nie tak :(

2

Nie ma potrzeby tutaj dawać warninga, bo .b będzie miało wartość 0. Każda wartość, która nie została zainicjalizowana będzie miała wartość 0.

0

Dałbym sobie rękę uciąć, że któryś kompilator dawał warninga.

0

Mam:

QT

struct foo_t
{
    int a, b;
};

int main()
{
    struct foo_t foo = {
        .a = 1,
        //main.cpp:10: warning: missing initializer for member 'foo_t::b' [-Wmissing-field-initializers]
    };

    (void)foo;
    return 0;
}

Szczegóły:

$ qmake
$ make
g++ -c -m64 -pipe -O2 -Wall -W -D_REENTRANT -DQT_NO_DEBUG -DQT_CORE_LIB -DQT_SHARED -I/usr/share/qt4/mkspecs/linux-g++-64 -I. -I/usr/include/qt4/QtCore -I/usr/include/qt4 -I. -o main.o main.cpp
main.cpp: In function ‘int main()’:
main.cpp:11:5: warning: missing initializer for member ‘foo_t::b’ [-Wmissing-field-initializers]
     };
     ^
g++ -m64 -Wl,-O1 -o untitled1 main.o    -L/usr/lib/x86_64-linux-gnu -lQtCore -lpthread 

$ g++ --version
g++ (Debian 4.9.2-10) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

Kompilator xc16-gcc przy -Wall -Wextra nie daje tego warninga:

$ xc16-gcc --version
elf-gcc (Microchip Technology) 4.5.1 (XC16, Microchip v1.26) (A) Build date: Feb 19 2016
Part support version: 1.26 (A)
__XC16_VERSION__ == 1026
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
0
twonek napisał(a):

-Wmissing-field-initializers
albo -Wextra, które doda powyższe + inne

Edit: to działa dla C++ (g++), nie dla C (gcc)

Mam dużo funkcji które przyjmują do inicjalizacji argumenty przez strukturę, ponieważ "argumentów" jest dość dużo.
Kod też jest czytelniejszy np.:

// jeden z krótszych przykładów 
	struct uart_opt_t uart_opt = {
		.fcy = FCY,
		.baudrate = UAN_BAUD,
		.rp_rxd = UAN_RP_RX,
		.rp_txd = UAN_RP_TX
	};
	uart_init(pUART1, &uart_opt);

Czyli dalej muszę się super pilnować jak przegapię jakieś pole do wpisania w strukturze?

0

Czyli dalej muszę się super pilnować jak przegapię jakieś pole do wpisania w strukturze?

Musisz. Albo w funkcji uart_init dodaj sobie assert dla każdego pola w strukturze.

0
mlyszczek napisał(a):

Czyli dalej muszę się super pilnować jak przegapię jakieś pole do wpisania w strukturze?

Musisz. Albo w funkcji uart_init dodaj sobie assert dla każdego pola w strukturze.

Tylko niektóre pola struktury mogą mieć dowolną wartość. Assertem nie sprawdzę czy została ona wpisana czy jednak jest domyślną wartością... :(

0

No to możesz jeszcze inicjować bez formy .field = val tylko po prostu val z użyciem -Wmissing-field-initializers. Pola wtedy inicjują się w kolejności podanej w struct

struct s
{
        int a;
        int b;
};

int main(void)
{
        struct s s = { 5 };
        return 0;
}
$ gcc -Wmissing-field-initializers main.c
main.c: In function ‘main’:
main.c:11:16: warning: missing initializer for field ‘b’ of ‘struct s’ [-Wmissing-field-initializers]
         struct s s = { 5 };
                ^
main.c:6:13: note: ‘b’ declared here
         int b;
0

Tak, tylko tracę na czytelności i łatwiej o pomyłkę w porównaniu z :

// jeden z krótszych przykładów 
    struct uart_opt_t uart_opt = {
        .fcy = FCY,
        .baudrate = UAN_BAUD,
        .rp_rxd = UAN_RP_RX,
        .rp_txd = UAN_RP_TX
    };
    uart_init(pUART1, &uart_opt);

:(

0

No to napisz patcha do gcc, lub rozszerzenie do jakiegoś toola od statycznej analizy kodu.

1 użytkowników online, w tym zalogowanych: 0, gości: 1