Mein Geist zum Thema Funktionszeiger heute wandert, und ich kam mit dem folgende Szenario in meinem Kopf:Gedankenexperiment mit __stdcall und beschädigten Stapel (C++)
__stdcall int function (int)
{
return 0;
}
int main()
{
(*(int(*)(char*,char*))function)("thought", "experiment");
return 0;
}
AFAIK dieses Code verfälschen würde die stack, also welche Arten von Problemen könnte ich betrachten, wenn ich diesen Code ausgeführt habe?
Ich würde mich selbst untersuchen, aber ich bin für eine Woche von meinem Computer entfernt.
EDIT: Moment mal, ich habe ein bisschen mehr nachgedacht. Wie in den Kommentaren beobachtet wurde, bestand die Absicht dieses Codes darin, einen Parameter auf dem Stapel zu haben, wenn alles gesagt und getan ist (der Aufrufer setzt zwei Params auf den Stack, callee - erwartet nur einen Parameter - springt nur einen aus). Da meine Besetzung die Aufrufkonvention jedoch nicht erwähnt, verwerfe ich zumindest aus der Sicht des Aufrufers stdcall. int function (int) wird immer noch einen Parameter vom Stapel entfernen, aber kehrt der Aufrufer zu der Annahme zurück, dass die Funktion aufgrund der Besetzung __cdecl (der Standard) ist? (d. h. drei Gesamtparameter sind aufgetaucht?)
EDIT2: Die Antwort auf diese zweite Frage, wie von Rob bestätigt, ist ja. Ich hätte neu zu formulieren __stdcall, wenn ich einen param auf den Stapel verlassen wollte:
(*(__stdcall int(*)(char*,char*))function)("thought", "experiment");
Die Hauptverfälschung kommt jedoch davon, zwei getrennte Prozessdenken zu haben, sie sollten das Aufräumen machen. – ojblass
Ich wurde für die Ausführung des Codes gewählt ... go figure ... – ojblass