Feature #8469

ABI checker とか導入しませんか

Added by Motohiro KOSAKI 11 months ago. Updated 10 months ago.

[ruby-dev:47383]
Status:Closed
Priority:Normal
Assignee:-
Category:-
Target version:-

Description

最近 Vit が報告してきたように、193にもたまにABI非互換が入っているようです。
見たところ実害はなさそうなのですが、非互換が報告されてから実害の有無を検討するのは不毛なのでパッチリリース前に
機械的にチェックしたいですよね。ほとんどのケースは意図的な非互換だからOKという結論になるのだろうとは思いますが、
精神衛生上、枕を高くして寝れる度がちょっとだけ上がります。

で、ちょっと時間をとってみたところ、意外と簡単そう。

http://ispras.linuxbase.org/index.php/ABI_compliance_checker にある、ABI checkerと
https://github.com/kosaki/ruby/commit/e27c2e5f1e3c7a6fc2fe8b997e95a1e52f0beed3 のパッチをダウンロードして

./ruby ../tool/abi-checker.rb ~/local/ruby-193p0 ~/local/ruby-193

とすると、スクリーンショットのような結果が得られます。
193p0とくらべて最新の193ブランチは

rbclassinitcopy ( VALUE p1, VALUE p2 )
rb
pathend ( char const* p1 )
rb
pathlastseparator ( char const* p1 )
rbpathnext ( char const* p1 )
rbpathskipprefix ( char const* p1 )
ruby
findbasename ( char const* name, long* baselen, long* alllen )
ruby
find_extname ( char const* name, long* len )

の7つのシンボルが消えてしまっているわけですね。
基本的に現在パッチリリースをしているのって世の中に三人しかいないので、うささん、ながちかさん、うらべさんの意見を聞きたい
ところですが、どうでしょうか。

screenshot1.png (236 KB) Motohiro KOSAKI, 06/01/2013 02:43 PM

screenshot2.png (256 KB) Motohiro KOSAKI, 06/01/2013 02:43 PM

History

#1 Updated by Usaku NAKAMURA 11 months ago

CIに組み込んでもらえるとちょー助かる感じですぅ

#2 Updated by Motohiro KOSAKI 11 months ago

CIに組み込んでもらえるとちょー助かる感じですぅ

CI って誰に相談すればいいんですかね。今のツールだと比較対象のバイナリまたは
ABI情報をぶっこぬいたXMLファイル群をtarアーカイブしたものを比較対象として
どこかにおいておかないといけなくて、1.9.3だとp0からはもう差異があるのはわかってるので
最新のパッチリリースをCIに置きたいところなんですけど。

#3 Updated by Akira Tanaka 11 months ago

2013年6月4日 14:23 KOSAKI Motohiro kosaki.motohiro@gmail.com:

CI って誰に相談すればいいんですかね。今のツールだと比較対象のバイナリまたは
ABI情報をぶっこぬいたXMLファイル群をtarアーカイブしたものを比較対象として
どこかにおいておかないといけなくて、1.9.3だとp0からはもう差異があるのはわかってるので
最新のパッチリリースをCIに置きたいところなんですけど。

誰に、といわれると chkbuild に関しては私でしょうが、
後でちょっと見てみます。

比較対象を用意しないといけないのが面倒くさそうでほったらかしてたんですが。
--
[田中 哲][たなか あきら][Tanaka Akira]

#4 Updated by Motohiro KOSAKI 11 months ago

CI って誰に相談すればいいんですかね。今のツールだと比較対象のバイナリまたは
ABI情報をぶっこぬいたXMLファイル群をtarアーカイブしたものを比較対象として
どこかにおいておかないといけなくて、1.9.3だとp0からはもう差異があるのはわかってるので
最新のパッチリリースをCIに置きたいところなんですけど。

誰に、といわれると chkbuild に関しては私でしょうが、
後でちょっと見てみます。

比較対象を用意しないといけないのが面倒くさそうでほったらかしてたんですが。

それが受け入れられないとするとglibc みたいに公開するシンボルを全部別ファイルに記述させて、
make tests の仮定で突き合わせをするという処理をすることになりそうですが、これは結構
めんどくさいです。正直なところ。

