2015-10-04 14 views
5

Tôi nhận được thông báo lỗi runtime sauthông báo lỗi Runtime khi sử dụng tăng :: sóng

terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::wave::cpplexer::lexing_exception> >' 
    what(): boost::wave::lexing_exception 

Khi tôi đang cố gắng để chạy các đoạn mã sau:

#include <vector> 
#include <algorithm> 
#include <boost/wave.hpp> 
#include <boost/wave/cpplexer/cpp_lex_token.hpp> 
#include <boost/wave/cpplexer/cpp_lex_iterator.hpp> 

std::string strip_comments(std::string const& input) 
{ 
    std::string output; 
    typedef boost::wave::cpplexer::lex_token<> token_type; 
    typedef boost::wave::cpplexer::lex_iterator<token_type> lexer_type; 
    typedef token_type::position_type position_type; 

    position_type pos; 

    lexer_type it = lexer_type(input.begin(), input.end(), pos, 
     boost::wave::language_support(
      boost::wave::support_cpp|boost::wave::support_option_long_long)); 
    lexer_type end = lexer_type(); 

    for (;it != end; ++it) 
    { 
     if (*it != boost::wave::T_CCOMMENT 
     && *it != boost::wave::T_CPPCOMMENT) 
     { 
      output += std::string(it->get_value().begin(), it->get_value().end()); 
     } 
    } 
    return output; 
} 

int main() 
{ 
    std::string text="aaa bbb /*cccc*/ ddd // eee"; 
    std::cout<<strip_comments(text)<<std::endl; 
    return 0; 
} 

tôi sử dụng trình biên dịch gcc:

g++ -std=c++11 test.cpp -o test -lboost_wave -lboost_system 

Mã này phải loại bỏ nhận xét C++ khỏi văn bản được chỉ định bởi ///* ... */.

Đây là gdb backtrack:

