Permalänk

Calling conventions C++, C, C#

Eftermiddagen.

Undersökte lite närmare på ämnet då jag testade skapa DLL filer. (C++ dll till C# program)

Om man mot förmodan skulle ha fel calling convention, kan man ha dolda fel som inte syns (fast programmet fungerar felfritt)?

Testade och kunde köra denna kod felfritt:

C++ kod för DLL (__cdecl) är standard

#define DLL_EXPORT __declspec(dllexport) extern "C" { DLL_EXPORT int counter(int random) { static int total = 0; total++; return total; }

C# kod för .exe (__stdcall) är standard med DllImport

... [DllImport("training.dll")] public static extern int counter(int random); ... counter(); // Vanligt "call" till funktionen

Men om jag skulle lägga till ett argument, så får jag ett fint debug meddelande i Visual Studio (... unbalanced the stack)

Mitt dilemma är:
Om jag har fel CCs utav misstag och programmet aldrig skulle crasha utav det, kommer programmet fungera som det skall ändå tillsvidare utan något "läckage" av något slag? (T.ex. som vid exemplet ovan)

Visa signatur

Speldator: [Intel Core i7 4790K] [ASUS Matrix GTX 780Ti x2] [ASUS MAXIMUS VII HERO] [Corsair Dominator Platinum 32GB] [Windows 7] [Logitech G400S] [Microsoft Ergonomic 4000] [BenQ XR3501 35" (HDMI)] [BenQ G900W 19" (VGA)]

Serverdator: [Intel Core i7 6850K] [ASUS X99-E WS] [Corsair Vengeance LPX 64GB] [2x Crucial MX300 1TB] [Cooler Master V1200] [CentOS 7]

Permalänk

@Dalslandan: Svarar min egen fråga.

Hade svårt att hitta information först, men hittade ett bra svar här:
StackOverflow: Why does using the wrong calling convention sometimes work?

I mitt exempel tror callee att caller rensar stacken, och caller tror att callee rensar stacken. (Ingen rensar stacken)
Men som sagt, skrämmande är om man inte är i debug och använder argument kan funktionen verka som den fungerar. Vilket resulterar i att man får ett undefined behavior (äter stack space). Eller som I exemplet ovan, där jag använder fel CCs, men det fungerar eftersom jag inte använder några argument in. (Därav, det finns inget som behövs plockas av stacken.)

Sammanfattningsvis från StackOverflow:

It's all very much Undefined Behavior. And one property of Undefined Behavior is that it can do anything, including apparently working…

Eftersom jag inte är bra på assembly ville jag dubbel kolla att just __cdecl och __stdcall inte hade något med return värdet att göra. Vilket med efterforskning det inte har att göra (skillnaden mellan __cdecl och __stdcall ändrar inte hur return värdet hanteras utan endast dess argument till funktionen).

Visa signatur

Speldator: [Intel Core i7 4790K] [ASUS Matrix GTX 780Ti x2] [ASUS MAXIMUS VII HERO] [Corsair Dominator Platinum 32GB] [Windows 7] [Logitech G400S] [Microsoft Ergonomic 4000] [BenQ XR3501 35" (HDMI)] [BenQ G900W 19" (VGA)]

Serverdator: [Intel Core i7 6850K] [ASUS X99-E WS] [Corsair Vengeance LPX 64GB] [2x Crucial MX300 1TB] [Cooler Master V1200] [CentOS 7]