パスワードを忘れた? アカウント作成
1588 story

バグチェックしてくれるCのクローン:Cyclone 49

ストーリー by Oliver
いっそのこと関数型 部門より

k3c 曰く、 "NewScientist.comの記事で取り上げられていたのですが、カーネル大学とAT&T研究所が共同で進めているCycloneというC言語クローン(そのまんまやんけ!)のプロジェクトがあるのですね。なんでも、C言語(に非常に近い、らしい)ソースをコンパイルするときにバッファオーバーフローなどの典型的なバグを作りこんでいないかチェックしてソースに修正をかけてくれるようです。今のところLinuxとCygwinに対応しているとのこと。目標はLinuxのような大きなOS全体をCycloneでbuiltできるようにすること、だそうです。大きく出ましたね…。
ワタシは不勉強にしてC言語には詳しくないのですが、ありがちなバグを作りこまずに済むのなら、このようなアプローチはかなり有効だと思われます。(チェック機能自体をどこまで信じるか、という哲学的問題は残りますが…。)他の言語でもこういうのがどんどん出てくるといいですね。"

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
  • gcc -c src.c -Wallとか使ってないで「コンパイルが通った」とぬか喜びしている人がかなり居そうではと思いました。こういうときはこっそり、aliasか、gccのダミーShellScriptに「-Wall」を入れてしまうのがいいかもしれませんね。

    # それよかヘッダファイルを「ライブラリ」にせんといてくれと思うけど。

  • by znc (2768) on 2001年11月19日 16時25分 (#39447)
    C言語のコーディングって,普通ならバグになっても
    おかしくないようなコーディングを意図的に行なう場合も
    ありましたよね・・・・・
    # void *a,b[10] ; a = b[0]; a--;

    このような場合はどうやって回避していくのでしょうか・・・・?
    --
    『今日の屈辱に耐え明日の為に生きるのが男だ』
    宇宙戦艦 ヤマト 艦長 沖田十三氏談
    2006/06/23 JPN 1 - 4 BRA
  • by Average (3404) on 2001年11月19日 16時38分 (#39454) 日記
    身も毛もよだつ大昔は、大学で結構「プログラムにバグがないか」をチェックする研究ってのが多かったですね。その頃は大学の教養学部程度の数学の教科書をプログラム(定理証明とか型推論とか)の形に書き下して、定理証明が可能か、とか、これを実際のプログラムに適用可能か、等と盛んに研究されていました。(個人的には属性文法ルールをそのまま書けるAGなんか好きだったなぁ。これの流れを汲んだRieとか今どうなっているんだろう・・・)
    結局実用的でないという事でみな衰退していった様な感じですが、Javaのassert節にその残滓を感じる事もあります。
    なんか最近のコンピュータサイエンスというのはなーんかこういう「純」なアプローチが減って、工学的(実用的)な事ばっかりしているような気がするのは私だけ?
    --
    -----------------
    #そんなワタシはOS/2ユーザー:-)
  • gcc なら既に (スコア:2, 参考になる)

    by Stealth (5277) on 2001年11月19日 16時55分 (#39461)

    IBM が研究している gcc 用の buffer overflow 対策パッチ [ibm.com]なんてものがあったりします。

    既に GCC 3.0 用の patch も出ていたりしますし、C 言語ならこれを使っておくと、少しだけなら buffer overflow 対策ができるかと。

    専用の -fstack-protector オプションを指定しなければ通常の gcc のまま動くので、差し換えてもそうそう問題が出るものではないかと思われます。

    # 自動的に buffer overflow のチェックを行うコードが挿入されるため on にするとその分速度低下が発生しますが。

  • ドキュメントをさらっと一読してみたけど、 この Cyclone というのは これは C@ の拡張に見えます。
    C@ というのは、 David Gay(Univ of California, Berkeley) という人が C に region というメモリ管理システムを 足したものです。 って、よく見ると cyclone のページは カルフォルニア大学じゃん。

    Cyclone は、 誤解をおそれずに言えばガベージコレクションが 入った C です。
    malloc することは出きるけど、free は禁止。 ガーベージになったら GC を起こして回収します。 ってやつです。

    あと Dynamic region という メモリ管理システムが 入っています。
    これも誤解を恐れずにいうと、 ヒープからオブジェクトを 直接取ると 色々面倒です。 そこで、 ヒープから まずリージョンを取ってきて、 その中からオブジェクトを 小出しに取ってきます。 オブジェクトを解放する時には リージョンごと全部 解放してしまおうというアイデアです。
    リージョンの取り方、解放の仕方は プログラマが決めるので、 メモリ管理が 賢くなりますし、 GCを使って回収するより高速です。

    でも、 反射的に「この言語でまともなマルチスレッドプログラムは 書けるの?」という疑問が浮かぶのですが、、、
    --
    コンタミは発見の母
    • って、よく見ると cyclone のページはカルフォルニア大学じゃん。
      すいません。 Cyclone のページは Cornell 大学でした。
      --
      コンタミは発見の母
      親コメント
    • by goodlife (5595) on 2001年11月20日 12時07分 (#39760) 日記
      なるほど,gc も dynamic region 機能もメチャメチャうれしい。 マルチスレッドで無造作にヒープを使っていると(特に C++)断片化が気になってしかたないので, めんどくせーと思いながら自分でこの dynamic region のようなものを用意していました。

      もし C++ に拡張できるのなら,理想のシステム開発言語だなあ。 …と思ってドキュメント見たら,「7 Polymorphism」という節がある。おおっ,と期待して見たら中身は1行で 「Use `a instead of void *.」--がっかり。

      親コメント
      • by yt (2748) on 2001年11月20日 15時17分 (#39853)

        「7 Polymorphism」という節がある。おおっ,と期待して見たら
        中身は1行で 「Use `a instead of void *.」--がっかり。


        Cyclone の Polymorphism は, O'Caml [ocaml.org] などの
        ML(Meta Language) で使われている方の意味ですね.

        ドキュメントにもありますが [cornell.edu], ML の Polymorphism は
        感覚的には C++ のテンプレートに近いです.
        引数の型を特定せずに関数を定義することができます.

        C に ML の機能がのったら超便利だなぁっておもってたところ
        なので, かなり興味深々になってます.
        親コメント
        • by yt (2748) on 2001年11月20日 15時27分 (#39862)
          自己フォローですが,
          マニュアルを読んでみると subtype [cornell.edu] という C++ のクラス
          みたいなのを定義できるみたいですね.
          親コメント
          • by goodlife (5595) on 2001年11月20日 16時50分 (#39889) 日記
            (同マニュアルより)将来の拡張の見込みとして,「e.g., subtyping on function pointers, bounded subtyping, etc.」なんて書いてありますねえ。

            関数ポインタは非常に C++ っぽいですね。そこまでしても,C++ の class にはしないのか。この人たち、C++ が嫌いなのかもしれない(笑)。

            後者は部分範囲型でしょうかね(Pascalとかの)。

            親コメント
        • by Anonymous Coward
          > 興味深々
          「興味津々」ね。

      • マルチスレッドで無造作にヒープを使っていると(特に C++)断片化が気になってしかたないので,めんどくせーと思いながら自分でこの dynamic region のようなものを用意していました。


        御意
        必要なメモリをスレッド開始時にがっと取れるようなアルゴリズムだといいけど、実行中にちょびちょびメモリを確保しなければいけないアルゴリズムでは malloc / new は駄目ですね。
        断片化が進むとコヒーレンス性のキャッシュミスが多発するので、性能が甚だしく低下します。
        このような場合、マルチスレッドで書くよりマルチプロセスでプログラムを書いて必要なところだけ共有メモリで共有した方が速くなることも多いです。

        完全な与太話ですが、
        C++ を使う時に自前でメモリ管理をする根性があれば、Thread Local Strage(TLS) と組み合わせた面白いメモリ管理テクニックがあります。
        概略だけ示すと、、、

        プログラムの先頭で

        DWORD dwThreadLocalHeap = TlsAlloc();

        とやっておいてから、各スレッドの頭でスレッド専用のメモリをぶん取って TLS に登録します。

        char* thread_local_heap = new char[いっぱい];
        TlsSetValue( dwThreadLocalHeap, thread_local_heap );

        でもって、以下のようなクラスを用意します。

        class CThreadLocalObj {
          public:
            void* operator new(size_t size);
            void operator delete(void* p);
            void* new_array(size_t size);
        };

        void* CThreadLocalObj::operator new(size_t size) {
            char* thread_local_heap = TlsGetValue( dwThreadLocalHeap );
            // thread_local_heap は最初に取ったスレッド専用なメモリなのでここを切り分ける。
        };

        ユーザーは CThreadLocalObj を派生して、

        class CMyObj : public CThreadLocalObj {
            // ...
        };

        CMyObj obj = new CMyObj(); // スレッドローカルな領域に確保される。

        という寸法です。
        --
        コンタミは発見の母
        親コメント
  • by Futaro (2025) on 2001年11月19日 17時57分 (#39490) ホームページ 日記

    大昔、某社の某コンパイラは、エラーのチェックどころか、エラーの修正までしてくれた。が、エラーがエラーを呼ぶ場合など、ソースコードをぐちゃぐちゃにしてくれた挙げ句、「もうコンパイルできませーん!」と言って音を上げて止まったりする、という「優れもの」でしたねー。

    プログラムがうまく動かないのは、コンパイラが悪いせいだ!なんていうのを「最初に」のたまうヘボプログラマみたいなそのコンパイラの挙動は、やはりそういうモノを作った人と似てる。

    今回もそういうモノでないことを祈る。
  • 単にチェックの厳しいCコンパイラを作るのと、何が違うの? 別言語を新たに作る必要性はあるのか?

    • 「やってはだめなこと」が増えたって見るなら,言語使用としてありかも。アウトバーンを東名高速にするって感じ。車が走るって意味では同じだけど法律違うし。
      --
      -- LightSpeed-J
      親コメント
    • チェックを厳しくするだけならあんまし違わないし面白くも無いだろう。
      が、Cyclone は多相型、型推論、タグ付 union、パターンマッチ(データ構造の)
      なども使えるようになっているみたい。

      MLの便利なところが入っている感じで面白いかも。
    • そうですねぇ、「言語」まで行かなくても、標準ライブラリは作り直した方がいいかな、と思うことはあります。
      たとえば、C の標準関数って sprintf のような思想の関数が多いですよねぇ。世の中のプログラムは sprintf を asprintf にするだけでも安全で簡単になると思うんで
      • 「安全」と一口に言っても、 asprintfといえども%sに巨大な文字列突っ込まれてメモリ不足で死ぬことはありそう。 下手するとライブラリ含めて他の部分でメモリ不足による異常動作を惹起し、 より分かりづらいバグを生むこともありましょう。Cycloneもたぶん同様。

        wcharの例にしても、例えば欧文+CJK程度の知識しかないプログラマは、 きっとbidiやligature等々を考慮しないので、 結局wcharライブラリが充実しててもまともな国際化プログラムにならないでしょう。
        # そもそも国際化に関しては
        # どんな基本操作があれば必要十

        • >> asprintfといえども%sに巨大な文字列突っ込まれてメモリ不足で死ぬことはありそう。

          FreeBSD 4.4-RELEASEで man asprintf を見たら「メモリが確保できない場合、関数は -1 を返してポインタは NULL が代入されてるよ」って書いてありますね。それともそういう話じゃないのかな?
          • Cだとプログラムさぼって返値チェックしなくても動いちゃうからって話かな? Javaみたいにcatchやthrowsを強制されればこれはある程度防げますね。

            あるいはasprintf()がギリギリ成功する巨大文字列作らされて、 その後のよりクリティカルなところでメモリ確保できなくて死ぬとか。 OSがスラッシング起こしたらまずいとか。

            他には、意図的な攻撃のありうるサーバ類のプログラムでは、 メモリ

  • by tma20 (3064) on 2001年11月19日 20時27分 (#39529)
    主体となるのは人間です。
    さあ、ごいっしょに…
    へん~しん。とぉぉぉぉぉぉぉぉ

    ※オフトピックです。-10が記録されました。
  • Cyclone のドキュメントと NewScientist.com の 記事を読む限り、 皆さんが考えているような LINT的 なコンパイル時バグチェックが 強化されているようには見えないです。

    実行時の動的なバグチェックに関しても、 境界チェックやヌルチェックは Java 程度だと思われます。 後は GC を導入することで dangling pointer を なくしている ぐらいでしょうか?

    結局、 「C で掛かれたプログラムを Java で書き直すは大変でしょう? Cyclone でどう?」 というアプローチなのでしょうね。
    Dynamic region のような スマートなメモリ管理機構を言語が サポートするのはありがたいですが、、、
    --
    コンタミは発見の母
    • 結局、 「C で掛かれたプログラムを Java で書き直すは大変でしょう? Cyclone でどう?」 というアプローチなのでしょうね。
      CINT [root.cern.ch] ではどうでしょう? 妥協解としてはいいセンだと思うのですが。
      親コメント
      • CINT にランタイムチェック機構って 入ってましたっけ?
        CINT は C / C++ 言語の比較的忠実は インタプリタ処理系なので、 Java や Cyclone が 提供するような メモリ管理・保護の機能は 提供していないように 読めるのですが、、、

        Java は、 C/C++ 言語の持つポテンシャルをあまり落とさずに memory access violation や dangling pointer や memory leak のバグを除去できる 丈夫なメモリ保護機構を導入しました。 セキュリティを求めて C / C++ のプログラムを Java に移植するのだとしたら、 このメモリ保護機構ゆえだと思います。
        ネイティブコードを書く場合にも、 このメモリ保護機構と調和する ことが求められています (Java の ネイティブメソッドを書くための インターフェイスである JNI は、 「『ネイティブコードだからなんでもできる』のではなく、 『ネイティブコードでも Java の(メモリ保護の)作法を守ってよ!』」 と言っているように見える)。


        一方 Java の対抗馬の C# は、 unsafe 文を導入することで メモリ保護機構を 一部を緩くしています。
        例えば、 unsafe 構文の中では ポインタを使った配列のイテレート が可能ですが、 ポインタを使った場合には 配列の境界チェックが行われません。

        C# の言語仕様書 [microsoft.com]には、
        A.5.3 Pointer element access
        The pointer element access operator does not check for out-of-bounds errors and the effects of accessing an out-of-bounds element are undefined
        A.5.6 Pointer arithmetic
        If a pointer arithmetic operation overflows the domain of the pointer type, the result is truncated in an implementation-defined fashion, but no exceptions are produced.
        とあります。 勘弁してよ。
        --
        コンタミは発見の母
        親コメント
        • CINT にランタイムチェック機構って 入ってましたっけ?
          きちんと効くかどうかはテストしていませんが、 security(2) によれば
          #pragma security [level]
          というのはあって、デフォルト状態の 0 でも
          • Array index out of range
          • Divided by zero
          • Invalid arguments for standard library function
          はチェックしてくれるそうです。 バイトコードにしても効くかどうかは調査中です。

          # あ、バグっぽいのめっけ。 < CINT
          # 一応 FAQ 読んでからレポートしよう...

          親コメント
  • by Anonymous Coward on 2001年11月19日 17時41分 (#39478)
    あの、世の賢人のみなさま、私はずっと「コーネル大学」だと思っていたんですが、本当は「カーネル大学」が正しいんでしょうか?

    なんか、またひとつ世界観が変わりそうです。オフトピなので匿名。
    • あー。すみません。タレコミ本人です。
      タレコむボタンを押した直後にしまったと思ったんですが手遅れでした。わはは。許して。

      あと、builtっていうのも文脈的にはおかしいような気がするんですがこれは皆さん見て見ぬフリしてください。よろしく。

      # さらにどうでもいいんですが「オフトピなので匿名」という理屈がよく分かりません。なぜ隠す?
      親コメント
      • Re:カーネル大学 (スコア:1, 参考になる)

        by Anonymous Coward on 2001年11月19日 19時20分 (#39508)
        >「オフトピなので匿名」という理屈がよく分かりません。

        スコア0は表示しないと設定している人のため、です。
        そういう人はスレッドを「私物化」してるみたいなオフトピを読みたくないからそうしているんだろう、ということで。もちろん、匿名で書き込む人は、これといって悪意もなく、ただ面白がって楽しんでるだけなんでしょうけどね。

        あと、なんだか恥ずかしいから匿名にしてます。許して・・・
        親コメント
        • >スコア0は表示しないと設定している人のため、です。

          今まで,ワシもそうしてました.
          明らかな茶々入れや,ギャグはA/Cで.と.
          ところがっ,そういうポストにかぎって,“おもしろおかしい”がついて
          すぐにアゲられてしまうのだ!<ダメじゃん.
          だからもうやめます>A/Cポスト.

          #A/Cポストで付いたカルマを加算したら,倍くらいには....<ウソ
          親コメント
        • by Gargan (4868) on 2001年11月20日 2時48分 (#39662) 日記
          | スコア0は表示しないと設定している人のため、です。

          初耳です。
          Anonymous Coward(匿名の臆病者)というアカウントは
          重要な情報を投稿するため [srad.jp]にあるものだと思っていました。;-)
          親コメント
    • by Anonymous Coward
      もしも実在したらすごいね>カーネル大学
      カーネル大学Linux学部...とか
typodupeerror

私は悩みをリストアップし始めたが、そのあまりの長さにいやけがさし、何も考えないことにした。-- Robert C. Pike

読み込み中...