Aby pozbyć się ostrzeżenia analizy kodu statycznego (QA-C), muszę zapewnić prototyp funkcyjny dla __builtin_expect().

Używam kompilatora Windriver Diab dla PowerPC. W manuśle kompilatorze znalazłem następujące informacje:

__builtin_expect(long exp, long c): ... {x1}} jest również wartością powrotną.

Więc mój prototyp jest następujący:

long __builtin_expect(long exp, long c);

Jednak nie skompiluje się, otrzymuję następujący błąd:

Błąd (DCC: 1701): Nieprawidłowe typy na prototypie do wewnętrznego __builtin_Expect - Gdy włączony jest wewnętrzny, opcjonalny prototyp użytkownika musi być zgodny

Wygląda na to, że mój prototyp jest nieprawidłowy. Jaki jest właściwy prototyp dla __builtin_expect?

Komunikat o błędzie stwierdza, że prototyp użytkownika jest opcjonalny. Więc należy go zdefiniować, prawda?

2
sergej 16 luty 2017, 21:13

2 odpowiedzi

Najlepsza odpowiedź

Musisz jakoś zdefiniować __builtin_expect, aby uszczęśliwić twój statyczny analizator, ponieważ nie wie, co to działa. Ale musisz użyć #ifdef, aby wyłączyć tę definicję, gdy normalnie kompilujesz program, ponieważ kompilator nie będzie go polubić, jeśli spróbujesz zdefiniować kompilator wbudowany. Wbudowane są kompilator, więc nie powinny być zdefiniowane w Twoim programie.

Coś takiego zadziałałoby:

#ifdef _HEY_I_AM_RUNNING_STATIC_ANALYZER
#define __builtin_expect(e,c) (e)
#endif

Nie znam szczegółów, w jaki sposób twój analizator statyczny działa, więc nie wiem, co właściwe makro jest testowe w #ifdef. Możesz odczytać dokumentację analizatora statycznego, aby dowiedzieć się, czy domyślnie określa dowolne symbole preprocesora, lub jeśli możesz powiedzieć, jakie symbole preprocesora do zdefiniowania, gdy go uruchomisz.

4
David Grayson 16 luty 2017, 20:37

Należy starannie przeczytać dokumentację Inne wbudowane w GCC.

Jako pierwsze przybliżenie można zastąpić __builtin_expect przez (wywołanie {x1}} macro poniżej:

#define _builtin_expect_replacement(Exp,C) (Exp)

Dla większości analizatorów statycznych, które powinny wystarczyć

Nie oczekuj, że większość wbudowanych GCC jest definiowana jako funkcje.

4
Community 20 czerwiec 2020, 09:12