safebuffers
Specyficzne dla firmy Microsoft
Informuje kompilator, aby nie wstawiać sprawdzeń zabezpieczeń przepełnienia buforu dla funkcji.
__declspec( safebuffers )
Uwagi
Opcja kompilatora /GS powoduje, że kompilator testuje przepełnienia buforu, wstawiając sprawdzenia zabezpieczeń na stosie.Rodzaje struktur danych, które są uprawnione do sprawdzania zabezpieczeń są opisane w /GS (Sprawdzanie zabezpieczeń bufora).Aby uzyskać więcej informacji dotyczących wykrywania przepełnienia buforu, zobacz Testy bezpieczeństwa kompilatora w głąb w witrynie MSDN w sieci Web.
Przegląd kodu lub zewnętrzna analiza eksperta może pomóc w ustaleniu, że funkcja jest bezpieczna od przepełnienia buforu.W takim przypadku można pominąć sprawdzanie zabezpieczeń dla funkcji, stosując słowo kluczowe __declspec(safebuffers) przy deklaracji funkcji.
![]() |
---|
Sprawdzenia zabezpieczeń buforu zapewniają istotną ochronę dla bezpieczeństwa i mają niewielki wpływ na wydajność.Dlatego zaleca się, aby nie pomijać ich, za wyjątkiem rzadkich przypadków, w których wydajność funkcji odgrywa krytyczną rolę i wiadomo, że funkcja jest bezpieczna. |
Funkcje wbudowane
Funkcja podstawowa może używać słowa kluczowego inlining do wstawienia kopii funkcji pomocniczej.Jeśli słowo kluczowe __declspec(safebuffers) jest zastosowane do funkcji, detekcja przepełnienia buforu jest pomijana dla tej funkcji.Jednakże wbudowywanie wpływa na słowo kluczowe __declspec(safebuffers) w następujące sposoby.
Załóżmy, że opcja kompilatora /GS jest określona dla obu funkcji, ale podstawowa funkcja określa słowo kluczowe __declspec(safebuffers) .Struktury danych w funkcji pomocniczej uprawniają ją do sprawdzania zabezpieczeń i funkcja nie pomija tych sprawdzeń.W tym przypadku:
Określ słowo kluczowe __forceinline dla funkcji pomocniczej w celu wymuszenia, aby kompilator wbudował tą funkcję niezależnie od optymalizacji kompilatora.
Ponieważ funkcja pomocnicza jest uprawniona do sprawdzenia zabezpieczeń, sprawdzanie zabezpieczeń jest także stosowane do funkcji podstawowej, nawet pomimo tego, że określa ona słowo kluczowe __declspec(safebuffers) .
Przykład
W poniższym kodzie pokazano sposób użycia 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;
}
KONIEC informacji specyficznych dla firmy Microsoft