e.g. http://sourceware.org/git/?p=glibc.git;a=blob;f=malloc/Versions;h=7ca9bdf25fcafdf2b01080d972bbde755a4f8108;hb=HEAD

環境変数で比較対象のrubyのパスが明示されてたときのみ、比較して結果を表示。とかだと一般の
chkbuildユーザーへの迷惑がすくないかなあ。

#5 Updated by Akira Tanaka 11 months ago

2013年6月4日 15:26 KOSAKI Motohiro kosaki.motohiro@gmail.com:

比較対象を用意しないといけないのが面倒くさそうでほったらかしてたんですが。

それが受け入れられないとするとglibc みたいに公開するシンボルを全部別ファイルに記述させて、

別に受け入れられないことはなくて、おっくう、くらいの感じです。

で、試してみたんですが、--enable-shared が必要なようですね。
まぁそれはつけるとして、悩みどころは出力かなぁ。

今は標準出力に垂れ流したのをひとつのファイルとして記録しているのですが、
HTML ファイルをそのまま標準出力に出すのはよろしくないですよね。

chkbuild 的に簡単なのは w3m あたりでテキストにして標準出力に出してしまうというあたりですが。
--
[田中 哲][たなか あきら][Tanaka Akira]

#6 Updated by Motohiro KOSAKI 11 months ago

比較対象を用意しないといけないのが面倒くさそうでほったらかしてたんですが。

それが受け入れられないとするとglibc みたいに公開するシンボルを全部別ファイルに記述させて、

別に受け入れられないことはなくて、おっくう、くらいの感じです。

なるほど。じゃあ、いちど今提案している比較方式で走ってみて問題が多いようなら
再議論ということで。

で、試してみたんですが、--enable-shared が必要なようですね。

すいません、前回のメールで書き忘れました。

まぁそれはつけるとして、悩みどころは出力かなぁ。

今は標準出力に垂れ流したのをひとつのファイルとして記録しているのですが、
HTML ファイルをそのまま標準出力に出すのはよろしくないですよね。

chkbuild 的に簡単なのは w3m あたりでテキストにして標準出力に出してしまうというあたりですが。

abi-checkerのコマンドはxml出力をサポートしてるので、来週か再来週時間がとれたときに、そこからプレインテキストに変換するスクリプト書いてみます。
ところで、いま rubyci.orgでは test-all が0F0E以外のときは 1F2E
とかの数字表示とテーブルの色変更がサマリー画面のテーブルに表示されてますが、これは test-all から
grepしてるという理解であってますか?

ABI incompatible summary: nAnRnHnMnL

n: 数字、0であるべき
A: add
R: remove
H: 重要度Highの変更
M: 重要度Middleの変更
L: 重要度Lowの変更

みたいな行を先頭のほうに用意したら同じように数字が0以外のときにテーブルが赤くなるとか出来ます?

#7 Updated by Akira Tanaka 11 months ago

2013年6月6日 3:29 KOSAKI Motohiro kosaki.motohiro@gmail.com:

まぁそれはつけるとして、悩みどころは出力かなぁ。

今は標準出力に垂れ流したのをひとつのファイルとして記録しているのですが、
HTML ファイルをそのまま標準出力に出すのはよろしくないですよね。

chkbuild 的に簡単なのは w3m あたりでテキストにして標準出力に出してしまうというあたりですが。

とりあえず、w3m で整形してつけてみました。

http://www.rubyist.net/~akr/chkbuild/debian/ruby-1.9.3/log/20130606T142542Z.log.html.gz#abi-check
http://www.rubyist.net/~akr/chkbuild/debian/ruby-2.0.0/log/20130606T134647Z.log.html.gz#abi-check
http://www.rubyist.net/~akr/chkbuild/debian/ruby-trunk/log/20130606T130700Z.log.html.gz#abi-check

1.9.3 と 2.0.0 はそれぞれの p0 との比較です。
ついでに trunk は 2.0.0p0 と比較してみました。
(1.8.7 はそろそろ終わるはずなのでやってません)

