今日、私の心は関数ポインターのトピックについてさまよっていました。そして、頭の中で次のシナリオを思いつきました。
__stdcall int function (int)
{
return 0;
}
int main()
{
(*(int(*)(char*,char*))function)("thought", "experiment");
return 0;
}
このコードはスタックを破壊するので、このコードを実行した場合、どのような種類の問題が発生する可能性がありますか?
私は自分自身を調査してこれを行いますが、開発マシンから1週間離れています。
編集:ちょっと待ってください、私はもう少し考えていました。コメントで観察されているように、このコードの目的は、すべてが言われ終わったときにスタックにパラメーターを残すことでした(呼び出し元はスタックに2つのパラメーターを置き、呼び出し先は1つのパラメーターのみを期待します)は1つだけをポップします)。しかし、私のキャストは呼び出し規約について言及していないので、少なくとも発信者の観点からは、stdcallをキャストしていませんか?int function(int)は引き続きパラメーターをスタックからポップしますが、呼び出し元はキャストのために関数が__cdecl(デフォルト)であると考えるように戻りますか?(つまり、合計3つのパラメーターがポップされましたか?)
EDIT2:ロブによって確認されたように、その2番目の質問に対する答えはイエスです。スタックにパラメータを残したい場合は、__stdcallを言い換える必要があります。
(*(__stdcall int(*)(char*,char*))function)("thought", "experiment");