MPFI のバグを修正したときの作業記録

多倍長区間演算ライブラリ MPFI を使っていたら segmentation fault が起こり、調べていたら MPFI 自体のバグだった。 このページは、Ubuntu 10.10 で MPFI のバグを修正して、メールで連絡したときの作業記録。

ソースコードの修正

ソースコードの取得

MPFI のリポジトリは subversion なのだが、私は git ユーザなので

git svn clone -s svn://scm.gforge.inria.fr/svn/mpfi

として git で管理する。

まずは、README や README.dev などに目を通す。

トピックブランチの作成

バグを修正するためのトピックブランチを作り、そのブランチに切り替える。

git checkout -b fix-sub-fr

とりあえずコンパイル

まずは、コンパイルしてみる。 README.dev にあるように

autoreconf -i

とする。

Can't exec "libtoolize": そのようなファイルやディレクトリはありません at /usr/bin/autoreconf line 196.

となってエラーが出たので、

sudo aptitude install libtoolize

として必要なソフトウェアをインストールする。

./configure
make

コンパイルが終わったら

make check

でエラーがないかを確認する。

テストの追加

扱うのは、mpfi_sub_fr を [0, 0] に対して実行すると segmentation fault が起こる場合があるというバグである。

バグを修正する前に、エラーが出るようなテストを追加する。 MPFI の場合は tests 以下にテストがあり、 tests/.c のファイルが条件を記述した tests/.dat ファイルを読み込んでテストを実行していた。 mpfi_sub_fr は sub_fr.c の中でテストされているので sub_fr.dat に条件を書き加える。

関数におかしなポインタを渡しているというエラーなので条件によっては segmentation fault が再現しない。 今回は、なぜかほとんどの場合、エラーが再現しなかった。

ここで、テストの追加を git にコミットする。

バグの修正

mpfi_sub_fr は src/sub_fr.c で定義されている。 このファイルを修正し、変更をコミットする。

パッチをメールで送る

git diff --no-prefix --relative=mpfi master > patchfile

としてパッチを作成してメールで送った。 取り込んでくれると良いのだが。

Debian・Ubuntu 用のパッケージの作成

パッケージのソースを git.debian.org から取得

バグを修正した deb パッケージを作成する。 http://git.debian.org/?p=collab-maint/mpfi.git;a=summary に debian のパッケージ用のリポジトリがある。まず、

git clone git://git.debian.org/collab-maint/mpfi.git mpfi.debian

として適当なディレクトリに複製する。 このリポジトリを上で subversion から作成したリポジトリのブランチにしたかったのだが subversion から作った方は mpfi/mpfi となっていて、 ディレクトリの階層が合わなかったので断念した。

cd mpfi.debian
git pull origin upstream:upstream

で upstream ブランチを取得する。 master ブランチで

git-buildpackage

を実行してパッケージが作成できるかを確認する。

ブランチを作成してパッチを当てる

git checkout -b customize

としてパッチを当てるためのブランチを作成する。

patch -p0 < patchfile

で先ほど作成したパッチを当てる。

メンテナの名前を変える

メンテナが自分になっていないと「秘密鍵が得られません」となるので debian/controal の Maintainer の部分を変更する。 もちろん、あらかじめ鍵の設定をしておく必要がある。

スナップショットのパッケージの作成

ブランチ customize を元にして野良パッケージを作る。 git-buildpackage を使う場合、master がパッケージ作成元のブランチで、 upstream が元のソースコードのブランチになっているので、 オプションで使用するブランチを指定してコマンドを実行することになる。

git-dch --snapshot --auto --debian-branch=customize

としてスナップショット用のバージョンが debian/changelog に記載する。 master ブランチで作業していないので「–debian-branch=customize」が必要。 debian/changelog が問題なければ

git commit -a

としてコミットする。

git-buildpackage --git-debian-branch=customize

でパッケージを作成する。 「–git-debian-branch=customize」はブランチ customize からパッケージを作るというオプション。

Tags of current page

, , , , ,