diff --git a/Makefile b/Makefile index eba6fef..f26cd92 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,13 @@ rebuild: clean all xmltest: xmltest.cpp libtinyxml2.a +effc: + gcc -Werror -Wall -Wextra -Wshadow -Wpedantic -Wformat-nonliteral \ + -Wformat-security -Wswitch-default -Wuninitialized -Wundef \ + -Wpointer-arith -Woverloaded-virtual -Wctor-dtor-privacy \ + -Wnon-virtual-dtor -Woverloaded-virtual -Wsign-promo \ + -Wno-unused-parameter -Weffc++ xmltest.cpp tinyxml2.cpp -o xmltest + clean: $(RM) *.o xmltest libtinyxml2.a diff --git a/contrib/html5-printer.cpp b/contrib/html5-printer.cpp index 7728b69..e9a423d 100644 --- a/contrib/html5-printer.cpp +++ b/contrib/html5-printer.cpp @@ -40,7 +40,7 @@ distribution. */ -#include +#include "../tinyxml2.h" #include #if defined (_MSC_VER) diff --git a/tinyxml2.cpp b/tinyxml2.cpp index 3ec4f6d..5de92b5 100755 --- a/tinyxml2.cpp +++ b/tinyxml2.cpp @@ -742,6 +742,7 @@ bool XMLDocument::Accept( XMLVisitor* visitor ) const XMLNode::XMLNode( XMLDocument* doc ) : _document( doc ), _parent( 0 ), + _value(), _parseLineNum( 0 ), _firstChild( 0 ), _lastChild( 0 ), _prev( 0 ), _next( 0 ), @@ -2001,9 +2002,16 @@ XMLDocument::XMLDocument( bool processEntities, Whitespace whitespaceMode ) : _processEntities( processEntities ), _errorID(XML_SUCCESS), _whitespaceMode( whitespaceMode ), + _errorStr1(), + _errorStr2(), _errorLineNum( 0 ), _charBuffer( 0 ), - _parseCurLineNum( 0 ) + _parseCurLineNum( 0 ), + _unlinked(), + _elementPool(), + _attributePool(), + _textPool(), + _commentPool() { // avoid VC++ C4355 warning about 'this' in initializer list (C4355 is off by default in VS2012+) _document = this; @@ -2363,12 +2371,14 @@ void XMLDocument::Parse() XMLPrinter::XMLPrinter( FILE* file, bool compact, int depth ) : _elementJustOpened( false ), + _stack(), _firstElement( true ), _fp( file ), _depth( depth ), _textDepth( -1 ), _processEntities( true ), - _compactMode( compact ) + _compactMode( compact ), + _buffer() { for( int i=0; i class DynArray { public: - DynArray() { - _mem = _pool; - _allocated = INITIAL_SIZE; - _size = 0; + DynArray() : + _mem( _pool ), + _allocated( INITIAL_SIZE ), + _size( 0 ) + { } ~DynArray() { @@ -333,7 +334,7 @@ template< int ITEM_SIZE > class MemPoolT : public MemPool { public: - MemPoolT() : _root(0), _currentAllocs(0), _nAllocs(0), _maxAllocs(0), _nUntracked(0) {} + MemPoolT() : _blockPtrs(), _root(0), _currentAllocs(0), _nAllocs(0), _maxAllocs(0), _nUntracked(0) {} ~MemPoolT() { Clear(); } @@ -1211,7 +1212,7 @@ public: private: enum { BUF_SIZE = 200 }; - XMLAttribute() : _parseLineNum( 0 ), _next( 0 ), _memPool( 0 ) {} + XMLAttribute() : _name(), _value(),_parseLineNum( 0 ), _next( 0 ), _memPool( 0 ) {} virtual ~XMLAttribute() {} XMLAttribute( const XMLAttribute& ); // not supported @@ -1953,16 +1954,13 @@ class TINYXML2_LIB XMLHandle { public: /// Create a handle from any node (at any depth of the tree.) This can be a null pointer. - XMLHandle( XMLNode* node ) { - _node = node; + XMLHandle( XMLNode* node ) : _node( node ) { } /// Create a handle from a node. - XMLHandle( XMLNode& node ) { - _node = &node; + XMLHandle( XMLNode& node ) : _node( &node ) { } /// Copy constructor - XMLHandle( const XMLHandle& ref ) { - _node = ref._node; + XMLHandle( const XMLHandle& ref ) : _node( ref._node ) { } /// Assignment XMLHandle& operator=( const XMLHandle& ref ) { @@ -2036,14 +2034,11 @@ private: class TINYXML2_LIB XMLConstHandle { public: - XMLConstHandle( const XMLNode* node ) { - _node = node; + XMLConstHandle( const XMLNode* node ) : _node( node ) { } - XMLConstHandle( const XMLNode& node ) { - _node = &node; + XMLConstHandle( const XMLNode& node ) : _node( &node ) { } - XMLConstHandle( const XMLConstHandle& ref ) { - _node = ref._node; + XMLConstHandle( const XMLConstHandle& ref ) : _node( ref._node ) { } XMLConstHandle& operator=( const XMLConstHandle& ref ) { @@ -2258,6 +2253,10 @@ private: bool _restrictedEntityFlag[ENTITY_RANGE]; DynArray< char, 20 > _buffer; + + // Prohibit cloning, intentionally not implemented + XMLPrinter( const XMLPrinter& ); + XMLPrinter& operator=( const XMLPrinter& ); }; diff --git a/xmltest.cpp b/xmltest.cpp index a297722..91494ec 100644 --- a/xmltest.cpp +++ b/xmltest.cpp @@ -1035,8 +1035,9 @@ int main( int argc, const char ** argv ) if ( textfile ) { XMLPrinter streamer( textfile ); - psg->Accept( &streamer ); + bool acceptResult = psg->Accept( &streamer ); fclose( textfile ); + XMLTest( "Entity transformation: Accept", true, acceptResult ); } textfile = fopen( textFilePath, "r" ); @@ -1332,7 +1333,8 @@ int main( int argc, const char ** argv ) XMLTest( "Parse before deep cloning sub element", false, doc.Error() ); const XMLElement* subElement = doc.FirstChildElement("root")->FirstChildElement("child2"); - subElement->Accept(&printer1); + bool acceptResult = subElement->Accept(&printer1); + XMLTest( "Accept before deep cloning", true, acceptResult ); XMLNode* clonedSubElement = subElement->DeepClone(&doc2); doc2.InsertFirstChild(clonedSubElement); @@ -1648,7 +1650,8 @@ int main( int argc, const char ** argv ) XMLElement* ele = doc.FirstChildElement( "parent")->FirstChildElement( "child"); XMLPrinter printer; - ele->Accept( &printer ); + bool acceptResult = ele->Accept( &printer ); + XMLTest( "Accept of sub-element", true, acceptResult ); XMLTest( "Printing of sub-element", "abc\n", printer.CStr(), false ); } @@ -1730,7 +1733,8 @@ int main( int argc, const char ** argv ) XMLElement* two = doc.RootElement()->FirstChildElement("two"); two->InsertFirstChild(subtree); XMLPrinter printer1(0, true); - doc.Accept(&printer1); + bool acceptResult = doc.Accept(&printer1); + XMLTest("Move node from within to - Accept()", true, acceptResult); XMLTest("Move node from within to ", xmlInsideTwo, printer1.CStr()); doc.Parse(xml); @@ -1739,7 +1743,8 @@ int main( int argc, const char ** argv ) two = doc.RootElement()->FirstChildElement("two"); doc.RootElement()->InsertAfterChild(two, subtree); XMLPrinter printer2(0, true); - doc.Accept(&printer2); + acceptResult = doc.Accept(&printer2); + XMLTest("Move node from within after - Accept()", true, acceptResult); XMLTest("Move node from within after ", xmlAfterTwo, printer2.CStr(), false); doc.Parse(xml); @@ -1748,7 +1753,8 @@ int main( int argc, const char ** argv ) subtree = one->FirstChildElement("subtree"); doc.RootElement()->InsertAfterChild(one, subtree); XMLPrinter printer3(0, true); - doc.Accept(&printer3); + acceptResult = doc.Accept(&printer3); + XMLTest("Move node from within after - Accept()", true, acceptResult); XMLTest("Move node from within after ", xmlAfterOne, printer3.CStr(), false); doc.Parse(xml); @@ -1757,7 +1763,8 @@ int main( int argc, const char ** argv ) two = doc.RootElement()->FirstChildElement("two"); doc.RootElement()->InsertEndChild(subtree); XMLPrinter printer4(0, true); - doc.Accept(&printer4); + acceptResult = doc.Accept(&printer4); + XMLTest("Move node from within after - Accept()", true, acceptResult); XMLTest("Move node from within after ", xmlAfterTwo, printer4.CStr(), false); } @@ -1881,7 +1888,8 @@ int main( int argc, const char ** argv ) XMLDocument doc; XMLElement* newElement = doc.NewElement( "printme" ); XMLPrinter printer; - newElement->Accept( &printer ); + bool acceptResult = newElement->Accept( &printer ); + XMLTest( "printme - Accept()", true, acceptResult ); // Delete the node to avoid possible memory leak report in debug output doc.DeleteNode( newElement ); } @@ -2015,22 +2023,33 @@ int main( int argc, const char ** argv ) XMLElement* playlist = doc.FirstChildElement("playlist"); XMLTest("Crash bug parsing", true, playlist != 0); - tinyxml2::XMLElement* entry = playlist->FirstChildElement("entry"); - XMLTest("Crash bug parsing", true, entry != 0); - while (entry) { - tinyxml2::XMLElement* todelete = entry; - entry = entry->NextSiblingElement("entry"); - playlist->DeleteChild(todelete); - }; - tinyxml2::XMLElement* blank = playlist->FirstChildElement("blank"); - while (blank) { - tinyxml2::XMLElement* todelete = blank; - blank = blank->NextSiblingElement("blank"); - playlist->DeleteChild(todelete); - }; + { + const char* elementName = "entry"; + XMLElement* entry = playlist->FirstChildElement(elementName); + XMLTest("Crash bug parsing", true, entry != 0); + while (entry) { + XMLElement* todelete = entry; + entry = entry->NextSiblingElement(elementName); + playlist->DeleteChild(todelete); + } + entry = playlist->FirstChildElement(elementName); + XMLTest("Crash bug parsing", true, entry == 0); + } + { + const char* elementName = "blank"; + XMLElement* blank = playlist->FirstChildElement(elementName); + XMLTest("Crash bug parsing", true, blank != 0); + while (blank) { + XMLElement* todelete = blank; + blank = blank->NextSiblingElement(elementName); + playlist->DeleteChild(todelete); + } + XMLTest("Crash bug parsing", true, blank == 0); + } tinyxml2::XMLPrinter printer; - playlist->Accept(&printer); + const bool acceptResult = playlist->Accept(&printer); + XMLTest("Crash bug parsing - Accept()", true, acceptResult); printf("%s\n", printer.CStr()); // No test; it only need to not crash. @@ -2046,6 +2065,8 @@ int main( int argc, const char ** argv ) { struct TestUtil: XMLVisitor { + TestUtil() : str() {} + void TestParseError(const char *testString, const char *docStr, XMLError expected_error, int expectedLine) { XMLDocument doc; @@ -2119,7 +2140,8 @@ int main( int argc, const char ** argv ) void TestDocLines(const char *testString, XMLDocument &doc, const char *expectedLines) { str.Clear(); - doc.Accept(this); + const bool acceptResult = doc.Accept(this); + XMLTest(testString, true, acceptResult); str.Push(0); XMLTest(testString, expectedLines, str.Mem()); }