はじめに anchor.png Edit

CTFEによるコンパイル時乱数を使って確率的にコンパイルを失敗させることができそうだったので、やってみました。

CTFEに関しては、SampleCodes​/D言語文法​/コンパイル時実行関連​/1を参照してください。

Page Top

方針 anchor.png Edit

  1. __DATE__と__TIME__を組み合わせた文字列から乱数のseedを作る
  2. 乱数を作る
  3. 乱数の値に応じて static assert(false) する。

これで行けそうな気がします。

Page Top

実際に書いてみる anchor.png Edit

Everything is expanded.Everything is shortened.
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
-
|
|
|
|
-
|
!
|
|
!
 
 
 
 
bool isSuccess(){
    import std.random;
    Mt19937 gen;
    string str = __DATE__ ~ __TIME__;
    uint hash;
    foreach (c; str){
        hash = (hash * 9) + c;
    }
    gen.seed(hash);
    return uniform(0, 2, gen) == 0;
}
 
static assert(isSuccess(), "Somehow compilation failed.");
 
void main(){}

こんな感じで大丈夫そうです。

見れば分かりますが、10行目のuniformの第二引数を大きくすれば、コンパイル成功確率が減ります。

このコードのコンパイル成功確率は1/2になっています。

seedになるhashの取得は適当にやってますが、多少seedが連続してても、メルセンヌツイスターなので多分大丈夫でしょう。

Page Top

動かしてみる anchor.png Edit

1
Error: static assert  "Somehow compilation failed."

と表示されてコンパイルが失敗したり、普通に成功したりします。

良い感じに失敗するときは失敗してくれます。

Page Top

展望 anchor.png Edit

無いです。ネタですからね。

Page Top

投票とコメント anchor.png Edit

選択肢 投票
大変参考になった21  
参考になった0  
あまり参考にならなかった0  
まったく参考にならなかった1  

コメントはありません。 コメント​/Articles​/確率的にコンパイルを失敗させる編集

お名前:

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード印刷に適した表示   ページ新規作成 全ページ一覧 単語検索 最新ページの一覧   ヘルプ   最新ページのRSS 1.0 最新ページのRSS 2.0 最新ページのRSS Atom Powered by xpWiki
Counter: 2596, today: 1, yesterday: 2
初版日時: 2012-03-27 (火) 21:47:42
最終更新: 2012-03-27 (火) 21:47:42 (JST) (1919d) by ゲスト
メインメニュー

ログイン

ユーザー名:


パスワード:





パスワード紛失  |新規登録

Menu