Fixed more problems issued by PC-lint
authorGuilherme Maciel Ferreira <guilherme.maciel.ferreira@intra2net.com>
Mon, 11 Apr 2011 13:56:15 +0000 (15:56 +0200)
committerGuilherme Maciel Ferreira <guilherme.maciel.ferreira@intra2net.com>
Mon, 11 Apr 2011 13:56:15 +0000 (15:56 +0200)
- alternative initialization to avoid calling virtual methods from constructor

12 files changed:
src/icmp/icmpdestinationunreachablemessage.cpp
src/icmp/icmpdestinationunreachablemessage.h
src/icmp/icmpechoreplymessage.cpp
src/icmp/icmpechoreplymessage.h
src/icmp/icmpechorequestmessage.cpp
src/icmp/icmpechorequestmessage.h
src/icmp/icmpgenericmessage.cpp
src/icmp/icmpgenericmessage.h
src/icmp/icmpheader.cpp
src/icmp/icmpmessage.cpp
src/icmp/icmpmessage.h
src/icmp/icmptype.h

index 674ab43..3c1fd98 100644 (file)
@@ -11,29 +11,6 @@ const int IcmpDestinationUnreachableMessage::MessageSizeInBytes = 44;
 IcmpDestinationUnreachableMessage::IcmpDestinationUnreachableMessage()
 {
     fill( Payload, Payload + sizeof(Payload), 0 );
-
-    set_type( IcmpType_InvalidLast );
-    set_code( 0 );
-    set_checksum( 0 );
-    set_identifier( 0 );
-    set_sequence_number( 0 );
-}
-
-IcmpDestinationUnreachableMessage::IcmpDestinationUnreachableMessage(
-        const IcmpType type,
-        const uint8_t code,
-        const uint16_t checksum,
-        const uint16_t identifier,
-        const uint16_t sequence_number
-)
-{
-    fill( Payload, Payload + sizeof(Payload), 0 );
-
-    set_type( type );
-    set_code( code );
-    set_checksum( checksum );
-    set_identifier( identifier );
-    set_sequence_number( sequence_number );
 }
 
 IcmpDestinationUnreachableMessage::~IcmpDestinationUnreachableMessage()
