2008年9月6日土曜日

【例解UNIX】Cの復習(2):ポインタ、バイトオーダ、複雑な型 (その4)

こつこつ。2.8 章末問題

  • 1 (5分くらい)

    • 特になし。

  • 2 (20分くらい)

    • 問題文を理解していなくて、単に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=''
      $

      where is 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時間もつかってしまった。でも勉強になった。

  • 4

    • これは三つ星なので、パス!


Cの復習はこれでおわり。
次回は、ついに本論開始。「低水準入出力」

0 件のコメント: