diff --git a/configure.ac b/configure.ac index 7402d019f..99d416391 100644 --- a/configure.ac +++ b/configure.ac @@ -99,7 +99,7 @@ AX_PTHREAD() LIBS="$PTHREAD_LIBS $LIBS" CFLAGS="$PTHREAD_CFLAGS $CFLAGS" CC="$PTHREAD_CC" -CXXFLAGS="$CXXFLAGS -ftemplate-depth=128" +CXXFLAGS="$CXXFLAGS -ftemplate-depth=128 -Wno-format-zero-length" AS_ECHO "Checking for visibility support:" AC_CACHE_CHECK([for __attribute__((visibility("hidden")))], @@ -166,9 +166,9 @@ AC_ARG_ENABLE( [logging], [AS_HELP_STRING( [--enable-logging], - [enable logging to disk (use value "verbose" to enable verbose peer wire logging or "errors" limit logging to errors ) [default=no]])], + [enable logging support, enabled by alert mask [default=yes]])], [[ARG_ENABLE_LOGGING=$enableval]], - [[ARG_ENABLE_LOGGING=no]] + [[ARG_ENABLE_LOGGING=yes]] ) AC_ARG_ENABLE( @@ -190,7 +190,7 @@ AC_ARG_ENABLE( [dht], [AS_HELP_STRING( [--enable-dht], - [enable dht support (use value "logging" to add extra logging) [default=yes]])], + [enable dht support [default=yes]])], [[ARG_ENABLE_DHT=$enableval]], [[ARG_ENABLE_DHT=yes]] ) diff --git a/docs/features.rst b/docs/features.rst index b6cc800bf..4823ec0f4 100644 --- a/docs/features.rst +++ b/docs/features.rst @@ -305,7 +305,7 @@ code to implement a simple bittorrent client:: std::cin >> a; return 0; } - catch (std::exception& e) + catch (std::exception const& e) { std::cerr << ec.what() << std::endl; return 1; diff --git a/examples/client_test.cpp b/examples/client_test.cpp index f463e2c5f..7cb079fb4 100644 --- a/examples/client_test.cpp +++ b/examples/client_test.cpp @@ -1802,7 +1802,7 @@ int main(int argc, char* argv[]) for (std::vector::iterator i = alerts.begin() , end(alerts.end()); i != end; ++i) { - TORRENT_TRY + try { if (!::handle_alert(ses, *i, files, non_files)) { @@ -1812,7 +1812,7 @@ int main(int argc, char* argv[]) events.push_back(event_string); if (events.size() >= 20) events.pop_front(); } - } TORRENT_CATCH(std::exception& ) {} + } catch (std::exception const&) {} } alerts.clear(); diff --git a/examples/make_torrent.cpp b/examples/make_torrent.cpp index 9d711dbd8..8e01db41e 100644 --- a/examples/make_torrent.cpp +++ b/examples/make_torrent.cpp @@ -377,7 +377,7 @@ int main(int argc, char* argv[]) #ifndef BOOST_NO_EXCEPTIONS } - catch (std::exception& e) + catch (std::exception const& e) { std::fprintf(stderr, "%s\n", e.what()); } diff --git a/include/libtorrent/aux_/allocating_handler.hpp b/include/libtorrent/aux_/allocating_handler.hpp index f2b0ac122..6c6bd760d 100644 --- a/include/libtorrent/aux_/allocating_handler.hpp +++ b/include/libtorrent/aux_/allocating_handler.hpp @@ -61,6 +61,12 @@ namespace libtorrent { namespace aux handler_storage(handler_storage const&); }; + struct error_handler_interface + { + virtual void on_exception(std::exception const&) = 0; + virtual void on_error(error_code const&) = 0; + }; + // this class is a wrapper for an asio handler object. Its main purpose // is to pass along additional parameters to the asio handler allocator // function, as well as providing a distinct type for the handler @@ -69,15 +75,38 @@ namespace libtorrent { namespace aux struct allocating_handler { allocating_handler( - Handler h, handler_storage& s) + Handler h, handler_storage& s, error_handler_interface& eh) : handler(std::move(h)) , storage(s) + , error_handler(eh) {} template void operator()(A&&... a) const { +#ifdef BOOST_NO_EXCEPTIONS handler(std::forward(a)...); +#else + try + { + handler(std::forward(a)...); + } + catch (system_error const& e) + { + error_handler.on_error(e.code()); + } + catch (std::exception const& e) + { + error_handler.on_exception(e); + } + catch (...) + { + // this is pretty bad + TORRENT_ASSERT(false); + std::runtime_error e("unknown exception"); + error_handler.on_exception(e); + } +#endif } friend void* asio_handler_allocate( @@ -108,6 +137,7 @@ namespace libtorrent { namespace aux Handler handler; handler_storage& storage; + error_handler_interface& error_handler; }; } diff --git a/include/libtorrent/aux_/session_impl.hpp b/include/libtorrent/aux_/session_impl.hpp index 90271d70f..b0a184c81 100644 --- a/include/libtorrent/aux_/session_impl.hpp +++ b/include/libtorrent/aux_/session_impl.hpp @@ -194,6 +194,7 @@ namespace libtorrent , boost::noncopyable , uncork_interface , single_threaded + , aux::error_handler_interface { // the size of each allocation that is chained in the send buffer enum { send_buffer_size_impl = 128 }; @@ -249,6 +250,9 @@ namespace libtorrent bool m_posting_torrent_updates = false; #endif + void on_exception(std::exception const& e) override; + void on_error(error_code const& ec) override; + void reopen_listen_sockets(); torrent_peer_allocator_interface* get_peer_allocator() override @@ -1099,7 +1103,7 @@ namespace libtorrent make_tick_handler(Handler const& handler) { return aux::allocating_handler( - handler, m_tick_handler_storage); + handler, m_tick_handler_storage, *this); } // torrents are announced on the local network in a diff --git a/include/libtorrent/operations.hpp b/include/libtorrent/operations.hpp index 524b6648e..b747bcde7 100644 --- a/include/libtorrent/operations.hpp +++ b/include/libtorrent/operations.hpp @@ -96,7 +96,10 @@ namespace libtorrent op_ssl_handshake, // a connection failed to satisfy the bind interface setting - op_get_interface + op_get_interface, + + // the error was unexpected and it is unknown which operation caused it + op_unknown, }; } diff --git a/include/libtorrent/peer_connection.hpp b/include/libtorrent/peer_connection.hpp index 6f53606b1..b2e10d13e 100644 --- a/include/libtorrent/peer_connection.hpp +++ b/include/libtorrent/peer_connection.hpp @@ -259,11 +259,15 @@ namespace libtorrent , public disk_observer , public peer_connection_interface , public std::enable_shared_from_this + , public aux::error_handler_interface { friend class invariant_access; friend class torrent; public: + void on_exception(std::exception const& e) override; + void on_error(error_code const& ec) override; + virtual connection_type type() const = 0; enum channels @@ -283,14 +287,14 @@ namespace libtorrent virtual ~peer_connection(); - void set_peer_info(torrent_peer* pi) + void set_peer_info(torrent_peer* pi) override { TORRENT_ASSERT(m_peer_info == 0 || pi == 0 ); TORRENT_ASSERT(pi != nullptr || m_disconnect_started); m_peer_info = pi; } - torrent_peer* peer_info_struct() const + torrent_peer* peer_info_struct() const override { return m_peer_info; } // this is called when the peer object is created, in case @@ -358,7 +362,7 @@ namespace libtorrent std::uint32_t peer_rank() const; void fast_reconnect(bool r); - bool fast_reconnect() const { return m_fast_reconnect; } + bool fast_reconnect() const override { return m_fast_reconnect; } // this is called when we receive a new piece // (and it has passed the hash check) @@ -391,12 +395,12 @@ namespace libtorrent void set_upload_only(bool u); bool upload_only() const { return m_upload_only; } - void set_holepunch_mode(); + void set_holepunch_mode() override; // will send a keep-alive message to the peer void keep_alive(); - peer_id const& pid() const { return m_peer_id; } + peer_id const& pid() const override { return m_peer_id; } void set_pid(peer_id const& peer_id) { m_peer_id = peer_id; } bool has_piece(int i) const; @@ -413,7 +417,7 @@ namespace libtorrent time_duration download_queue_time(int extra_bytes = 0) const; bool is_interesting() const { return m_interesting; } - bool is_choked() const { return m_choked; } + bool is_choked() const override { return m_choked; } bool is_peer_interested() const { return m_peer_interested; } bool has_peer_choked() const { return m_peer_choked; } @@ -423,7 +427,7 @@ namespace libtorrent void update_interest(); - virtual void get_peer_info(peer_info& p) const; + void get_peer_info(peer_info& p) const override; // returns the torrent this connection is a part of // may be zero if the connection is an incoming connection @@ -432,8 +436,8 @@ namespace libtorrent std::weak_ptr associated_torrent() const { return m_torrent; } - stat const& statistics() const { return m_statistics; } - void add_stat(std::int64_t downloaded, std::int64_t uploaded); + stat const& statistics() const override { return m_statistics; } + void add_stat(std::int64_t downloaded, std::int64_t uploaded) override; void sent_bytes(int bytes_payload, int bytes_protocol); void received_bytes(int bytes_payload, int bytes_protocol); void trancieve_ip_packet(int bytes, bool ipv6); @@ -446,8 +450,8 @@ namespace libtorrent void timeout_requests(); std::shared_ptr get_socket() const { return m_socket; } - tcp::endpoint const& remote() const { return m_remote; } - tcp::endpoint local_endpoint() const { return m_local; } + tcp::endpoint const& remote() const override { return m_remote; } + tcp::endpoint local_endpoint() const override { return m_local; } bitfield const& get_bitfield() const; std::vector const& allowed_fast(); @@ -457,13 +461,13 @@ namespace libtorrent time_point last_received() const { return m_last_receive; } // this will cause this peer_connection to be disconnected. - virtual void disconnect(error_code const& ec - , operation_t op, int error = 0); + void disconnect(error_code const& ec + , operation_t op, int error = 0) override; // called when a connect attempt fails (not when an // established connection fails) void connect_failed(error_code const& e); - bool is_disconnecting() const { return m_disconnecting; } + bool is_disconnecting() const override { return m_disconnecting; } // this is called when the connection attempt has succeeded // and the peer_connection is supposed to set m_connecting @@ -487,7 +491,7 @@ namespace libtorrent // a connection is local if it was initiated by us. // if it was an incoming connection, it is remote - bool is_outgoing() const { return m_outgoing; } + bool is_outgoing() const override { return m_outgoing; } bool received_listen_port() const { return m_received_listen_port; } void received_listen_port() @@ -496,7 +500,7 @@ namespace libtorrent bool on_local_network() const; bool ignore_unchoke_slots() const; - bool failed() const { return m_failed; } + bool failed() const override { return m_failed; } int desired_queue_size() const { @@ -525,9 +529,9 @@ namespace libtorrent int est_reciprocation_rate() const { return m_est_reciprocation_rate; } #ifndef TORRENT_DISABLE_LOGGING - bool should_log(peer_log_alert::direction_t direction) const; + bool should_log(peer_log_alert::direction_t direction) const override; void peer_log(peer_log_alert::direction_t direction - , char const* event, char const* fmt, ...) const TORRENT_FORMAT(4,5); + , char const* event, char const* fmt, ...) const override TORRENT_FORMAT(4,5); void peer_log(peer_log_alert::direction_t direction , char const* event) const; @@ -608,7 +612,7 @@ namespace libtorrent void cancel_request(piece_block const& b, bool force = false); void send_block_requests(); - void assign_bandwidth(int channel, int amount); + void assign_bandwidth(int channel, int amount) override; #if TORRENT_USE_INVARIANT_CHECKS void check_invariant() const; @@ -677,7 +681,7 @@ namespace libtorrent // called when the disk write buffer is drained again, and we can // start downloading payload again - void on_disk(); + void on_disk() override; int num_reading_bytes() const { return m_reading_bytes; } @@ -1181,7 +1185,7 @@ namespace libtorrent make_read_handler(Handler const& handler) { return aux::allocating_handler( - handler, m_read_handler_storage + handler, m_read_handler_storage, *this ); } @@ -1190,7 +1194,7 @@ namespace libtorrent make_write_handler(Handler const& handler) { return aux::allocating_handler( - handler, m_write_handler_storage + handler, m_write_handler_storage, *this ); } diff --git a/src/alert.cpp b/src/alert.cpp index b2f4dab5b..307545bd6 100644 --- a/src/alert.cpp +++ b/src/alert.cpp @@ -1455,6 +1455,7 @@ namespace libtorrent { "connect", "ssl_handshake", "get_interface", + "unknown", }; if (op < 0 || op >= int(sizeof(names)/sizeof(names[0]))) diff --git a/src/broadcast_socket.cpp b/src/broadcast_socket.cpp index a6b589bb7..26f9a3756 100644 --- a/src/broadcast_socket.cpp +++ b/src/broadcast_socket.cpp @@ -81,7 +81,7 @@ namespace libtorrent || (ip & 0xffff0000) == 0xc0a80000 // 192.168.x.x || (ip & 0xffff0000) == 0xa9fe0000 // 169.254.x.x || (ip & 0xff000000) == 0x7f000000); // 127.x.x.x - } TORRENT_CATCH(std::exception&) { return false; } + } TORRENT_CATCH(std::exception const&) { return false; } } bool is_loopback(address const& addr) @@ -92,7 +92,7 @@ namespace libtorrent return addr.to_v4() == address_v4::loopback(); else return addr.to_v6() == address_v6::loopback(); - } TORRENT_CATCH(std::exception&) { return false; } + } TORRENT_CATCH(std::exception const&) { return false; } #else return addr.to_v4() == address_v4::loopback(); #endif @@ -111,7 +111,7 @@ namespace libtorrent #else return addr.to_v4() == address_v4::any(); #endif - } TORRENT_CATCH(std::exception&) { return false; } + } TORRENT_CATCH(std::exception const&) { return false; } } bool is_teredo(address const& addr) @@ -122,7 +122,7 @@ namespace libtorrent std::uint8_t teredo_prefix[] = {0x20, 0x01, 0, 0}; address_v6::bytes_type b = addr.to_v6().to_bytes(); return memcmp(&b[0], teredo_prefix, 4) == 0; - } TORRENT_CATCH(std::exception&) { return false; } + } TORRENT_CATCH(std::exception const&) { return false; } #else TORRENT_UNUSED(addr); return false; @@ -140,7 +140,7 @@ namespace libtorrent error_code ec; address::from_string("::1", ec); return !ec; - } TORRENT_CATCH(std::exception&) { return false; } + } TORRENT_CATCH(std::exception const&) { return false; } #else io_service ios; tcp::socket test(ios); diff --git a/src/gzip.cpp b/src/gzip.cpp index 5a147f721..20c029605 100644 --- a/src/gzip.cpp +++ b/src/gzip.cpp @@ -221,7 +221,7 @@ namespace libtorrent { TORRENT_TRY { buffer.resize(destlen); - } TORRENT_CATCH(std::exception&) { + } TORRENT_CATCH (std::exception const&) { ec = errors::no_memory; return; } diff --git a/src/lsd.cpp b/src/lsd.cpp index 3348fcadd..958c32a31 100644 --- a/src/lsd.cpp +++ b/src/lsd.cpp @@ -281,7 +281,7 @@ void lsd::on_announce(udp::endpoint const& from, char const* buf // we got an announce, pass it on through the callback TORRENT_TRY { m_callback.on_lsd_peer(tcp::endpoint(from.address(), port), ih); - } TORRENT_CATCH(std::exception&) {} + } TORRENT_CATCH (std::exception const&) {} } } } diff --git a/src/peer_connection.cpp b/src/peer_connection.cpp index 96f8ea8c7..e6b3e6284 100644 --- a/src/peer_connection.cpp +++ b/src/peer_connection.cpp @@ -196,6 +196,21 @@ namespace libtorrent return ret; } + void peer_connection::on_exception(std::exception const& e) + { + TORRENT_UNUSED(e); +#ifndef TORRENT_DISABLE_LOGGING + peer_log(peer_log_alert::info, "PEER_ERROR" ,"error: %s" + , e.what()); +#endif + disconnect(error_code(), op_unknown, 2); + } + + void peer_connection::on_error(error_code const& ec) + { + disconnect(ec, op_unknown, 2); + } + void peer_connection::increase_est_reciprocation_rate() { TORRENT_ASSERT(is_single_thread()); @@ -1076,7 +1091,7 @@ namespace libtorrent { TORRENT_TRY { e->on_piece_pass(index); - } TORRENT_CATCH(std::exception&) {} + } TORRENT_CATCH (std::exception const&) {} } #else TORRENT_UNUSED(index); @@ -1096,7 +1111,7 @@ namespace libtorrent { TORRENT_TRY { e->on_piece_failed(index); - } TORRENT_CATCH(std::exception&) {} + } TORRENT_CATCH (std::exception const&) {} } #else TORRENT_UNUSED(index); diff --git a/src/session_impl.cpp b/src/session_impl.cpp index ac32e7ef6..545f64e90 100644 --- a/src/session_impl.cpp +++ b/src/session_impl.cpp @@ -642,7 +642,7 @@ namespace aux { { TORRENT_TRY { ext->save_state(*eptr); - } TORRENT_CATCH(std::exception&) {} + } TORRENT_CATCH (std::exception const&) {} } #endif } @@ -752,7 +752,7 @@ namespace aux { { TORRENT_TRY { ext->load_state(*e); - } TORRENT_CATCH(std::exception&) {} + } TORRENT_CATCH (std::exception const&) {} } #endif } @@ -1795,6 +1795,25 @@ namespace aux { return ret; } + void session_impl::on_exception(std::exception const& e) + { + TORRENT_UNUSED(e); +#ifndef TORRENT_DISABLE_LOGGING + session_log("FATAL SESSION ERROR [%s]", e.what()); +#endif + this->abort(); + } + + void session_impl::on_error(error_code const& ec) + { + TORRENT_UNUSED(ec); +#ifndef TORRENT_DISABLE_LOGGING + session_log("FATAL SESSION ERROR (%s : %d) [%s]" + , ec.category().name(), ec.value(), ec.message().c_str()); +#endif + this->abort(); + } + void session_impl::reopen_listen_sockets() { #ifndef TORRENT_DISABLE_LOGGING @@ -3167,7 +3186,7 @@ namespace aux { { TORRENT_TRY { ext->on_tick(); - } TORRENT_CATCH(std::exception&) {} + } TORRENT_CATCH (std::exception const&) {} } #endif diff --git a/src/torrent.cpp b/src/torrent.cpp index 270fd680c..e2c97086d 100644 --- a/src/torrent.cpp +++ b/src/torrent.cpp @@ -2059,7 +2059,7 @@ namespace libtorrent { TORRENT_TRY { e->on_load(); - } TORRENT_CATCH (std::exception&) {} + } TORRENT_CATCH (std::exception const&) {} } #endif @@ -2090,7 +2090,7 @@ namespace libtorrent { TORRENT_TRY { e->on_unload(); - } TORRENT_CATCH (std::exception&) {} + } TORRENT_CATCH (std::exception const&) {} } // also remove extensions and re-instantiate them when the torrent is loaded again @@ -4081,7 +4081,7 @@ namespace libtorrent { TORRENT_TRY { ext->on_piece_pass(index); - } TORRENT_CATCH (std::exception&) {} + } TORRENT_CATCH (std::exception const&) {} } #endif @@ -4286,7 +4286,7 @@ namespace libtorrent { TORRENT_TRY { ext->on_piece_failed(index); - } TORRENT_CATCH (std::exception&) {} + } TORRENT_CATCH (std::exception const&) {} } #endif @@ -6297,7 +6297,7 @@ namespace libtorrent , num_peers()); #endif } - TORRENT_CATCH (std::exception& e) + TORRENT_CATCH (std::exception const& e) { TORRENT_DECLARE_DUMMY(std::exception, e); (void)e; @@ -6949,7 +6949,7 @@ namespace libtorrent std::shared_ptr pp(ext->new_connection( peer_connection_handle(c->self()))); if (pp) c->add_extension(pp); - } TORRENT_CATCH (std::exception&) {} + } TORRENT_CATCH (std::exception const&) {} } #endif @@ -6969,7 +6969,7 @@ namespace libtorrent if (c->is_disconnecting()) return false; } - TORRENT_CATCH (std::exception&) + TORRENT_CATCH (std::exception const&) { peer_iterator i = sorted_find(m_connections, c.get()); if (i != m_connections.end()) @@ -7262,7 +7262,7 @@ namespace libtorrent peers_erased(st.erased); update_want_peers(); } - TORRENT_CATCH (std::exception& e) + TORRENT_CATCH (std::exception const& e) { TORRENT_DECLARE_DUMMY(std::exception, e); (void)e; @@ -7892,7 +7892,7 @@ namespace libtorrent { TORRENT_TRY { ext->on_files_checked(); - } TORRENT_CATCH (std::exception&) {} + } TORRENT_CATCH (std::exception const&) {} } #endif @@ -8874,7 +8874,7 @@ namespace libtorrent { TORRENT_TRY { if (ext->on_pause()) return; - } TORRENT_CATCH (std::exception&) {} + } TORRENT_CATCH (std::exception const&) {} } #endif @@ -9112,7 +9112,7 @@ namespace libtorrent { TORRENT_TRY { if (ext->on_resume()) return; - } TORRENT_CATCH (std::exception&) {} + } TORRENT_CATCH (std::exception const&) {} } #endif @@ -9349,7 +9349,7 @@ namespace libtorrent { TORRENT_TRY { ext->tick(); - } TORRENT_CATCH (std::exception&) {} + } TORRENT_CATCH (std::exception const&) {} } if (m_abort) return; @@ -9465,7 +9465,7 @@ namespace libtorrent TORRENT_TRY { p->second_tick(tick_interval_ms); } - TORRENT_CATCH (std::exception& e) + TORRENT_CATCH (std::exception const& e) { TORRENT_DECLARE_DUMMY(std::exception, e); (void)e; @@ -10919,7 +10919,7 @@ namespace libtorrent { TORRENT_TRY { ext->on_state(m_state); - } TORRENT_CATCH (std::exception&) {} + } TORRENT_CATCH (std::exception const&) {} } #endif } @@ -10932,7 +10932,7 @@ namespace libtorrent { TORRENT_TRY { ext->on_add_peer(ip, src, flags); - } TORRENT_CATCH (std::exception&) {} + } TORRENT_CATCH (std::exception const&) {} } } #endif diff --git a/src/upnp.cpp b/src/upnp.cpp index 53a71ed91..f61e2d08d 100644 --- a/src/upnp.cpp +++ b/src/upnp.cpp @@ -323,7 +323,7 @@ void upnp::resend_request(error_code const& ec) , std::ref(d), _5))); d.upnp_connection->get(d.url, seconds(30), 1); } - TORRENT_CATCH (std::exception& exc) + TORRENT_CATCH (std::exception const& exc) { TORRENT_DECLARE_DUMMY(std::exception, exc); TORRENT_UNUSED(exc); @@ -671,7 +671,7 @@ void upnp::try_map_upnp(bool timer) , std::ref(d), _5))); d.upnp_connection->get(d.url, seconds(30), 1); } - TORRENT_CATCH (std::exception& exc) + TORRENT_CATCH (std::exception const& exc) { TORRENT_DECLARE_DUMMY(std::exception, exc); TORRENT_UNUSED(exc); diff --git a/test/dht_server.cpp b/test/dht_server.cpp index 7d75d3128..8148ebc23 100644 --- a/test/dht_server.cpp +++ b/test/dht_server.cpp @@ -149,7 +149,7 @@ struct dht_server #endif ++m_dht_requests; } - catch (std::exception& e) + catch (std::exception const& e) { std::fprintf(stderr, "failed to decode DHT message: %s\n", e.what()); } diff --git a/test/test.hpp b/test/test.hpp index 1b14cf35f..1aab554d8 100644 --- a/test/test.hpp +++ b/test/test.hpp @@ -130,7 +130,7 @@ extern int EXPORT _g_test_failures; if (!(x)) \ TEST_REPORT_AUX("TEST_ERROR: check failed: \"" #x "\"", __FILE__, __LINE__); \ } \ - catch (std::exception& e) \ + catch (std::exception const& e) \ { \ TEST_ERROR("TEST_ERROR: Exception thrown: " #x " :" + std::string(e.what())); \ } \ @@ -147,7 +147,7 @@ extern int EXPORT _g_test_failures; TEST_REPORT_AUX(s__.str().c_str(), __FILE__, __LINE__); \ } \ } \ - catch (std::exception& e) \ + catch (std::exception const& e) \ { \ TEST_ERROR("TEST_ERROR: Exception thrown: " #x " :" + std::string(e.what())); \ } \ @@ -163,7 +163,7 @@ extern int EXPORT _g_test_failures; TEST_REPORT_AUX(s__.str().c_str(), __FILE__, __LINE__); \ } \ } \ - catch (std::exception& e) \ + catch (std::exception const& e) \ { \ TEST_ERROR("TEST_ERROR: Exception thrown: " #x " :" + std::string(e.what())); \ } \ diff --git a/test/test_torrent_info.cpp b/test/test_torrent_info.cpp index 634ff3306..5c90284a2 100644 --- a/test/test_torrent_info.cpp +++ b/test/test_torrent_info.cpp @@ -866,7 +866,7 @@ TORRENT_TEST(empty_file2) auto ti = std::make_shared("", 0); TEST_ERROR("expected exception thrown"); } - catch (system_error& e) + catch (system_error const& e) { std::printf("Expected error: %s\n", e.code().message().c_str()); }