index cc37291..e61ab71 100644 (file)
@@ -39,13 +39,6 @@ class IcmpDestinationUnreachableMessage : public IcmpMessage
 {
 public:
     IcmpDestinationUnreachableMessage();
-    IcmpDestinationUnreachableMessage(
-            const IcmpType type,
-            const uint8_t code,
-            const uint16_t checksum,
-            const uint16_t identifier,
-            const uint16_t sequence_number
-    );
     virtual ~IcmpDestinationUnreachableMessage();
 
     IcmpType get_type() const;
index 6d24456..55a8059 100644 (file)
@@ -11,29 +11,6 @@ const int IcmpEchoReplyMessage::MessageSizeInBytes = 8;
 IcmpEchoReplyMessage::IcmpEchoReplyMessage()
 {
     fill( Payload, Payload + sizeof(Payload), 0 );
-
-    set_type( IcmpType_InvalidLast );
-    set_code( 0 );
-    set_checksum( 0 );
-    set_identifier( 0 );
-    set_sequence_number( 0 );
-}
-
-IcmpEchoReplyMessage::IcmpEchoReplyMessage(
-        const IcmpType type,
-        const uint8_t code,
-        const uint16_t checksum,
-        const uint16_t identifier,
-        const uint16_t sequence_number
-)
-{
-    fill( Payload, Payload + sizeof(Payload), 0 );
-
-    set_type( type );
-    set_code( code );
-    set_checksum( checksum );
-    set_identifier( identifier );
-    set_sequence_number( sequence_number );
 }
 
 IcmpEchoReplyMessage::~IcmpEchoReplyMessage()
index eef3579..5e2b47f 100644 (file)
@@ -35,13 +35,6 @@ class IcmpEchoReplyMessage : public IcmpMessage
 {
 public:
     IcmpEchoReplyMessage();
-    IcmpEchoReplyMessage(
-            const IcmpType type,
-            const uint8_t code,
-            const uint16_t checksum,
-            const uint16_t identifier,
-            const uint16_t sequence_number
-    );
     virtual ~IcmpEchoReplyMessage();
 
     IcmpType get_type() const;
index a196c7f..4067e71 100644 (file)
@@ -11,29 +11,6 @@ const int IcmpEchoRequestMessage::MessageSizeInBytes = 8;
 IcmpEchoRequestMessage::IcmpEchoRequestMessage()
 {
     fill( Payload, Payload + sizeof(Payload), 0 );
-
-    set_type( IcmpType_InvalidLast );
-    set_code( 0 );
-    set_checksum( 0 );
-    set_identifier( 0 );
-    set_sequence_number( 0 );
-}
-
-IcmpEchoRequestMessage::IcmpEchoRequestMessage(
-        const IcmpType type,
-        const uint8_t code,
-        const uint16_t checksum,
-        const uint16_t identifier,
-        const uint16_t sequence_number
-)
-{
-    fill( Payload, Payload + sizeof(Payload), 0 );
-
-    set_type( type );
-    set_code( code );
-    set_checksum( checksum );
-    set_identifier( identifier );
-    set_sequence_number( sequence_number );
 }
 
 IcmpEchoRequestMessage::~IcmpEchoRequestMessage()
index dfb2bda..0eb1d2e 100644 (file)
@@ -35,13 +35,6 @@ class IcmpEchoRequestMessage : public IcmpMessage
 {
 public:
     IcmpEchoRequestMessage();
-    IcmpEchoRequestMessage(
-            const IcmpType type,
-            const uint8_t code,
-            const uint16_t checksum,
-            const uint16_t identifier,
-            const uint16_t sequence_number
-    );
     virtual ~IcmpEchoRequestMessage();
 
     IcmpType get_type() const;
index 59418b4..fe6193f 100644 (file)
@@ -6,26 +6,6 @@
 
 IcmpGenericMessage::IcmpGenericMessage()
 {
-    set_type( IcmpType_InvalidLast );
-    set_code( 0 );
-    set_checksum( 0 );
-    set_identifier( 0 );
-    set_sequence_number( 0 );
-}
-
-IcmpGenericMessage::IcmpGenericMessage(
-        const IcmpType type,
-        const uint8_t code,
-        const uint16_t checksum,
-        const uint16_t identifier,
-        const uint16_t sequence_number
-)
-{
-    set_type( type );
-    set_code( code );
-    set_checksum( checksum );
-    set_identifier( identifier );
-    set_sequence_number( sequence_number );
 }
 
 IcmpGenericMessage::~IcmpGenericMessage()
@@ -34,7 +14,7 @@ IcmpGenericMessage::~IcmpGenericMessage()
 
 IcmpType IcmpGenericMessage::get_type() const
 {
-    return IcmpType_InvalidLast;
+    return IcmpType_Generic;
 }
 
 void IcmpGenericMessage::set_type( IcmpType )
index 1c0bff9..f53f4c7 100644 (file)
@@ -20,13 +20,6 @@ class IcmpGenericMessage : public IcmpMessage
 {
 public:
     IcmpGenericMessage();
-    IcmpGenericMessage(
-            const IcmpType type,
-            const uint8_t code,
-            const uint16_t checksum,
-            const uint16_t identifier,
-            const uint16_t sequence_number
-    );
     virtual ~IcmpGenericMessage();
 
     IcmpType get_type() const;
index c19b778..a0da95d 100644 (file)
@@ -108,23 +108,42 @@ void IcmpHeader::set_icmp_message_format( IcmpType type )
                 break;
             case IcmpType_DestinationUnreachable:
                 MessageFormat.reset(
-                        new IcmpDestinationUnreachableMessage );
+                        new IcmpDestinationUnreachableMessage
+                );
                 break;
-            default:
+            case IcmpType_SourceQuench:
+            case IcmpType_Redirect:
+            case IcmpType_TimeExceeded:
+            case IcmpType_ParameterProblem:
+            case IcmpType_TimestampRequest:
+            case IcmpType_TimestampReply:
+            case IcmpType_InfoRequest:
+            case IcmpType_InfoReply:
+            case IcmpType_AddressRequest:
+            case IcmpType_AddressReply:
                 MessageFormat.reset( new IcmpGenericMessage );
                 break;
+            case IcmpType_InvalidLast:
+            default:
+                BOOST_ASSERT( false );
+                break;
         }
+
+        MessageFormat->init( type );
     }
+
+    BOOST_ASSERT( MessageFormat.get() != NULL );
+    BOOST_ASSERT( MessageFormat->get_type() != IcmpType_InvalidLast );
 }
 
 void IcmpHeader::set_icmp_message_format( std::istream &is )
 {
     // read the first byte, which contains the type of the ICMP message
     char first_byte;
-    is.read( &first_byte, 1 );
+    (void) is.read( &first_byte, 1 );
 
     // must keep the stream intact, so place the read byte back
-    is.putback( first_byte );
+    (void) is.putback( first_byte );
 
     // now select the message format for the given type
     IcmpType header_type = static_cast<IcmpType> ( first_byte );
index d7ead6e..e1878ff 100644 (file)
@@ -11,3 +11,19 @@ IcmpMessage::IcmpMessage()
 IcmpMessage::~IcmpMessage()
 {
 }
+
+/**
+ * This method MUST be called to initialize the data member of ICMP Messages.
+ */
+void IcmpMessage::init( const IcmpType type )
+{
+    // Note: this code can not be placed in the constructor, because it calls
+    // virtual function. If you call virtual functions from within a
+    // constructor, the Base class version of methods will be called, not the
+    // Derived class, because the Base is constructed before the Derived class.
+    set_type( type );
+    set_code( 0 );
+    set_checksum( 0 );
+    set_identifier( 0 );
+    set_sequence_number( 0 );
+}
index 02209ce..d6e0fe9 100644 (file)
@@ -18,6 +18,8 @@ public:
     IcmpMessage();
     virtual ~IcmpMessage();
 
+    void init( const IcmpType type );
+
     virtual IcmpType get_type() const = 0;
     virtual void set_type( const IcmpType type ) = 0;
 
index 7407f5e..80f41bb 100644 (file)
@@ -16,7 +16,8 @@ enum IcmpType
     IcmpType_InfoReply = 16,
     IcmpType_AddressRequest = 17,
     IcmpType_AddressReply = 18,
-    IcmpType_InvalidLast = 42
+    IcmpType_InvalidLast = 42,
+    IcmpType_Generic = 43
 };
 
 #endif /* ICMP_TYPE_H */