C/C++のポインタの機能--参照渡しのような処理 - builder by ZDNet Japanで、Electric Fenceの紹介につなげる記事にしようと思ったのですが
electric-fence-win32 - Google CodeElectric Fenceのwin32版なんてものを見つけてしまった。
てっきりUNIX版と同様、リンクすれば動くと思って色々試したけど、どうやらそうじゃないみたい。
//#include <efence.h>
#include <stdio.h>
int main( void ) {
char *a = (char*)malloc(12);
a[ 0] = 'H';
a[ 1] = 'e';
a[ 2] = 'l';
a[ 3] = 'l';
a[ 4] = 'o';
a[ 5] = ',';
a[ 6] = ' ';
a[ 7] = 'W';
a[ 8] = 'o';
a[ 9] = 'r';
a[10] = 'l';
a[11] = 'd';
a[12] = '\0';
return 0;
}
オーバーランを検知してくれなかった。README.win32によるとと書いてありました。てっきりスタートアップルーチンを入れ替えてくれてくれる物かと思って少しだけ期待してしまいました。Since you need to modify your own project anyway, simply add efence.c, page-win32.c, and print.c to your project.
mingw32ならば
Index: Makefile
===================================================================
--- Makefile (revision 7)
+++ Makefile (working copy)
@@ -9,7 +9,7 @@
MAN_INSTALL_DIR= /usr/man/man3
PACKAGE_SOURCE= README libefence.3 Makefile efence.h \
- efence.c page.c print.c eftest.c tstheap.c CHANGES COPYING
+ efence.c page-win32.c print.c eftest.c tstheap.c CHANGES COPYING
# Un-comment the following if you are running HP/UX.
# CFLAGS= -Aa -g -D_HPUX_SOURCE -DPAGE_PROTECTION_VIOLATED_SIGNAL=SIGBUS
@@ -26,7 +26,7 @@
# as well if using Sun's compiler, -static if using GCC.
# CFLAGS= -g -Bstatic -DPAGE_PROTECTION_VIOLATED_SIGNAL=SIGBUS
-OBJECTS= efence.o page.o print.o
+OBJECTS= efence.o page-win32.o print.o
all: libefence.a tstheap eftest
@ echo
@@ -63,7 +63,7 @@
tstheap: libefence.a tstheap.o
- rm -f tstheap
- $(CC) $(CFLAGS) tstheap.o libefence.a -o tstheap -lpthread
+ $(CC) $(CFLAGS) tstheap.o libefence.a -o tstheap -lpthreadGC2
eftest: libefence.a eftest.o
- rm -f eftest
こんな風に修正して
mingw32-make CC=gcc libefence.a
でlibefence.aが出来上がり、上のソースの冒頭の「//」を外して
#include <efence.h>
#include <stdio.h>
int main( void ) {
char *a = (char*)malloc(12);
a[ 0] = 'H';
a[ 1] = 'e';
a[ 2] = 'l';
a[ 3] = 'l';
a[ 4] = 'o';
a[ 5] = ',';
a[ 6] = ' ';
a[ 7] = 'W';
a[ 8] = 'o';
a[ 9] = 'r';
a[10] = 'l';
a[11] = 'd';
a[12] = '\0';
return 0;
}
あぶないコードに修正した後
gcc -g -o dame.exe dame.c -lefence
とすれば、efenceビルドされたdame.exeが出来上がり実行すると、正しくクラッシュしてくれる。gdbで確認すれば
C:¥temp¥electric-fence-win32>gdb dame.exe
GNU gdb 6.3
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB. Type "show warranty" for details.
This GDB was configured as "i686-pc-mingw32"...
(gdb) run
Starting program: C:¥temp¥electric-fence-win32/dame.exe
...
Program received signal SIGSEGV, Segmentation fault.
0x00401396 in main () at dame.c:17
17 a[12] = '\0';
(gdb)
とクラッシュ場所も分かると。でもUNIX版みたくソースは修正したくないなぁ。あとmallocでなく
char a[12];
とした場合にクラッシュしてくれないのならば、威力半減ってところか。