Code Reading2.1

問題2.1

未初期化変数がどのように扱われるか?

下記のようなソースで試したら、g_a、aともに0だった。

#include <stdio.h>
static int g_a;
int main(int argc, char** argv)
{       
    int a;
    printf("g_a=%d\n", g_a);
    printf("a = %d\n", a);
    return 0;
}       

問題2.2

echoでgetoptが使えないのはなぜ?

いろいろ試したらやっとわかった。-がついた文字が扱えなくなるので、getoptを使っていない。

問題2.3

STREQマクロを使うメリット、デメリットは?
  • メリット ロジックが直感的になる
  • デメリット パラメータチェックができない。

問題2.4

ライブラリコールしていないソースを探せ。直す方法は??

Ruby/dir.cの955行目にあった。まあ普段は、sprintfの戻りとかチェックしないけど。

~省略~
recursive = 1; 
buf = ALLOC_N(char, n+strlen(m)+3);
sprintf(buf, "%s%s", base, *base ? m :m+1);
status = glob_helper(buf, buf+n, flags, func, arg);
free(buf);
if (status) goto finalize;
~省略~

解決方法は、エラーチェックする

if( sprintf(buf, "%s%s", base, *base ? m :m+1) < 0) {
   エラー処理 
} 

問題2.5

標準出力への書き込みエラーについてのプログラムの挙動をチェックするテスト方法を考案せよ。

考え中。。デバッガでエラーを返す。テストスタブとかでエラーを返すってことで答えになっているのかな

問題2.6

sscanf,qsort,strchr, setjmp, open, adjacent_find,FormatMessage,XtOwnSelectionを使用するためのヘッダは?

manで調べた結果です。

関数名 ヘッダ
sscanf stdio.h
qsort stdlib.h
strchr string.h
setjmp setjmp.h
open fcntl.h
adjacent_find ない
FormatMessage ない
XtOwnSelection ない

SDLを使う

あるゲームプログラミングの本でSDLの話が書いてあったので試しにインストールしてみた。

  • インストール
# yum -y SDL*

インストール後に起動するかどうか書いたコード

#include <stdio.h>
#include <SDL/SDL.h>

int main(int argc, char** argv)
{
    SDL_Surface *gScreenSurface;
    SDL_Event ev;
    int x, y;

    // 初期化
    if(SDL_Init(SDL_INIT_VIDEO)){
        printf("初期化に失敗したっぽい\n");
        return 1;
    }

    // ウィンドウのタイトルとアイコン(→キャプション)を設定
    SDL_WM_SetCaption("HELLO SDL!", NULL);

    // ウィンドウの初期化
    gScreenSurface = SDL_SetVideoMode(300,200,24,SDL_SWSURFACE);
    for(y = 0; y < gScreenSurface->h; y++) {
        for(x = 0; x < gScreenSurface->w; x++) {
            *(unsigned int *)(gScreenSurface->pixels + y * gScreenSurface->pitch + x * 4) = 0xffffff;
            SDL_Flip(gScreenSurface);
        }
    }

    // 終了イベント待ち
    while(1){
        SDL_PollEvent(&ev);
        if(ev.type == SDL_QUIT) break;
    }

    SDL_Quit();
    return 0;
}

とりあえず起動することは確認した。

flexライブラリのインストール

現在読んでいる本に記載されているサンプルを実行しようとして困ったので、メモです。flex構文解析に使われるツールです。 調べたらライブラリがなかったので、そのインストール方法を忘れないためにメモします。

  • インストール
# yum install -y flex-devel
  • ビルド方法

下記のようにライブラリをリンクする。

gcc ×××× -lfl -o sample

詳しい使い方はいずれ調べる。

共有ライブラリを認識させる

OSは、Fedora17を利用しています。
libdwarf.soという共有ライブラリを手動で/usr/local/libディレクトリにインストールした時の話です。
/libディレクトリと/usr/libディレクトリはデフォルトで共有ライブラリーの含まれていますが、FedoraCentOSでは/usr/local/libディレクトリが含まれていないため、手動で追加する必要があります。

方法は二つ

  1. 環境変数 LD_LIBRARY_PATHに指定する
  2. /etc/ld.so.confに記述する

環境変数 LD_LIBRARY_PATHを使う方法

そのディレクトリを一時的に共有ライブラリ検索パスに追加することができます。ただし再起動すると元に戻ってしまうため、永続的に追加したい場合は/etc/ld.so.confに記述します。
LD_LIBRARY_PATHに指定されたディレクトリは/etc/ld.so.confに記述されたディレクトリよりも優先的に検索されます。

export LD_LIBRARY_PATH=/usr/local/bin:$LD_LIBRARY_PATH

/etc/ld.so.confに記述する方法

永続的に追加したい場合は/etc/ld.so.confに記述します。

include ld.so.conf.d/*.conf
/usr/local/lib

/etc/ld.so.confを更新したら、ldconfigコマンドを用いて/etc/ld.so.cacheの情報も更新する必要があります。

今回は、2を選択しました。lpicの勉強をした時にこの話があったような気がしましたが、忘れてしまっていた。

fcallについて

fcall,libffiで実行時にシグネチャーを指定して関数を呼び出すことができます。
実行時に困ったので、困ったところのみメモして置きます。

fcallは、-lavcall
libffiは、-lffi
をそれぞれリンクすると使える。

参考文献

Binary Hacks

読む技術(SQ3R)について

SQ3Rは、リファクタリングウェットウェアという本の中で紹介されていた方法です。効率的に本を読むです。SQ3Rは、次に示す5つのワードの頭文字を集めたものです。
以下は、本の引用です。

  • Survey(調査)

全体の要旨をつかむために目次と各章の要約を流し読みをする。

  • Question(質問)

調査した内容を踏まえて質問を考える。

  • Read(読書)

全文を読む。

  • Recite(復唱)

要約し、ノートに書き、ポイントを自分の言葉でまとめる。

  • Review(まとめ)

もう一度読み、さらにノートに書き出し、仲間と議論する。

仲間と議論するのは、今の環境だと難しいので、ブログやwikiにまとめるという手段でやってみようかな。

参考文献

リファクタリング・ウェットウェア ―達人プログラマーの思考法と学習法

リファクタリング・ウェットウェア ―達人プログラマーの思考法と学習法

libfdのリンクに失敗する問題

ls -al /usr/lib/libbfd.so自体はいるが、リンクエラーになる。
通常、シンボリックリンクになっているはずらしいが、lsコマンドで見てもリンク先が表示されなかった。そのため、ls -al /usr/lib/libbfd*をすると/usr/lib/libbfd-2.22.52.0.1-10.fc17.soがあったので、それをシンボリックリンクした。見事にコンパイルが通った。