- 1 (5分くらい)
- 特になし。
- 特になし。
- 2 (20分くらい)
- 問題文を理解していなくて、単にm * nの領域をとって2次元配列的に使う実装をしてしまった。そこから修正。
- 問題文を理解していなくて、単にm * nの領域をとって2次元配列的に使う実装をしてしまった。そこから修正。
- 3 (180分くらい)
- うお。OSXにもUbuntuにも、デフォルトではlibmudflapが入ってない。
- Ubuntuにはパッケージがあるようだ。Ubuntuにする。いれる。 sudo aptitude install libmudflap0。
- ぬお。Ubuntu上でleak.cをコンパイルしようとするとstdlib.hが無いと言われる。locateしてみるとたしかに無い? stdlib.hってそういうものなんだ。man mallocでヘッダを確認。あり? stdlib.hじゃん。なんで無いの? man stdlib.h しても有益な情報はなし。
- find / -name "*.h" してみると、Ubuntuにはデフォルトで開発用ヘッダが入っていないような、という感じ。
/usr/lib/gcc/i486-linux-gnu/4.2/include/decfloat.h
/usr/lib/gcc/i486-linux-gnu/4.2/include/unwind.h
/usr/lib/gcc/i486-linux-gnu/4.2/include/limits.h
/usr/lib/gcc/i486-linux-gnu/4.2/include/linux/a.out.h
/usr/lib/gcc/i486-linux-gnu/4.2/include/pmmintrin.h
/usr/lib/gcc/i486-linux-gnu/4.2/include/emmintrin.h
/usr/lib/gcc/i486-linux-gnu/4.2/include/mm3dnow.h
/usr/lib/gcc/i486-linux-gnu/4.2/include/asm/posix_types.h
/usr/lib/gcc/i486-linux-gnu/4.2/include/varargs.h
/usr/lib/gcc/i486-linux-gnu/4.2/include/iso646.h
/usr/lib/gcc/i486-linux-gnu/4.2/include/mmintrin.h
/usr/lib/gcc/i486-linux-gnu/4.2/include/stdbool.h
/usr/lib/gcc/i486-linux-gnu/4.2/include/float.h
/usr/lib/gcc/i486-linux-gnu/4.2/include/omp.h
/usr/lib/gcc/i486-linux-gnu/4.2/include/mm_malloc.h
/usr/lib/gcc/i486-linux-gnu/4.2/include/xmmintrin.h
/usr/lib/gcc/i486-linux-gnu/4.2/include/stdarg.h
/usr/lib/gcc/i486-linux-gnu/4.2/include/syslimits.h
/usr/lib/gcc/i486-linux-gnu/4.2/include/stddef.h - aptitude search gcc。この結果から、gcc-multilibとかにいるのかなと思って、パッケージ落として中身をみてみた(dpkg-deb --contents
)が、いない。 - Ubuntuのサイトでパッケージの中身検索をしようと思ったが、どこでできるのかわからない。
- しょうがないのでdebian.orgで検索。
- 検索結果から、そもそもlibc関係のファイルが足りてないのか、と推察。
- apptitude search libc6。libc6-devのステイタスが"pi"だ。なんじゃこりゃ? man apptitude。「存在していないけど、インストール予定」とな。誰が予定したか、わけわからん。しかしこれだろう。
- sudo apptitude install libc6-dev。libc6-devとlinux-libc-devが入った。
- を、/usr/includeにわんさかできた。
- stdlib.hが無いとは言われなくなった。
- "cc1: error: mf-runtime.h: No such file or directory"とおっしゃる。(gcc)
- たしかにfindしてもいない。
- ああ、Ubuntu(debian)では、開発者はdevをいれねばならんのか。
- sudo aptitude -s install libmudflap0-dev。おお、これはgcc-4.1用なのね。
- sudo aptitude -s install libmudflap0-4.2-dev。ok。
- sudo aptitude install libmudflap0-4.2-dev。ok。findすると、いるいる。
- ヘッダが無い、とはいわれなくなったが、__mf*的なメッセージがごちゃごちゃでてコンパイルが失敗する。
- これは、leak.cでもそうだし、他のソース(メモリ操作を含まない)でもそうだった。単純にライブラリの場所をしらんのかな。
- gcc -Wall -g leaks -fmudflap -lmudflap。ok。
- MUDFLAP_OPTIONS="-help" ./a.out。ok。次のヘルプがでる。
This is a single-threaded thread-unaware GCC "mudflap" memory-checked binary.
Mudflap is Copyright (C) 2002-2004 Free Software Foundation, Inc.
The mudflap code can be controlled by an environment variable:
$ export MUDFLAP_OPTIONS=''
$
whereis a space-separated list of
any of the following options. Use `-no-OPTION' to disable options.
-mode-nop mudflaps do nothing
-mode-populate mudflaps populate object tree
-mode-check mudflaps check for memory violations [active]
-mode-violate mudflaps always cause violations (diagnostic)
-viol-nop violations do not change program execution [active]
-viol-abort violations cause a call to abort()
-viol-segv violations are promoted to SIGSEGV signals
-viol-gdb violations fork a gdb process attached to current program
-trace-calls trace calls to mudflap runtime library
-verbose-trace trace internal events within mudflap runtime library
-collect-stats collect statistics on mudflap's operation
-sigusr1-report print report upon SIGUSR1
-internal-checking perform more expensive internal checking
-print-leaks print any memory leaks at program shutdown
-check-initialization detect uninitialized object reads
-verbose-violations print verbose messages when memory violations occur [active]
-abbreviate abbreviate repetitive listings [active]
-timestamps track object lifetime timestamps [active]
-ignore-reads ignore read accesses - assume okay
-wipe-stack wipe stack objects at unwind
-wipe-heap wipe heap objects at free
-heur-proc-map support /proc/self/map heuristics
-heur-stack-bound enable a simple upper stack bound heuristic
-heur-start-end support _start.._end heuristics
-heur-stdlib register standard library data (argv, errno, stdin, ...) [active]
-free-queue-length=N queue N deferred free() calls before performing them [4]
-persistent-count=N keep a history of N unregistered regions [100]
-crumple-zone=N surround allocations with crumple zones of N bytes [32]
-lc-adapt=N adapt mask/shift parameters after N cache misses [1000003]
-backtrace=N keep an N-level stack trace of each call context [4]- しかし、leak.cは何もいってくれない。
- dangling.cはいってくれる。
*******
mudflap violation 1 (check/write): time=1220683685.027955 ptr=0x80cac98 size=4
pc=0xb7efb7bd location=`dangling.c:9 (main)'
/usr/lib/libmudflap.so.0(__mf_check+0x3d) [0xb7efb7bd]
./a.out(main+0x9a) [0x80487be]
/usr/lib/libmudflap.so.0(__wrap_main+0x49) [0xb7efb259]
Nearby object 1: checked region begins 4729B after and ends 4732B after
mudflap object 0x80ca028: name=`__mf_lookup_cache'
bounds=[0x8049a20,0x80c9a1f] size=524288 area=no-access check=0r/0w liveness=0
alloc time=1220683685.024966 pc=0xb7efb1fd
Nearby object 2: checked region begins 0B into and ends 3B into
mudflap dead object 0x80cace0: name=`malloc region'
bounds=[0x80cac98,0x80cac9b] size=4 area=heap check=0r/0w liveness=0
alloc time=1220683685.025568 pc=0xb7efb1fd
/usr/lib/libmudflap.so.0(__mf_register+0x3d) [0xb7efb1fd]
/usr/lib/libmudflap.so.0(__wrap_malloc+0xde) [0xb7efc72e]
./a.out(main+0x2c) [0x8048750]
/usr/lib/libmudflap.so.0(__wrap_main+0x49) [0xb7efb259]
dealloc time=1220683685.027660 pc=0xb7efb1a6
/usr/lib/libmudflap.so.0(__mf_unregister+0x36) [0xb7efb1a6]
/usr/lib/libmudflap.so.0(__real_free+0x88) [0xb7efbff8]
./a.out(main+0x3a) [0x804875e]
/usr/lib/libmudflap.so.0(__wrap_main+0x49) [0xb7efb259]
number of nearby objects: 2- overrun.cもいってくれるな。
- うむ。3時間もつかってしまった。でも勉強になった。
- Ubuntuのサイトでパッケージの中身検索をしようと思ったが、どこでできるのかわからない。
- うお。OSXにもUbuntuにも、デフォルトではlibmudflapが入ってない。
- 4
- これは三つ星なので、パス!
- これは三つ星なので、パス!
Cの復習はこれでおわり。
次回は、ついに本論開始。「低水準入出力」
0 件のコメント:
コメントを投稿