-fomit-frame-pointer と -mrtd を使用して GCC でコンパイルすると、この C コードはセグメンテーション違反でクラッシュします。
私のコードは何らかの形で間違っていますか? 他の関数ポインターは期待どおりに機能しますが、渡されている自由関数の場合はそうではありませんか? コンパイル時に警告が表示されますが、その理由や修正方法がわかりません。(私は通常、c でコーディングしません。このエラーは、私が使用する 3D パーツ ライブラリから発生します)
Windows で rtd/stdcall が必要であり、ctypes を使用して Python からこのライブラリを呼び出す必要があり、GCC で -O1 を使用してコンパイルすると、デフォルトで -fomit-frame-pointer が含まれます。(GCC のバージョンは TDM/Mingw32 の 4.6.1 です) デフォルトの最適化オプションが問題を引き起こすのは少し奇妙に感じますか?
Cコード:
#include <stdlib.h>
// void free ( void * ptr );
void test(void* o, void (*freeFunc)(void*)) {
freeFunc(o);
}
int main() {
int *p = (int *)calloc(1, sizeof(int));
test(p, free);
}
以下でコンパイル:
gcc -fomit-frame-pointer -mrtd -c fx.c
gcc -fomit-frame-pointer -mrtd fx.o -o fx.exe
コンパイル警告:
fx.c: In function 'main':
fx.c:11:5: warning: passing argument 2 of 'test' from incompatible pointer type[enabled by default]
fx.c:5:6: note: expected 'void (*)(void *)' but argument is of type 'void (*)(void *)'