January 2013

http://gnu.wildebeest.org/blog/mjw/2012/03/16/automagically-merging-changelog-files-with-mercurial-or-git/

GIT

For git add the following lines to your ~/.gitconfig

[merge "merge-changelog"]
name = GNU-style ChangeLog merge driver
driver = /usr/local/bin/git-merge-changelog %O %A %B

[core]
attributesfile = ~/.gitattributes
And add the following line to ~/.gitattributes

ChangeLog merge=merge-changelog



うーむ、いまどきは project/.git/info/attributes をいじるのは古いのだな。git 1.7.4以降だからCentOS6だと使えないのが玉に瑕だけど。

glibcのバージョンってプログラムから簡単に得る方法ないと思ってたけどあったわ。

#include <stdio.h>
#include <gnu/libc-version.h>

int main (void)
{
puts (gnu_get_libc_version ());
puts (gnu_get_libc_release ());
return 0;
}



% ./a.out
2.12
stable



これでバージョン依存のworkaroundいれるのが捗るな

3年ほどまえにtopコマンドのswapフィールドが壊れているという記事を書いたんだけど

http://mkosaki.blog46.fc2.com/blog-entry-1115.html


そのときはprocpsパッケージがメンテナ不在状態で、投稿パッチが放置されてしまってた。で、最近見なおしたらprocps自体がprocps-ngという亜流にforkして、メンテナが代わり、

まったく同じパッチが違う人の手によって procps-ng 3.3.3 でマージされてた。変数名まで同じだけどクレジットはなし。むむん

ちょっと追ってみたんだけど、procps-ngのNEWSだと Debian #628462 を参照していて

procps-ng-3.3.3
---------------
* watch -g command repeats until something changes
* Changed labels of kB etc to KiB Debian #662786
* top supports hotplugged memory and cpus Debian #351934, #459287
* top %cpu not distorted when switch to/from threads Debian #441166
* top can read old toprc configuration files Debian #651213, #651863
* top supports input paste once again Debian #663334
* top -p avoids SEGV when pid doesn't exist Debian 668335
* Various DejaGNU test cases fixed
* pgrep.1 graoff syntax fix Debian #665425
* sysctl avoid crash when -p file has unexpected input
* sysctl .conf off-by-one error Debian #669128
* libprocps: protect locale env getting overwrite RedHat #548711

* Documentation catch up (fixed prior to 3.3.3)
. top repeating "%" wastes space Debian #322984
. top -U user name parse error Debian #623200
. top memory leaks Debian #627257
. top impossible task swap statistics Debian #628462
. top forest view segfault Debian #650864



そっちでは、Fedoraで同じ障害あって独自パッチでもう直ってるよー、みたいな話があって

http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=628462

で、Fedoraのほうを見ると自分で直したかのように書いてあるけど、

https://bugzilla.redhat.com/show_bug.cgi?id=532668


RPMをみると、
http://lists.fedoraproject.org/pipermail/scm-commits/2011-June/609617.html

%changelog
+* Wed Jun 01 2011 Jan Görig 3.2.8-20.20110302git
+- fix #532668 - procps/top SWAP statistics makes no sense (adapted patch from Mr. Kosaki)



などと、しれっと書いてあるな。

まあ、パッチ取り込むのに反対はあるはずないんだけど、本人に連絡よこせという話である。


追記: procps-ngを亜流と書いてしまったけど、全ディストロがprocps-ngに移行してしまった今となってはこっちが本流だな

glibcでrealloc(ptr, 0)とわたしたときに、mtraceのログがおかしいというバグがあってその議論が面白かったのでご紹介。
http://sourceware.org/bugzilla/show_bug.cgi?id=14981

reallocという関数がある。まあ、みなさんよくご存知のように realloc(ptr, size)とわたしたときにptrをsizeの大きさに拡張(縮小)してくれる関数である。

malloc(0)がNULLを返しても非NULLを返してもいいように、realloc(ptr, 0)も挙動に実装の自由度がある

1.realloc(ptr, 1) と同等(mallocが非NULLを返すケースではこれが普通)
2.ptrは解放され、NULLが返る(mallocがNULLを返すケースでは常識的な挙動)
3.ptrは解放されず、NULLが返る(mallocがNULLを返すケースでは同じくらい常識的な挙動、malloc(0)をエラーとみなす哲学だと関数の最初に引数チェックをするのは理解できる)

The Austin Group Defect Report #400
http://www.open-std.org/jtc1/sc22/wg14/www/docs/dr_400.htm

によると、AIXとglibcが2、BSD系が3のようである。ところでPOSIXはテキストの書き方がわるくて3しか認めないような文章になってるから規格を直さないといけないんじゃないかな。という議論をしている

で、glibcに戻るとglibc 2.17までの挙動は

・malloc(0)は非NULLを返す(環境によるけど malloc(16)と同じになると思う)
・しかしなぜか realloc(ptr, 0) は free(ptr) と同じ挙動をし、NULLを返す(0サイズのメモリをアロケートしてはくれない)
・そしてmtraceのrealloc hookではrealloc(ptr, 0) で 非NULL が返ってくることを期待していてNULLは全部エラーとして扱っている

という不整合があり、正しくログがとれていなかった。

で、いつものようにみんなで規格書パース合戦を繰り広げた後、Roland McGrath が仲裁にはいって、ログと実際の挙動が違っているのは明らかにバグだから2.18ではmtraceを変える。realloc(ptr, 0)の挙動を変えるかどうかは規格解釈をglibc MLで議論するのがそもそも間違っていて、Austinで議論してから、必要なら変える。このコーナーケース
について変えてはいけないとは思わないが、規格に対する推測をもとに変更はしない。という結論になった。

まあ、順当なところかな。malloc(0)とrealloc(ptr, 0)の挙動が一貫してないのは気持ち悪いけど。

↑このページのトップヘ