はじめに 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

Choices Vote
大変参考になった30  
参考になった0  
あまり参考にならなかった0  
まったく参考にならなかった1  

No comment. コメント​/Articles​/確率的にコンパイルを失敗させるEdit

Name:

Front page   Edit Freeze Diff Backup Upload Copy Rename ReloadPrint View   New Page Page list Search Recent changes   Help   RSS of recent changes (RSS 1.0) RSS of recent changes (RSS 2.0) RSS of recent changes (RSS Atom) Powered by xpWiki
Counter: 5727, today: 1, yesterday: 2
Princeps date: 2012-03-27 (Tue) 21:47:42
Last-modified: 2012-03-27 (Tue) 21:47:42 (JST) (3175d) by ゲスト
メインメニュー

ログイン

ユーザー名:


パスワード:





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

Menu