« C-0.02 | メイン | MIME::Base64::URLSafe »

2006年01月12日

C-0.03

 C-0.03 をリリースします。

ダウンロード: RPM, ソースコード (GPL)

 上の RPM (竹迫さん作です。ありがとうございます) をインストールするか、ソースコードをダウンロードして cp C-0_03 /usr/bin/C && chmod 755 /usr/bin/C すれば、インストール完了です。
 Plamo Linux/Slackware や Debian を使っている場合でもRPM から変換してインストールできるらしいです。

 0.03 での変更点は、以下の3点です。

C++ に対応:
 -p オプションを使用して、C++ のコードを実行できるようになりました。残念ながら、 main 関数を省略することはできませんが。

% C -p -e 'int main(int, char**) { cout << "hello world" << endl; }'
hello world

-l オプションの追加:
 GCC の引数の末尾にオプションを追加することができるようになりました。-l オプション等、順序が問題になる際に使用することができます。

シンボリック攻撃に対する脆弱性を修正:
 シンボリックリンク攻撃 (symlink attack) が可能だった問題を修正しました。

以上です。

 なお、この場をお借りして、コードを添削していただいた弾さんにお礼を申し上げます。より一般的な Perl コードになったと思います。以下は、気になった点のメモ&回答。

tmpnam()はFile::Tempのそれを使うべし。POSIXと同じく標準装備の上よりportable。

 指摘ありがとうございます。今回のケースでは gcc の出力も保護する必要があるので、 tempfile ではなく tempdir を使った実装に修正しました。

 前versionではGetopt::Stdを使おうとして使ってなくて、結局手で実装していたみたいだけど、Getopt::Std素直に使った方がいいと思うのだけど。コンパイルされたbinaryに引数を渡すため?

 Getopt::Std では、 -cWall -cO2 (gcc に -Wall -O2 を渡す) のように、同一名称を持つオプションを複数回使用できない (と思う) からです。

if (my $err = system(@gcc, '-o', $out_file, $src_file)){
    cleanup();
    $! = $err >> 8; # 宿題:これが何を意味しているのか調べてみよう
    die "failed to execute gcc: $! ($?)"
}

回答:終了コードを errno に代入しても意味がない。
#出題ミスでしょうか?

※※※ C インタプリタの最新の情報は、C アーカイブ をご覧ください ※※※

投稿者 kazuho : 2006年01月12日 13:22 このエントリーを含むはてなブックマーク このエントリーを含むはてなブックマーク

トラックバック

このエントリーのトラックバックURL:
http://labs.cybozu.co.jp/cgi-bin/mt-admin/mt-tbp.cgi/335

このリストは、次のエントリーを参照しています: C-0.03:

» Cのワンライナー from sh1.2 pyblosxom
C言語のワンライナー"C(らーじしー)"をpythonで実装してみた。 [続きを読む]

トラックバック時刻: 2006年01月29日 19:10

コメント

perldoc -f die.
... exits with the current value of $! (errno) ...
こんな機能があったのですね.
自分で終了ステータスいれてdieしたいときには便利?
今回に関しては If $! is 0, exits with the value of "($? >> 8)" ともあるので冗長ではある点と,
起動したプログラムの終了コードがエラーコードでない限りそれを$!として評価しても混乱するメッセージがでるだけというのがちょっと難. $err==0/!=0で違うエラーメッセージにしないと.

投稿者 hio : 2006年01月26日 16:10

ちょっと動作を試したいときとかすごい便利ですね。
あまりにもおもしろかったので自分でもPythonで実装してみました。
Perl/C版に比べて特に利点はありません。むしろ遅くなったくらいでしょうか(笑)

sh1.2 pyblosxom: Cのワンライナー
http://sh1.2-d.jp/b/2006-01-28-23-33.html

投稿者 shunuhs : 2006年01月29日 19:18

shunuhs さん、ありがとうございます。

+ 6 という数字は、行数のつじつまあわせのためのものですが、場合によって、ずれてしまうと思います。混乱させてすいません (汗
この部分は、あまり大した問題ではないので、C 版では実装していません。

また、ライセンスについてですが、shunuhs さんのお書きになったコードなので、 Copyright は Cybozu Labs, Inc. ではなく shunuhs さんとしていただきたいと思います。

投稿者 kazuho : 2006年01月30日 16:59

ご指摘ありがとうございます。Copyrightの部分を変更させて頂きました。

ライセンスについてもう一つよくわかってないので
もしまだ問題ありましたらご指摘頂ければ幸いです。

#LabsのURLも消したほうがいいのでしょうか?

投稿者 shunuhs : 2006年01月30日 18:45

修正ありがとうございます。

> #LabsのURLも消したほうがいいのでしょうか?

pyC のページへのリンクは、あったほうがユーザーに親切かな、と思います。
perl 版、あるいは C 版へのリンクは、あってもなくてもかまわないと思います。

投稿者 kazuho : 2006年01月31日 10:33