2010-02-13

VS2010 RCが恐ろしく単純なコードでクラッシュする件

int main()
{
    typename(
}

このコードで、typenameに続く、開括弧を打った瞬間に、"Microsoft (R) Visual C++ Package Server"なるプロセスが、延々とクラッシュし続ける。

どうやら、テンプレートではない、普通の関数の中で、"typename("と打つと、100%の再現率でクラッシュするようだ。

一応、バグ報告したが、一体どういうテストをしているのだろう。

追記:

どういうテストを行えばこの問題が (RC ビルドの) リリース前に判明したか

テンプレート関数ではない、普通の関数の中で、typenameを使うこと自体が、ill-formedなので、難しいと思う。well-formedなコードなら、いくらでも自動的に生成できるかもしれないが、ill-formedなコードで、このような問題を引き起こすコードを、自動的に生成するのは、難しいのではないか。

ちなみに、私がこれを発見した理由というのは、typeidを、ついtypenameと、typoした為だった。その瞬間、ワトソン博士が大激怒(厳密にいうと、Vistaにはもう、ワトソン博士はいないのだけれど)。たまたま、MPLを変態的に使ったコードを書いていたため、問題を狭めて特定するのに、少し時間がかかった。

規格を知っている者、知らない者を、それぞれ集めて、テスターとして、延々とコードを書かせ続けるのはどうか。とはいっても、他ならぬ開発環境である。ベータ版以前の社内ビルドを、試験的に使うような人間は、MS社内にゴロゴロいるだろうし、実際試していると思う。それに、人力でのテストには、作業量に限界がある。バグを発見した後から、「テストが足りなかったんじゃないか」というのは簡単だが、果たして見つけられるだろうか。

C++0xの対応具合

まだドラフト段階で、変わる可能性のある部分が多いので、それほど大胆な機能を実装することは難しい。MSVCのようなメジャーなコンパイラが、規格違反のコードを通してしまったら、後々、ひどい互換性の問題を引き起こす。実際、MSVCは、あまり規格準拠のコンパイラとはいえないのだが。

しかし、auto, decltype, lambda, rvalue reference, static_assert, nullptrが入っているので、相当、C++0xの恩恵を受けられるだろう。

それから、トライグラフが廃止された。実を言うと、完全に廃止するのは、規格違反なのだが、(まだIBMの既存のコードとの互換性の問題で、少しだけトライグラフが規格に残っている)、これはいい変更だ。もし、何らかの理由で、トライグラフを使わなければこまるというのであれば、トライグラフを有効にするコンパイラオプションがある。

それにしても、ドキュメントには書いていないものの、新しい関数宣言構文が、ひそかに入っている。これなど、どうするつもりなのだろう。Unified Function Syntaxが入るか入らないか、もめている最中なのに。

7 comments:

  1. >一応、バグ報告したが、一体どういうテストをしているのだろう。

    確かに面白い問題ですね.
    実際これがテスト漏れだったとして,ではどういうテストを行えばこの問題が (RC ビルドの) リリース前に判明したかというと,本当にチャレンジングな問題だと思います.
    もちろん実際は Known Issue だったという可能性もありますが.

    なお,Visual C# チームの取り組みについてであれば,次のように発表されています.
    http://www.pnsqc.org/proceedings/pnsqc2007.pdf#page=185
    2007 年に発表されたものなので,最近はまた進化しているかもしれませんね.ご参考までに.

    ReplyDelete
  2. これはひどいw

    ところで、C++0xの対応具合もBeta2の時と変わらないのかな・・・

    ReplyDelete
  3. 普通にコードを書くとまず100%バグりますが、このバグは
    インテリセンスに関係する物でしょうか?

    VCは伝統的にインテリセンスについていろいろ問題を抱えて
    います

    例えばBoostなどでは完全に追い切れません
    もちろんコンパイラのバージョンが上がる事に進化を続けては
    いますが、その段階で新たなバグを混入させてしまう可能性
    は十分考えられます

    「何もしなければバグは混入しない」

    プログラミングの鉄則ですが、かと言って何もしないではプロ
    グラムが書けません。いかに少ないコード量で多くの情報を
    表すかは常にジェネリック・プログラミングの念頭にあります

    でもC++で良かったですよね
    これがもしCならばデバッグ不可能の状態に陥っていたかも
    (いやもちろんVCがC++で書かれている確証はないですけどね)

    ReplyDelete
  4. まあ、C++のインテリセンスは、難しい機能です。
    C++という言語の文法自体が、インテリセンスには、あまり向いていないのですが。
    JavaやC#の同等機能が、C++より遥かに単純な実装で、あれだけの精度を誇っているのに。

    でも、今回のインテリセンスの精度は、なかなかすばらしいですよ。

    ReplyDelete
  5. >well-formedなコードなら、いくらでも自動的に生成できるかもしれないが、ill-formedなコードで、
    >このような問題を引き起こすコードを、自動的に生成するのは、難しいのではないか。

    エディタで入力途中のコードは殆どの場合 ill-formed であるため,出発点として well-formed / ill-formed という分け方が適当かどうかは分かりません.
    http://www.users.gr.jp/blogs/daigoh/archive/2004/04/16/2039.aspx

    今回のように typo が起きる可能性,コピーアンドペーストで ill-formed なコードが貼り付けられた場合等を考えると,既に存在する well-formed なコードをベースに,キー入力やコピーアンドペーストの UI イベントを生成し,かつ一部をランダムに変えたりする等のテストが考えられるのではないかと思います.

    ReplyDelete
  6. >エディタで入力途中のコードは殆どの場合 ill-formed
    それもそうでしたね。

    自動化だけじゃだめだ、人力でもテストするべきだといっても、
    そもそも、モノがモノだけに、開発者自身が一番、使い方をよく知っていて、利用時間も長い製品なんですよね。

    ReplyDelete
  7. そう言えば言ってましたよねえ

    「ユーザーはメーカーが多大な労力を掛けてデバッグした製品の
    バグを立ち所に発見する驚異的な能力を持つ」

    なんて有名な言葉があります

    結局VS2010も製品版が出てからSP1が出るんだろうなあ

    ReplyDelete

You can use some HTML elements, such as <b>, <i>, <a>, also, some characters need to be entity referenced such as <, > and & Your comment may need to be confirmed by blog author. Your comment will be published under GFDL 1.3 or later license with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.