safebuffers
Specyficzne dla firmy Microsoft
Informuje kompilator, aby nie wstawiać sprawdzeń zabezpieczeń przepełnienia buforu dla funkcji.
Składnia
__declspec( safebuffers )
Uwagi
Opcja /GS kompilatora powoduje, że kompilator testuje przepełnienie buforu przez wstawienie kontroli zabezpieczeń na stosie. Typy struktur danych, które kwalifikują się do kontroli zabezpieczeń, są opisane w / GS (Sprawdzanie zabezpieczeń buforu). Aby uzyskać więcej informacji na temat wykrywania przekroczenia buforu, zobacz Funkcje zabezpieczeń w programie MSVC.
Przegląd kodu lub zewnętrzna analiza eksperta może pomóc w ustaleniu, czy funkcja jest zabezpieczona przed przepełnieniem buforu. W takim przypadku można pominąć kontrole zabezpieczeń dla funkcji, stosując __declspec(safebuffers)
słowo kluczowe do deklaracji funkcji.
Uwaga
Sprawdzenia zabezpieczeń buforu zapewniają istotną ochronę i mają niewielki wpływ na wydajność. Dlatego zaleca się, aby nie pomijać ich poza rzadkimi przypadkami, gdy wydajność funkcji odgrywa krytyczną rolę i wiadomo, że funkcja jest bezpieczna.
Funkcje śródwierszowe
Funkcja podstawowa może użyć słowa kluczowego inlining, aby wstawić kopię funkcji pomocniczej. __declspec(safebuffers)
Jeśli słowo kluczowe jest stosowane do funkcji, wykrywanie przepełnienia buforu jest pomijane dla tej funkcji. Jednak podkreślenie wpływa na __declspec(safebuffers)
słowo kluczowe w następujący sposób.
Załóżmy, że opcja /GS kompilatora jest określona dla obu funkcji, ale funkcja podstawowa __declspec(safebuffers)
określa słowo kluczowe. Struktury danych w funkcji pomocniczej uprawniają ją do sprawdzania zabezpieczeń i funkcja nie pomija tych sprawdzeń. W takim przypadku:
Określ słowo kluczowe __forceinline w funkcji pomocniczej, aby wymusić wbudowane działanie kompilatora niezależnie od optymalizacji kompilatora.
Ponieważ funkcja pomocnicza kwalifikuje się do kontroli zabezpieczeń, kontrole zabezpieczeń są również stosowane do funkcji podstawowej, mimo że określa słowo
__declspec(safebuffers)
kluczowe.
Przykład
Poniższy kod pokazuje, jak używać słowa kluczowego __declspec(safebuffers)
.
// compile with: /c /GS
typedef struct {
int x[20];
} BUFFER;
static int checkBuffers() {
BUFFER cb;
// Use the buffer...
return 0;
};
static __declspec(safebuffers)
int noCheckBuffers() {
BUFFER ncb;
// Use the buffer...
return 0;
}
int wmain() {
checkBuffers();
noCheckBuffers();
return 0;
}
END Microsoft Specific
Zobacz też
__declspec
Słowa kluczowe
inline, __inline, __forceinline
strict_gs_check
Opinia
https://aka.ms/ContentUserFeedback.
Dostępne już wkrótce: W 2024 r. będziemy stopniowo wycofywać zgłoszenia z serwisu GitHub jako mechanizm przesyłania opinii na temat zawartości i zastępować go nowym systemem opinii. Aby uzyskać więcej informacji, sprawdź:Prześlij i wyświetl opinię dla