-6

ブースト asio を使用して単純な memcached クライアントを作成していますが、Windows 7 (64 ビット) の Visual C++ 2008 でリリース モードでコンパイルすると、無害な「std::string s;」を追加すると、プログラムでアクセス違反例外が発生します。関数ハンドラで。どんな提案でも大歓迎です。

#include <iostream>
#include <boost/asio.hpp>
#include <string>
#include <boost/algorithm/string.hpp>


typedef boost::asio::buffers_iterator<boost::asio::const_buffers_1> iterator_t;
typedef boost::iterator_range<iterator_t> range_t;
static const std::string LINE_END_MARK = "\r\n";

int main(int argc, char* argv[])
{
    boost::asio::streambuf _buf;
    std::ostream os(&_buf);
    os<<"END\r\n";

    iterator_t cursor = boost::asio::buffers_begin(_buf.data());
    iterator_t end = boost::asio::buffers_end(_buf.data());

    std::ostream_iterator<char> it(std::cout," ");
    std::copy(LINE_END_MARK.begin(), LINE_END_MARK.end(), it);

    range_t r(cursor, end);
    if(!boost::ends_with(r, LINE_END_MARK))
        return 0;
    return 1;
}
4

2 に答える 2

2

その「無害な」自動変数を追加すると、その関数のスタック フレームのレイアウトが変更されます。何が起こるかというと、(常に) 破損しているスタック上の変数が移動されます。そのため、以前は見過ごされていたメモリの場所をゴミ箱に捨てていましたが、今ではもっと重要なもの (リターン アドレスなど) をゴミ箱に捨てています。

于 2012-10-31T03:37:41.723 に答える
0

Matt Ball がコメントで述べたように、特にかなり最近のコンパイラでは、コードのバグの可能性はコンパイラのバグの可能性よりもはるかに大きくなります。それでもコンパイラのバグであると確信している場合は、別のコンパイラ (gcc やその Windows ポートである MinGW など) でコンパイルすることで、疑いを確認できます。

于 2012-10-31T03:35:29.527 に答える