From 1519ee4f911804137fe6ae1936f60deb7515473f Mon Sep 17 00:00:00 2001 From: Guilherme Maciel Ferreira Date: Mon, 11 Apr 2011 15:56:15 +0200 Subject: [PATCH] Fixed more problems issued by PC-lint - alternative initialization to avoid calling virtual methods from constructor --- src/icmp/icmpdestinationunreachablemessage.cpp | 23 -------------------- src/icmp/icmpdestinationunreachablemessage.h | 7 ------ src/icmp/icmpechoreplymessage.cpp | 23 -------------------- src/icmp/icmpechoreplymessage.h | 7 ------ src/icmp/icmpechorequestmessage.cpp | 23 -------------------- src/icmp/icmpechorequestmessage.h | 7 ------ src/icmp/icmpgenericmessage.cpp | 22 +------------------ src/icmp/icmpgenericmessage.h | 7 ------ src/icmp/icmpheader.cpp | 27 ++++++++++++++++++++--- src/icmp/icmpmessage.cpp | 16 ++++++++++++++ src/icmp/icmpmessage.h | 2 + src/icmp/icmptype.h | 3 +- 12 files changed, 44 insertions(+), 123 deletions(-) diff --git a/src/icmp/icmpdestinationunreachablemessage.cpp b/src/icmp/icmpdestinationunreachablemessage.cpp index 674ab43..3c1fd98 100644 --- a/src/icmp/icmpdestinationunreachablemessage.cpp +++ b/src/icmp/icmpdestinationunreachablemessage.cpp @@ -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() diff --git a/src/icmp/icmpdestinationunreachablemessage.h b/src/icmp/icmpdestinationunreachablemessage.h index cc37291..e61ab71 100644 --- a/src/icmp/icmpdestinationunreachablemessage.h +++ b/src/icmp/icmpdestinationunreachablemessage.h @@ -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; diff --git a/src/icmp/icmpechoreplymessage.cpp b/src/icmp/icmpechoreplymessage.cpp index 6d24456..55a8059 100644 --- a/src/icmp/icmpechoreplymessage.cpp +++ b/src/icmp/icmpechoreplymessage.cpp @@ -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() diff --git a/src/icmp/icmpechoreplymessage.h b/src/icmp/icmpechoreplymessage.h index eef3579..5e2b47f 100644 --- a/src/icmp/icmpechoreplymessage.h +++ b/src/icmp/icmpechoreplymessage.h @@ -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; diff --git a/src/icmp/icmpechorequestmessage.cpp b/src/icmp/icmpechorequestmessage.cpp index a196c7f..4067e71 100644 --- a/src/icmp/icmpechorequestmessage.cpp +++ b/src/icmp/icmpechorequestmessage.cpp @@ -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() diff --git a/src/icmp/icmpechorequestmessage.h b/src/icmp/icmpechorequestmessage.h index dfb2bda..0eb1d2e 100644 --- a/src/icmp/icmpechorequestmessage.h +++ b/src/icmp/icmpechorequestmessage.h @@ -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; diff --git a/src/icmp/icmpgenericmessage.cpp b/src/icmp/icmpgenericmessage.cpp index 59418b4..fe6193f 100644 --- a/src/icmp/icmpgenericmessage.cpp +++ b/src/icmp/icmpgenericmessage.cpp @@ -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 ) diff --git a/src/icmp/icmpgenericmessage.h b/src/icmp/icmpgenericmessage.h index 1c0bff9..f53f4c7 100644 --- a/src/icmp/icmpgenericmessage.h +++ b/src/icmp/icmpgenericmessage.h @@ -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; diff --git a/src/icmp/icmpheader.cpp b/src/icmp/icmpheader.cpp index c19b778..a0da95d 100644 --- a/src/icmp/icmpheader.cpp +++ b/src/icmp/icmpheader.cpp @@ -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 ( first_byte ); diff --git a/src/icmp/icmpmessage.cpp b/src/icmp/icmpmessage.cpp index d7ead6e..e1878ff 100644 --- a/src/icmp/icmpmessage.cpp +++ b/src/icmp/icmpmessage.cpp @@ -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 ); +} diff --git a/src/icmp/icmpmessage.h b/src/icmp/icmpmessage.h index 02209ce..d6e0fe9 100644 --- a/src/icmp/icmpmessage.h +++ b/src/icmp/icmpmessage.h @@ -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; diff --git a/src/icmp/icmptype.h b/src/icmp/icmptype.h index 7407f5e..80f41bb 100644 --- a/src/icmp/icmptype.h +++ b/src/icmp/icmptype.h @@ -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 */ -- 1.7.1