【问题标题】:Is This a Compiler's Bug of Visual C++ 2008 [closed]这是 Visual C++ 2008 的编译器错误吗[关闭]
【发布时间】:2012-10-31 03:28:16
【问题描述】:

我正在使用 boost 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;
}

【问题讨论】:

  • 代码中存在错误的可能性 >>> 编译器中存在错误的可能性。只是说。
  • 如果它是一个编译器错误(让我们面对它,与您的代码相比,可能性很小),将其缩小到最小示例并提交错误报告
  • 尝试不同的 IDE 看看是否有问题,很可能是您的代码。

标签: c++ visual-c++ boost-asio


【解决方案1】:

当您添加“无辜”自动变量时,您正在更改该函数的堆栈框架的布局。发生的情况是,您(总是)破坏的堆栈上的某些变量被移动了。因此,当您之前丢弃一些未被注意到的内存位置时,您现在正在丢弃一些更重要的东西(例如返回地址)。

【讨论】:

  • 在引发异常之前实际上并没有执行大的while循环,但是如果我注释while循环,它将按预期工作。
  • 何时执行并不重要。所有本地/自动/堆栈变量在编译期间收集并全部分配在堆栈帧中。如果您注释掉 while 循环,您将注释掉该函数的所有真正功能!那么它“起作用”也就不足为奇了。
【解决方案2】:

正如 Matt Ball 在 cmets 中提到的,您的代码中出现错误的概率比编译器错误的概率要大得多,尤其是对于最近的编译器。如果您仍然确信这是一个编译器错误,您可以通过使用其他编译器(例如 gcc 或其 Windows 端口、MinGW)进行编译来确认您的怀疑。

【讨论】:

  • 当然,如果违规的原因是 UB(它在这里),它似乎可以在另一个编译器上工作。
  • @EdS.:不过,打开编译器警告可能有助于找到它。你找到错误了吗?
  • UB = 未定义的行为。顺便说一句,您的代码仍然存在问题,即使在 g++ 下编译时它并不明显。试试 g++ -Wall 看看它是否会给你任何有用的警告。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-22
  • 2016-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
相关资源
最近更新 更多