【发布时间】:2014-01-12 20:38:19
【问题描述】:
我在业余时间开发我的代码。最好在调试模式下。最近,当我尝试构建发布版本时,我得到了错误(运行时,输出:1\n2\n 然后失败)。我找到了包含错误的一段代码(如下),我发现该错误仅在优化级别为-Os, -Ofast, -O2, -O3 而不是-O, -O0, -O1, -Og 时发生。在发布模式下,我的调试能力受到限制。错误的原因是什么?发现此类错误的方法是什么?
#!/usr/bin/env bash -vex WARN="-W -Wall -Wextra" INCLUDE="-isystem /c/libs/boost-trunk" OPT="-O2" g++ -x c++ - - std=gnu++1y $INCLUDE
$WARN $OPT -o a
#include <iterator>
#include <string>
#include <iostream>
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/support_multi_pass.hpp>
using namespace boost::spirit;
template< typename Iterator >
struct skipper
: qi::grammar< Iterator >
{
skipper();
private :
typename skipper::base_type::start_type skipper_;
};
template< typename Iterator >
skipper< Iterator >::skipper()
: skipper::base_type(skipper_, "skipper")
{
std::cerr << 1 << std::endl;
auto const ana =
*~qi::char_('*') > +qi::char_('*')
;
std::cerr << 2 << std::endl;
skipper_ =
qi::space
| ("/*" > ana > *(~qi::char_("/*") > ana) > '/')
| ("//" > *(qi::char_ - qi::eol) > (qi::eol | qi::eoi))
; // R"(\s+|(\/\*[^*]*\*+([^/*][^*]*\*+)*\/)|(\/\/[^\r\n]*))"
std::cerr << 3 << std::endl;
}
using input_type = std::string;
using input_iterator_type = std::istreambuf_iterator< typename input_type::value_type >;
using base_iterator_type = multi_pass< input_iterator_type >;
template struct skipper< base_iterator_type >;
using skipper_type = skipper< base_iterator_type >;
int main()
{
skipper_type const skipper_;
std::cerr << 4 << std::endl;
return EXIT_SUCCESS;
}
__EOF
gcc -v 2>&1 | tail -n1:
gcc version 4.8.1 (rev5, Built by MinGW-W64 project)
【问题讨论】:
-
我使用 valgrind 来解决这些问题。
valgrind --db-attach=yes最有帮助(当然在 linux 上)。但是,我的设置坏了,所以这次我只是在编辑器中检查了代码:/
标签: g++ compiler-optimization boost-spirit boost-spirit-qi