diff options
author | William S Fulton <wsf@fultondesigns.co.uk> | 2019-07-11 07:08:51 +0100 |
---|---|---|
committer | William S Fulton <wsf@fultondesigns.co.uk> | 2019-07-11 07:08:51 +0100 |
commit | 42f5e2da418c8ff0154e4acee38cb64a4c56a7d7 (patch) | |
tree | c124d2452eb4b59c74482f86389e8a30ce03c6f8 | |
parent | fdb6bab27312d18ee6fb6206248d3cb1a40415e5 (diff) | |
parent | 841d4b5fb9ca42e697faf28148abe2bcd7230da5 (diff) | |
download | swig-42f5e2da418c8ff0154e4acee38cb64a4c56a7d7.tar.gz |
Merge branch 'doxy/segfault'
* doxy/segfault:
Add iterator safety check in DoxygenParser::parse
Doxygen comment parsing fix for empty lines in code/verbatim blocks
8 files changed, 32 insertions, 1 deletions
diff --git a/Examples/test-suite/doxygen_basic_translate.i b/Examples/test-suite/doxygen_basic_translate.i index 0a8b0474f..da4d80909 100644 --- a/Examples/test-suite/doxygen_basic_translate.i +++ b/Examples/test-suite/doxygen_basic_translate.i @@ -57,6 +57,8 @@ void function3(int a, int b) * \warning This may not work as expected * \code * int main() { while(true); } + * + * // Test blank line in code block * \endcode * \endif */ diff --git a/Examples/test-suite/doxygen_basic_translate_style2.i b/Examples/test-suite/doxygen_basic_translate_style2.i index 23e8de4f7..32e3cfcbe 100644 --- a/Examples/test-suite/doxygen_basic_translate_style2.i +++ b/Examples/test-suite/doxygen_basic_translate_style2.i @@ -55,6 +55,8 @@ void function3(int a, int b) * \warning This may not work as expected * \code * int main() { while(true); } + * + * // Test blank line in code block * \endcode * \endif */ diff --git a/Examples/test-suite/java/doxygen_basic_translate_runme.java b/Examples/test-suite/java/doxygen_basic_translate_runme.java index f307b3abc..ab343b560 100644 --- a/Examples/test-suite/java/doxygen_basic_translate_runme.java +++ b/Examples/test-suite/java/doxygen_basic_translate_runme.java @@ -54,6 +54,8 @@ public class doxygen_basic_translate_runme { " \n" + " {@code \n" + "int main() { while(true); } \n" + + "\n" + + "// Test blank line in code block \n" + " }\n" + " }\n" + " \n" + diff --git a/Examples/test-suite/java/doxygen_basic_translate_style2_runme.java b/Examples/test-suite/java/doxygen_basic_translate_style2_runme.java index aa015eeac..05e51cff8 100644 --- a/Examples/test-suite/java/doxygen_basic_translate_style2_runme.java +++ b/Examples/test-suite/java/doxygen_basic_translate_style2_runme.java @@ -54,6 +54,8 @@ public class doxygen_basic_translate_style2_runme { " \n" + " {@code \n" + "int main() { while(true); } \n" + + "\n" + + "// Test blank line in code block \n" + " }\n" + " }\n" + " \n" + diff --git a/Examples/test-suite/python/doxygen_basic_translate_runme.py b/Examples/test-suite/python/doxygen_basic_translate_runme.py index b6023224d..9ef8dbd52 100644 --- a/Examples/test-suite/python/doxygen_basic_translate_runme.py +++ b/Examples/test-suite/python/doxygen_basic_translate_runme.py @@ -50,6 +50,8 @@ Warning: This may not work as expected .. code-block:: c++ int main() { while(true); } + + // Test blank line in code block }""" ) comment_verifier.check(inspect.getdoc(doxygen_basic_translate.function5), diff --git a/Examples/test-suite/python/doxygen_basic_translate_style2_runme.py b/Examples/test-suite/python/doxygen_basic_translate_style2_runme.py index 2d62eecbd..b75045d59 100644 --- a/Examples/test-suite/python/doxygen_basic_translate_style2_runme.py +++ b/Examples/test-suite/python/doxygen_basic_translate_style2_runme.py @@ -48,6 +48,8 @@ Warning: This may not work as expected .. code-block:: c++ int main() { while(true); } + + // Test blank line in code block }""" ) comment_verifier.check(inspect.getdoc(doxygen_basic_translate_style2.function5), diff --git a/Source/Doxygen/doxyparser.cxx b/Source/Doxygen/doxyparser.cxx index 3f413bcaa..2e826b265 100644 --- a/Source/Doxygen/doxyparser.cxx +++ b/Source/Doxygen/doxyparser.cxx @@ -289,6 +289,18 @@ DoxygenParser::TokenListCIt DoxygenParser::getEndOfParagraph(const TokenList &to TokenListCIt endOfParagraph = m_tokenListIt; while (endOfParagraph != tokList.end()) { + // If \code or \verbatim is encountered within a paragraph, then + // go all the way to the end of that command, since the content + // could contain empty lines that would appear to be paragraph + // ends: + if (endOfParagraph->m_tokenType == COMMAND && + (endOfParagraph->m_tokenString == "code" || + endOfParagraph->m_tokenString == "verbatim")) { + const string theCommand = endOfParagraph->m_tokenString; + endOfParagraph = getEndCommand("end" + theCommand, tokList); + endOfParagraph++; // Move after the end command + return endOfParagraph; + } if (endOfParagraph->m_tokenType == END_LINE) { endOfParagraph++; if (endOfParagraph != tokList.end() @@ -959,7 +971,9 @@ DoxygenEntityList DoxygenParser::parse(TokenListCIt endParsingIndex, const Token std::string currPlainstringCommandType = root ? "partofdescription" : "plainstd::string"; DoxygenEntityList aNewList; - while (m_tokenListIt != endParsingIndex) { + // Less than check (instead of not equal) is a safeguard in case the + // iterator is incremented past the end + while (m_tokenListIt < endParsingIndex) { Token currToken = *m_tokenListIt; @@ -976,6 +990,10 @@ DoxygenEntityList DoxygenParser::parse(TokenListCIt endParsingIndex, const Token addCommand(currPlainstringCommandType, tokList, aNewList); } + // If addCommand above misbehaves, it can move the iterator past endParsingIndex + if (m_tokenListIt > endParsingIndex) + printListError(WARN_DOXYGEN_UNEXPECTED_ITERATOR_VALUE, "Unexpected iterator value in DoxygenParser::parse"); + if (endParsingIndex != tokList.end() && m_tokenListIt == tokList.end()) { // this could happen if we can't reach the original endParsingIndex printListError(WARN_DOXYGEN_UNEXPECTED_END_OF_COMMENT, "Unexpected end of Doxygen comment encountered."); diff --git a/Source/Include/swigwarn.h b/Source/Include/swigwarn.h index fbcea4dbd..a08693ac8 100644 --- a/Source/Include/swigwarn.h +++ b/Source/Include/swigwarn.h @@ -221,6 +221,7 @@ #define WARN_DOXYGEN_HTML_ERROR 563 #define WARN_DOXYGEN_COMMAND_ERROR 564 #define WARN_DOXYGEN_UNKNOWN_CHARACTER 565 +#define WARN_DOXYGEN_UNEXPECTED_ITERATOR_VALUE 566 /* -- Reserved (600-799) -- */ |