abi-checkerのコマンドはxml出力をサポートしてるので、来週か再来週時間がとれたときに、そこからプレインテキストに変換するスクリプト書いてみます。
ところで、いま rubyci.orgでは test-all が0F0E以外のときは 1F2E
とかの数字表示とテーブルの色変更がサマリー画面のテーブルに表示されてますが、これは test-all から
grepしてるという理解であってますか?

出力から行単位にパターンマッチして抜き出してます。
Ruby で書いてあるので、増やしたりなんなりはそんなにむずかしくはありません。
(ただし、行単位でその行を認識できる必要があります)

ABI incompatible summary: nAnRnHnMnL

n: 数字、0であるべき
A: add
R: remove
H: 重要度Highの変更
M: 重要度Middleの変更
L: 重要度Lowの変更

みたいな行を先頭のほうに用意したら同じように数字が0以外のときにテーブルが赤くなるとか出来ます?

抜き出してタイトルなどにつけるのはできると思います。
タイトルは recent.html の一行にもなり、rubyci.org は recent.html を読んでいるので、
rubyci.org まで情報は届きます。

赤くなるかどうかはよくわかりません。
どうやって色が変わっているか理解していないので。
というか HTML を読んでも色がどうやってついているのかわからないのです。
(なるせさんはなんか CSS でがんばっていると言ってていたような気がします)
--
[田中 哲][たなか あきら][Tanaka Akira]

#8 Updated by Motohiro KOSAKI 11 months ago

2013/6/6 Tanaka Akira akr@fsij.org:

2013年6月6日 3:29 KOSAKI Motohiro kosaki.motohiro@gmail.com:

まぁそれはつけるとして、悩みどころは出力かなぁ。

今は標準出力に垂れ流したのをひとつのファイルとして記録しているのですが、
HTML ファイルをそのまま標準出力に出すのはよろしくないですよね。

chkbuild 的に簡単なのは w3m あたりでテキストにして標準出力に出してしまうというあたりですが。

とりあえず、w3m で整形してつけてみました。

http://www.rubyist.net/~akr/chkbuild/debian/ruby-1.9.3/log/20130606T142542Z.log.html.gz#abi-check
http://www.rubyist.net/~akr/chkbuild/debian/ruby-2.0.0/log/20130606T134647Z.log.html.gz#abi-check
http://www.rubyist.net/~akr/chkbuild/debian/ruby-trunk/log/20130606T130700Z.log.html.gz#abi-check

1.9.3 と 2.0.0 はそれぞれの p0 との比較です。
ついでに trunk は 2.0.0p0 と比較してみました。
(1.8.7 はそろそろ終わるはずなのでやってません)

うを。なんと、もうできたとは。もうこれでいいじゃん!出力想像してたよりも
ずっと綺麗だし。

#9 Updated by Nobuyoshi Nakada 11 months ago

(13/06/07 0:42), Tanaka Akira wrote:

http://www.rubyist.net/~akr/chkbuild/debian/ruby-trunk/log/20130606T130700Z.log.html.gz#abi-check

1.9.3 と 2.0.0 はそれぞれの p0 との比較です。
ついでに trunk は 2.0.0p0 と比較してみました。

confname.hというファイルで大量に出ているようなんですが、これは何でしたっけ。

--
--- 僕の前にBugはない。
--- 僕の後ろにBugはできる。
中田 伸悦

#10 Updated by Akira Tanaka 11 months ago

2013年6月7日 12:31 Nobuyoshi Nakada nobu@ruby-lang.org:

confname.hというファイルで大量に出ているようなんですが、これは何でしたっけ。

/usr/include/bits/confname.h っぽいですが、なんですかねぇ。
--
[田中 哲][たなか あきら][Tanaka Akira]

#11 Updated by Akira Tanaka 11 months ago

2013年6月7日 2:08 KOSAKI Motohiro kosaki.motohiro@gmail.com:

1.9.3 と 2.0.0 はそれぞれの p0 との比較です。
ついでに trunk は 2.0.0p0 と比較してみました。
(1.8.7 はそろそろ終わるはずなのでやってません)

うを。なんと、もうできたとは。もうこれでいいじゃん!出力想像してたよりも
ずっと綺麗だし。

