Entries

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

本日見かけた酷いバグ

タグ: C++ gcc
#include <iostream>
#include <algorithm>
#include <boost/iterator/counting_iterator.hpp>
#include <boost/lambda/lambda.hpp>

using namespace std;
using namespace boost;
using namespace boost::lambda;

void hoge(int n, const unsigned int array[])
{
	// 0 から n までの値を返すイテレータ
	const counting_iterator<unsigned int>
		it_first(0), it_last(n);

	// array[0] から array[n-1] の中で
	// 0 以外の値を得られる配列番号を求める
	// 全て 0 の場合は n を指す
	const counting_iterator<unsigned int>
		it(find_if(it_first, it_last, constant(array)[_1]));

	cout << *it << endl;
}

int main(int argc, char* argv[])
{
	const unsigned int array[32] = { 0 }; // 配列をゼロ初期化
	const unsigned int n = argc - 1; // 引数無しなら 0
	cout << n << endl;
	hoge(n, array);
	return 0;
}
  • gcc 3.2.3 で -O2 ビルドした場合の結果
    0
    0
    
  • gcc 3.2.3 で -O3 ビルドした場合の結果
    0
    32
    

-O3 ビルドしたものを gdb で見たところ、 it_last は正しく初期化されているものの、 find_if の第2引数が有り得ないことになっていた。
最適化のバグ、なんだろうなぁ。

スポンサーサイト

コメント

コメントの投稿

コメントの投稿
管理者にだけ表示を許可する

トラックバック

トラックバック URL
http://idlysphere.blog66.fc2.com/tb.php/83-09876389
この記事にトラックバックする(FC2ブログユーザー)

Appendix

タグ

Blog内検索

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。