Follow practices suggested by "Effective C++"

The patch adjust the code of the base, base-<kernel>, and os repository.
To adapt existing components to fix violations of the best practices
suggested by "Effective C++" as reported by the -Weffc++ compiler
argument. The changes follow the patterns outlined below:

* A class with virtual functions can no longer publicly inherit base
  classed without a vtable. The inherited object may either be moved
  to a member variable, or inherited privately. The latter would be
  used for classes that inherit 'List::Element' or 'Avl_node'. In order
  to enable the 'List' and 'Avl_tree' to access the meta data, the
  'List' must become a friend.

* Instead of adding a virtual destructor to abstract base classes,
  we inherit the new 'Interface' class, which contains a virtual
  destructor. This way, single-line abstract base classes can stay
  as compact as they are now. The 'Interface' utility resides in
  base/include/util/interface.h.

* With the new warnings enabled, all member variables must be explicitly
  initialized. Basic types may be initialized with '='. All other types
  are initialized with braces '{ ... }' or as class initializers. If
  basic types and non-basic types appear in a row, it is nice to only
  use the brace syntax (also for basic types) and align the braces.

* If a class contains pointers as members, it must now also provide a
  copy constructor and assignment operator. In the most cases, one
  would make them private, effectively disallowing the objects to be
  copied. Unfortunately, this warning cannot be fixed be inheriting
  our existing 'Noncopyable' class (the compiler fails to detect that
  the inheriting class cannot be copied and still gives the error).
  For now, we have to manually add declarations for both the copy
  constructor and assignment operator as private class members. Those
  declarations should be prepended with a comment like this:

        /*
         * Noncopyable
         */
        Thread(Thread const &);
        Thread &operator = (Thread const &);

  In the future, we should revisit these places and try to replace
  the pointers with references. In the presence of at least one
  reference member, the compiler would no longer implicitly generate
  a copy constructor. So we could remove the manual declaration.

Issue #465
This commit is contained in:
Norman Feske
2017-12-21 15:42:15 +01:00
committed by Christian Helmuth
parent 2a33d9aa76
commit eba9c15746
763 changed files with 4936 additions and 3288 deletions

View File

@ -37,7 +37,7 @@ class Vfs::Fs_file_system : public File_system
* XXX Once, we change the VFS file-system interface to use
* asynchronous read/write operations, we can possibly remove it.
*/
Lock _lock;
Lock _lock { };
Genode::Env &_env;
Genode::Allocator_avl _fs_packet_alloc;
@ -53,7 +53,7 @@ class Vfs::Fs_file_system : public File_system
typedef Genode::Id_space<::File_system::Node> Handle_space;
Handle_space _handle_space;
Handle_space _handle_space { };
struct Handle_state
{
@ -64,13 +64,23 @@ class Vfs::Fs_file_system : public File_system
Queued_state queued_read_state = Queued_state::IDLE;
Queued_state queued_sync_state = Queued_state::IDLE;
::File_system::Packet_descriptor queued_read_packet;
::File_system::Packet_descriptor queued_sync_packet;
::File_system::Packet_descriptor queued_read_packet { };
::File_system::Packet_descriptor queued_sync_packet { };
};
struct Fs_vfs_handle : Vfs_handle, ::File_system::Node,
Handle_space::Element, Handle_state
struct Fs_vfs_handle : Vfs_handle,
private ::File_system::Node,
private Handle_space::Element,
private Handle_state
{
using Handle_state::queued_read_state;
using Handle_state::queued_read_packet;
using Handle_state::queued_sync_packet;
using Handle_state::queued_sync_state;
using Handle_state::read_ready_state;
friend class Genode::Id_space<::File_system::Node>;
::File_system::Connection &_fs;
Io_response_handler &_io_handler;
@ -154,14 +164,15 @@ class Vfs::Fs_file_system : public File_system
::File_system::File_handle file_handle() const
{ return ::File_system::File_handle { id().value }; }
virtual bool queue_read(file_size count)
virtual bool queue_read(file_size /* count */)
{
Genode::error("Fs_vfs_handle::queue_read() called");
return true;
}
virtual Read_result complete_read(char *dst, file_size count,
file_size &out_count)
virtual Read_result complete_read(char *,
file_size /* in count */,
file_size & /* out count */)
{
Genode::error("Fs_vfs_handle::complete_read() called");
return READ_ERR_INVALID;
@ -348,8 +359,8 @@ class Vfs::Fs_file_system : public File_system
{
Genode::Entrypoint &_ep;
Io_response_handler &_io_handler;
List<Vfs_handle::Context> _context_list;
Lock _list_lock;
List<Vfs_handle::Context> _context_list { };
Lock _list_lock { };
bool _null_context_armed { false };
Post_signal_hook(Genode::Entrypoint &ep,
@ -578,13 +589,13 @@ class Vfs::Fs_file_system : public File_system
** Directory-service interface **
*********************************/
Dataspace_capability dataspace(char const *path) override
Dataspace_capability dataspace(char const *) override
{
/* cannot be implemented without blocking */
return Dataspace_capability();
}
void release(char const *path, Dataspace_capability ds_cap) override { }
void release(char const *, Dataspace_capability) override { }
Stat_result stat(char const *path, Stat &out) override
{