GNU gdb (Ubuntu 7.7.1-0ubuntu5~14.04.2) 7.7.1 
Copyright (C) 2014 Free Software Foundation, Inc. 
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> 
This is free software: you are free to change and redistribute it. 
There is NO WARRANTY, to the extent permitted by law. Type "show copying" 
and "show warranty" for details. 
This GDB was configured as "x86_64-linux-gnu". 
Type "show configuration" for configuration details. 
For bug reporting instructions, please see: 
<http://www.gnu.org/software/gdb/bugs/>. 
Find the GDB manual and other documentation resources online at: 
<http://www.gnu.org/software/gdb/documentation/>. 
For help, type "help". 
Type "apropos word" to search for commands related to "word"... 
Reading symbols from a.out...done. 
[New LWP 10573] 
[Thread debugging using libthread_db enabled] 
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1". 
Core was generated by `./a.out'. 
Program terminated with signal SIGABRT, Aborted. 
#0 0x00007ff38fe96cc9 in __GI_raise ([email protected]=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 
56 ../nptl/sysdeps/unix/sysv/linux/raise.c: No such file or directory. 
(gdb) bt 
#0 0x00007ff38fe96cc9 in __GI_raise ([email protected]=6) at ../nptl/sysdeps/unix/sysv/linux/raise.c:56 
#1 0x00007ff38fe9a0d8 in __GI_abort() at abort.c:89 
#2 0x00007ff3904cb78d in __gnu_cxx::__verbose_terminate_handler()() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#3 0x00007ff3904c97f6 in ??() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#4 0x00007ff3904c9841 in std::terminate()() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#5 0x00007ff3904c9a58 in __cxa_throw() from /usr/lib/x86_64-linux-gnu/libstdc++.so.6 
#6 0x00007ff390a9e063 in void boost::throw_exception<boost::wave::cpplexer::lexing_exception>(boost::wave::cpplexer::lexing_exception const&) 
    () from /usr/lib/x86_64-linux-gnu/libboost_wave.so.1.54.0 
#7 0x00007ff390aa3a5e in boost::wave::cpplexer::re2clex::lexer<__gnu_cxx::__normal_iterator<char const*, std::string>, boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > >, boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >::report_error(boost::wave::cpplexer::re2clex::Scanner const*, int, char const*, ...)() 
    from /usr/lib/x86_64-linux-gnu/libboost_wave.so.1.54.0 
#8 0x00007ff390aaf2f0 in boost::wave::cpplexer::re2clex::scan(boost::wave::cpplexer::re2clex::Scanner*)() 
    from /usr/lib/x86_64-linux-gnu/libboost_wave.so.1.54.0 
#9 0x00007ff390aa4329 in boost::wave::cpplexer::re2clex::lexer<__gnu_cxx::__normal_iterator<char const*, std::string>, boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > >, boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >::get(boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > >&)() from /usr/lib/x86_64-linux-gnu/libboost_wave.so.1.54.0 
#10 0x000000000040a3b8 in boost::wave::cpplexer::impl::lex_iterator_functor_shim<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >::get_next<boost::spirit::multi_pass<std::pair<boost::wave::cpplexer::impl::lex_iterator_functor_shim<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >, boost::wave::cpplexer::lex_input_interface<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >*>, boost::spirit::iterator_policies::default_policy<boost::spirit::iterator_policies::ref_counted, boost::spirit::iterator_policies::no_check, boost::spirit::iterator_policies::split_functor_input, boost::spirit::iterator_policies::split_std_deque> > > (mp=..., result=...) 
    at /usr/include/boost/wave/cpplexer/cpp_lex_iterator.hpp:80 
#11 0x0000000000409efb in boost::spirit::iterator_policies::split_functor_input::unique<std::pair<boost::wave::cpplexer::impl::lex_iterator_functor_shim<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >, boost::wave::cpplexer::lex_input_interface<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >*>, true>::advance_input<boost::spirit::multi_pass<std::pair<boost::wave::cpplexer::impl::lex_iterator_functor_shim<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util---Type <return> to continue, or q <return> to quit--- 
::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >, boost::wave::cpplexer::lex_input_interface<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >*>, boost::spirit::iterator_policies::default_policy<boost::spirit::iterator_policies::ref_counted, boost::spirit::iterator_policies::no_check, boost::spirit::iterator_policies::split_functor_input, boost::spirit::iterator_policies::split_std_deque> > > (mp=...) 
    at /usr/include/boost/spirit/home/support/iterators/detail/split_functor_input_policy.hpp:91 
#12 0x000000000040969f in boost::spirit::iterator_policies::multi_pass_unique<std::pair<boost::wave::cpplexer::impl::lex_iterator_functor_shim<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >, boost::wave::cpplexer::lex_input_interface<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >*>, boost::spirit::iterator_policies::ref_counted::unique, boost::spirit::iterator_policies::no_check::unique, boost::spirit::iterator_policies::split_functor_input::unique<std::pair<boost::wave::cpplexer::impl::lex_iterator_functor_shim<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >, boost::wave::cpplexer::lex_input_interface<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >*>, true>, boost::spirit::iterator_policies::split_std_deque::unique<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >, true, true, true>::advance_input<boost::spirit::multi_pass<std::pair<boost::wave::cpplexer::impl::lex_iterator_functor_shim<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >, boost::wave::cpplexer::lex_input_interface<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >*>, boost::spirit::iterator_policies::default_policy<boost::spirit::iterator_policies::ref_counted, boost::spirit::iterator_policies::no_check, boost::spirit::iterator_policies::split_functor_input, boost::spirit::iterator_policies::split_std_deque> > > (mp=...) 
    at /usr/include/boost/spirit/home/support/iterators/detail/combine_policies.hpp:441 
#13 0x0000000000408d7c in boost::spirit::iterator_policies::split_std_deque::unique<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >::increment<boost::spirit::multi_pass<std::pair<boost::wave::cpplexer::impl::lex_iterator_functor_shim<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >, boost::wave::cpplexer::lex_input_interface<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >*>, boost::spirit::iterator_policies::default_policy<boost::spirit::iterator_policies::ref_counted, boost::spirit::iterator_policies::no_check, boost::spirit::iterator_policies::split_functor_input, boost::spirit::iterator_policies::split_std_deque> > > (mp=...) 
    at /usr/include/boost/spirit/home/support/iterators/detail/split_std_deque_policy.hpp:107 
#14 0x0000000000408450 in boost::spirit::multi_pass<std::pair<boost::wave::cpplexer::impl::lex_iterator_functor_shim<boost::wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >, boost::wave::cpplexer::lex_input_interface<boost:---Type <return> to continue, or q <return> to quit--- 
:wave::cpplexer::lex_token<boost::wave::util::file_position<boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> > > > >*>, boost::spirit::iterator_policies::default_policy<boost::spirit::iterator_policies::ref_counted, boost::spirit::iterator_policies::no_check, boost::spirit::iterator_policies::split_functor_input, boost::spirit::iterator_policies::split_std_deque> >::operator++ (this=0x7fff7d8f66e0) 
    at /usr/include/boost/spirit/home/support/iterators/multi_pass.hpp:119 
#15 0x000000000040680e in strip_comments (input="aaa bbb /*cccc*/ ddd // eee") at test.cpp:23 
#16 0x0000000000406927 in main() at test.cpp:37 

Cập nhật

Nhờ jpo38 cho bình luận của mình. Tôi đã khởi tạo pos bởi

position_type pos(0); 

Và lỗi thời gian chạy trước đó đã được sửa. Bây giờ, tôi nhận được một lỗi thời gian chạy khác nhau:

#0 0x0000000000406ff8 in std::char_traits<char>::length (__s=0x0) at /usr/include/c++/4.9/bits/char_traits.h:263 
#1 0x0000000000408504 in boost::wave::util::flex_string<char, std::char_traits<char>, std::allocator<char>, boost::wave::util::CowString<boost::wave::util::AllocatorStringStorage<char, std::allocator<char> >, char*> >::flex_string (this=0x7ffee3d536a0, s=0x0, a=...) 
    at /usr/include/boost/wave/util/flex_string.hpp:1502 
#2 0x000000000040693f in strip_comments (input="aaa bbb /*cccc*/ ddd // eee") at test.cpp:16 
#3 0x0000000000406bf0 in main() at test.cpp:37 

tôi đánh bắt các ngoại lệ chung và cố gắng để hiển thị nó bằng cách:

std::cout << "Error occurred: " << ex.what() << std::endl; 

trong khi nó đã không thành công.

+0

Khi bạn ** debug ** chương trình này - những gì kết quả bạn nhận được? Bạn có thể chia sẻ phát hiện của bạn với chúng tôi, xin vui lòng? – YePhIcK

+0

@YePhIcK, tôi đặt bản nhạc nền được tạo bởi gdb – barej

Trả lời

1

boost yêu thích lập trình ngoại lệ. Có nghĩa là ngoại lệ được sử dụng để tăng lỗi và cảnh báo .... Tôi ghét điều đó, nhưng bạn cần chấp nhận nó nếu bạn sử dụng những thư viện C++ tuyệt vời đó. Trường hợp ngoại lệ dẫn đến "tai nạn" nếu bạn không cẩn thận và bắt họ, như thế:

std::string strip_comments(std::string const& input) 
{ 
    std::string output; 
    typedef boost::wave::cpplexer::lex_token<> token_type; 
    typedef boost::wave::cpplexer::lex_iterator<token_type> lexer_type; 
    typedef token_type::position_type position_type; 

    boost::wave::util::file_position_type current_position; // for error reporting 

    try 
    { 
     position_type pos; 

     lexer_type it = lexer_type(input.begin(), input.end(), pos, 
      boost::wave::language_support(
      boost::wave::support_cpp|boost::wave::support_option_long_long)); 
    lexer_type end = lexer_type(); 

     for (;it != end; ++it) 
     { 
      current_position = (*it).get_position(); // for error reporting 

      if (*it != boost::wave::T_CCOMMENT 
      && *it != boost::wave::T_CPPCOMMENT) 
      { 
       output += std::string(it->get_value().begin(), it->get_value().end()); 
      } 
     }    
    } 
    catch (boost::wave::cpplexer::lexing_exception const& e) { 
     // some lexing error 
     std::cerr 
      << e.file_name() << "(" << e.line_no() << "): " 
      << e.description() << std::endl; 
    } 
    catch (std::exception const& e) { 
     // use last recognized token to retrieve the error position 
     std::cerr 
      << current_position.get_file() 
      << "(" << current_position.get_line() << "): " 
      << "exception caught: " << e.what() 
      << std::endl; 
    } 
    catch (...) { 
     // use last recognized token to retrieve the error position 
     std::cerr 
      << current_position.get_file() 
      << "(" << current_position.get_line() << "): " 
      << "unexpected exception caught." << std::endl; 
    } 
    return output; 
} 

Sau đó, thay vì một "tai nạn", bạn sẽ có được điều này ans đẹp nhắn an toàn:

(1): warning: generic lexer warning: Unterminated 'C++' style comment

bạn có thể thấy rằng, bằng cách không bắt ngoại lệ, một cảnh báo tăng đơn giản được chuyển đổi trong một vụ tai nạn nghiêm trọng ở cấp độ của bạn ;-)

tôi không quen thuộc với thư viện sóng, nhưng thêm một \n đến hết chuỗi của bạn khắc phục sự cố và sau đó không có lỗi nào được báo cáo nữa (bằng cách này, nó đã được actu ally just a warning):

Thay đổi chuỗi văn bản chức năng chính thành: std::string text="aaa bbb /*cccc*/ ddd // eee\n"; và chương trình sẽ xuất ra aaa bbb ddd.

Bạn có thể thêm \n này, nhưng bạn cũng có thể làm lại mã để thử/nắm bắt trong vòng lặp và sau đó báo cáo nhưng bỏ qua cảnh báo.

Lưu ý: Thực tế là tăng :: sóng hy vọng một EOL có lẽ liên quan đến C nổi tiếng này ++ cảnh báo (nhưng nó thực sự chỉ là một cảnh báo): "No newline at end of file" compiler warning

+0

Cảm ơn bạn rất nhiều.Bên cạnh việc khởi tạo 'pos', vấn đề còn lại là gì? cả hai mã trông giống nhau. – barej

+0

Rất vui vì nó đã giúp tôi phát hiện ra thư viện 'boost' này mà tôi không biết ...). Trên thực tế, không cần khởi tạo 'pos', mặc định là 0. Chỉ có' ​​try/catch' bị thiếu. Vui lòng bỏ phiếu nếu điều này khắc phục được sự cố của bạn! – jpo38

+0

Tôi tự hỏi. Đối với '" aaa bbb/* cccc */\ n ddd // eee \ nfffff \ n "' làm đầu vào, đầu ra là '" aaa bbb \ n ddd fffff \ n "' thay vì '" aaa bbb \ n ddd \ nfffff \ n "' – barej

Các vấn đề liên quan