Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
'function': podpis funkce obsahuje typ 'type'; Objekty jazyka C++ jsou nebezpečné pro předávání mezi čistým kódem a smíšeným nebo nativním kódem.
Poznámky
Možnost kompilátoru /clr:pure je v sadě Visual Studio 2015 zastaralá a nepodporovaná od sady Visual Studio 2017. Pokud máte kód, který musí být čistý CLR, doporučujeme ho přenést do C#.
Kompilátor zjistil potenciálně nebezpečnou situaci, která by mohla vést k chybě za běhu: volání se provádí z kódu zkompilovaného do funkce importované /clr:pure prostřednictvím dllimporta podpis funkce obsahuje nebezpečný typ. Typ je nebezpečný, pokud obsahuje členovou funkci nebo má datový člen, který je nebezpečným typem nebo nepřímým převodem na nebezpečný typ.
Tento model je nebezpečný z důvodu rozdílu ve výchozích konvencích volání mezi čistým a nativním kódem (nebo smíšeným nativním a spravovaným). Při importu funkce do dllimport kódu zkompilovaného pomocí /clr:pure, ujistěte se, že deklarace každého typu v podpisu jsou stejné jako podpis v compilandu, který exportuje funkci (zejména pozor na rozdíly v implicitních konvencích volání).
Virtuální členová funkce je obzvláště náchylná k tomu, aby poskytovala neočekávané výsledky. I nevirtuální funkce by ale měla být testována, abyste měli jistotu, že získáte správné výsledky. Jakmile zajistíte správnost výsledku, můžete toto upozornění ignorovat.
C4412 je ve výchozím nastavení vypnutý. Další informace naleznete v tématu Upozornění kompilátoru, které jsou vypnuty ve výchozím nastavení a dllexport, dllimport.
Pokud chcete toto upozornění vyřešit, odeberte z typu všechny funkce.
Příklady
Následující příklad vygeneruje C4412:
// compile with: /c /W2 /clr:pure
#pragma warning (default : 4412)
struct Unsafe {
virtual void __cdecl Test();
};
struct Safe {
int i;
};
__declspec(dllimport) Unsafe * __cdecl func();
__declspec(dllimport) Safe * __cdecl func2();
int main() {
Unsafe *pUnsafe = func(); // C4412
// pUnsafe->Test();
Safe *pSafe = func2(); // OK
}
Následující příklad je hlavičkový soubor, který deklaruje dva typy. Typ Unsafe je nebezpečný, protože má členovou funkci:
// C4412.h
struct Unsafe {
// will be __clrcall if #included in pure compilation
// defaults to __cdecl in native or mixed mode compilation
virtual void Test(int * pi);
// try the following line instead
// virtual void __cdecl Test(int * pi);
};
struct Safe {
int i;
};
Tento příklad exportuje funkce s typy definovanými v souboru hlaviček:
// C4412_2.cpp
// compile with: /LD
#include "C4412.h"
void Unsafe::Test(int * pi) {
*pi++;
}
__declspec(dllexport) Unsafe * __cdecl func() { return new Unsafe; }
__declspec(dllexport) Safe * __cdecl func2() { return new Safe; }
Výchozí konvence volání v /clr:pure kompilaci se liší od nativní kompilace. Pokud je C4412.h zahrnut, výchozí hodnota pro Test je __clrcall.
Následující příklad vygeneruje C4412 a vyvolá výjimku za běhu:
// C4412_3.cpp
// compile with: /W2 /clr:pure /c /link C4412_2.lib
#pragma warning (default : 4412)
#include "C4412.h"
__declspec(dllimport) Unsafe * __cdecl func();
__declspec(dllimport) Safe * __cdecl func2();
int main() {
int n = 7;
Unsafe *pUnsafe = func(); // C4412
pUnsafe->Test(&n);
Safe *pSafe = func2(); // OK
}