そういえば、これのためにこさきさんが書いた
https://github.com/kosaki/ruby/commit/e27c2e5f1e3c7a6fc2fe8b997e95a1e52f0beed3
の abi-checker.rb を chkbuild に入れたんですが、
chkbuild が修正BSDライセンスなので、abi-checker.rb も修正BSDライセンスでいいでしょうか?

入れた commit:
https://github.com/akr/chkbuild/commit/8fbf082a694938604a8d8275172f3de3284058d6

あるいは abi-checker.rb は ruby 本体に入れる想定なのかなぁ。
今から 1.9.3 や 2.0.0 ブランチに入れるのかという話はありますが。
--
[田中 哲][たなか あきら][Tanaka Akira]

#12 Updated by Motohiro KOSAKI 11 months ago

入れた commit:
https://github.com/akr/chkbuild/commit/8fbf082a694938604a8d8275172f3de3284058d6

あるいは abi-checker.rb は ruby 本体に入れる想定なのかなぁ。
今から 1.9.3 や 2.0.0 ブランチに入れるのかという話はありますが。

最初、chkbuildに組み込むところまで、考えてなくてRubyに入れて手動で実行するイメージだったんですが、明らかにchkbuildのほうが使い勝手がよいのでakrさんがよろしければ
chkbuildのツリーに入れていただきたいです。ライセンスは chkbuild本体と同じで。

#13 Updated by Motohiro KOSAKI 11 months ago

confname.hというファイルで大量に出ているようなんですが、これは何でしたっけ。

/usr/include/bits/confname.h っぽいですが、なんですかねぇ。

trunk だと、defines.hがunistd.h をincludeするようになったので、C拡張からみると
ruby.h をインクルードした時に定義されるSymbolが増えているということだと思います。

このへんの Severity rankがついていない、Other changes
はあんまり気にしなくていいんじゃないかな。どのみち衝突するのはCコードが _
始まりのシンボルを使っていた時だけで、それは自分の足を撃つ自由というやつなので。

紛らわしいから消せという意見がたくさん来たら、どっかに時間取ってスクリプト書きます

#14 Updated by Akira Tanaka 11 months ago

2013年6月8日 4:36 KOSAKI Motohiro kosaki.motohiro@gmail.com:

あるいは abi-checker.rb は ruby 本体に入れる想定なのかなぁ。
今から 1.9.3 や 2.0.0 ブランチに入れるのかという話はありますが。

最初、chkbuildに組み込むところまで、考えてなくてRubyに入れて手動で実行するイメージだったんですが、明らかにchkbuildのほうが使い勝手がよいのでakrさんがよろしければ
chkbuildのツリーに入れていただきたいです。ライセンスは chkbuild本体と同じで。

ライセンスを書いておきました。
https://github.com/akr/chkbuild/commit/a00f5b7fc15affc2fbea57c2fdfd65eb7d77ea0c

Ruby 側に abi-checker.rb があればそっちを実行するとかもできるので、
いろいろと改造したくなったらそういうことも考えましょう。
--
[田中 哲][たなか あきら][Tanaka Akira]

#15 Updated by Motohiro KOSAKI 10 months ago

  • Status changed from Open to Closed

Closeするの忘れてました。すいません。

#16 Updated by Motohiro KOSAKI 10 months ago

2013/7/8 kosaki (Motohiro KOSAKI) kosaki.motohiro@gmail.com:

Issue #8469 has been updated by kosaki (Motohiro KOSAKI).

Status changed from Open to Closed

Closeするの忘れてました。すいません。

閉じてから聞くのもアレなんですが、rubyci.org のトップページの表に ABI breakage のカラムを追加するのは誰に相談すればよいでしょうか?

#17 Updated by Usaku NAKAMURA 10 months ago

こんにちは、なかむら(う)です。

In message " Re: [ruby-trunk - Feature #8469][Closed] ABI checker とか導入しませんか"
on Jul.09,2013 09:11:18, kosaki.motohiro@gmail.com wrote:

閉じてから聞くのもアレなんですが、rubyci.org のトップページの表に ABI breakage のカラムを追加するのは誰に相談すればよいでしょうか?

成瀬さんかな。どうでしょう?

それでは。
--
U.Nakamura usa@garbagecollect.jp

#18 Updated by Akira Tanaka 10 months ago

2013年7月9日 9:11 KOSAKI Motohiro kosaki.motohiro@gmail.com:

閉じてから聞くのもアレなんですが、rubyci.org のトップページの表に ABI breakage のカラムを追加するのは誰に相談すればよいでしょうか?

  1. (私が開発している) chkbuild が recent.html などを生成 recent.html の例: http://www.rubyist.net/~akr/chkbuild/debian/ruby-trunk/recent.html
  2. (なるせさんが開発している) rubyci が各地の recent.html をとってきて表示

    なので、まずは私ですかね。

    ABI checker の結果はあまり真面目に読んでいないのですが、
    http://www.rubyist.net/~akr/chkbuild/debian/ruby-1.9.3/log/20130708T174556Z.log.html.gz#abi-check
    でいえば、Problem Summary の

              Severity Count
    

    Added Symbols - 17
    Removed Symbols High 8
    Problems with High 0
    Data Types Medium 0
    Low 0
    Problems with High 0
    Symbols Medium 0
    Low 0
    Problems with Low 1
    Constants
    Other Changes - 3
    in Constants

    というのを縮めて ABI:8H1L あたりですかね。

    [田中 哲][たなか あきら][Tanaka Akira]

#19 Updated by Motohiro KOSAKI 10 months ago

2013/7/8 Tanaka Akira akr@fsij.org:

2013年7月9日 9:11 KOSAKI Motohiro kosaki.motohiro@gmail.com:

閉じてから聞くのもアレなんですが、rubyci.org のトップページの表に ABI breakage のカラムを追加するのは誰に相談すればよいでしょうか?

  1. (私が開発している) chkbuild が recent.html などを生成 recent.html の例: http://www.rubyist.net/~akr/chkbuild/debian/ruby-trunk/recent.html
  2. (なるせさんが開発している) rubyci が各地の recent.html をとってきて表示

なので、まずは私ですかね。

ABI checker の結果はあまり真面目に読んでいないのですが、
http://www.rubyist.net/~akr/chkbuild/debian/ruby-1.9.3/log/20130708T174556Z.log.html.gz#abi-check
でいえば、Problem Summary の

             Severity Count

Added Symbols - 17
Removed Symbols High 8
Problems with High 0
Data Types Medium 0
Low 0
Problems with High 0
Symbols Medium 0
Low 0
Problems with Low 1
Constants
Other Changes - 3
in Constants

というのを縮めて ABI:8H1L あたりですかね。

Lowはどうせみんな無視すると思ってるので 8
だけでいいと思います。当面は。Highで補足できない(かつ我々が補足したい)具体事例が出てからプラスα考えればいいと思います。
abi-compliance-checkerコマンド起動するときに -abi オプションつければソースコンパチビリティをチェックしなくなるので、

Removed Symbols High 8
Problems with High 0
Data Types Medium 0
Problems with High 0
Symbols Medium 0

の五行を単純にgrepで拾ってきて数字加算すればいいかなあぐらいのイメージなんですが、どうでしょう。

#20 Updated by Akira Tanaka 10 months ago

2013年7月9日 10:25 KOSAKI Motohiro kosaki.motohiro@gmail.com:

Lowはどうせみんな無視すると思ってるので 8
だけでいいと思います。当面は。Highで補足できない(かつ我々が補足したい)具体事例が出てからプラスα考えればいいと思います。
abi-compliance-checkerコマンド起動するときに -abi オプションつければソースコンパチビリティをチェックしなくなるので、

Removed Symbols High 8
Problems with High 0
Data Types Medium 0
Problems with High 0
Symbols Medium 0

の五行を単純にgrepで拾ってきて数字加算すればいいかなあぐらいのイメージなんですが、どうでしょう。

えぇ、実際そんなかんじで実装することになります。

とりあえず動かして見たところ、
rubyci でも赤くなったようです。

おすすめのとおり Low は無視しています。
Medium は無視してません。

なお、trunk については ABI incompatible なのはそういうものなので、
recent.html には出さない (rubyci には表示されない) ようにしています。
--
[田中 哲][たなか あきら][Tanaka Akira]

Also available in: Atom PDF