From 2f394e84881ba663f1747a66891f994a54e5fdd4 Mon Sep 17 00:00:00 2001 From: Andreas Stöckel Date: Sun, 15 Mar 2015 13:06:25 +0100 Subject: Fix crash when an undefined annotation is met in the input --- src/core/parser/stack/Stack.cpp | 9 ++++++++- test/formats/osml/OsmlParserTest.cpp | 13 +++++++++++++ testdata/osmlparser/undefined_annotation.osml | 13 +++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 testdata/osmlparser/undefined_annotation.osml diff --git a/src/core/parser/stack/Stack.cpp b/src/core/parser/stack/Stack.cpp index 436d3a5..90735df 100644 --- a/src/core/parser/stack/Stack.cpp +++ b/src/core/parser/stack/Stack.cpp @@ -869,8 +869,15 @@ void StackImpl::handleAnnotationStartEnd(const Variant &name, // Call the startAnnotation method of the newly created handler, store the // valid flag HandlerInfo &info = currentInfo(); - info.valid = handler->startAnnotation(args); + info.valid = false; + try { + info.valid = handler->startAnnotation(args); + } catch (LoggableException ex) { + logger().log(ex); + } info.range = range; + + // End the handler directly if this is an annotation end if (type == HandlerType::ANNOTATION_END) { endCurrentHandler(); } diff --git a/test/formats/osml/OsmlParserTest.cpp b/test/formats/osml/OsmlParserTest.cpp index 78ddf17..8dc0035 100644 --- a/test/formats/osml/OsmlParserTest.cpp +++ b/test/formats/osml/OsmlParserTest.cpp @@ -212,6 +212,19 @@ TEST(OsmlParser, simpleAnnotation) ASSERT_TRUE(node->isa(&RttiTypes::Document)); } +TEST(OsmlParser, undefinedAnnotation) +{ + OsmlStandaloneEnvironment env(logger); + logger.reset(); + + Rooted node = + env.parse("undefined_annotation.osml", "", "", RttiSet{&RttiTypes::Node}); + ASSERT_TRUE(logger.hasError()); + + ASSERT_TRUE(node != nullptr); + ASSERT_TRUE(node->isa(&RttiTypes::Document)); +} + TEST(OsmlParser, overlappingAnnotations) { OsmlStandaloneEnvironment env(logger); diff --git a/testdata/osmlparser/undefined_annotation.osml b/testdata/osmlparser/undefined_annotation.osml new file mode 100644 index 0000000..98d4dde --- /dev/null +++ b/testdata/osmlparser/undefined_annotation.osml @@ -0,0 +1,13 @@ +\document + +\ontology#test + \struct#book[root=true] + \field + \childRef[ref=text] + \struct#text[transparent=true] + \primitive[type=string] +% \annotation#emph + +\begin{book} + Test <\emph#em1 Aufklärung ist der <\emph#em2 Ausgang des\emph#em1> Menschen aus seiner selbstverschuldeten\emph#em2> Unmündigkeit. Unmündigkeit ist das Unvermögen, sich seines Verstandes ohne Leitung eines anderen zu bedienen. Selbstverschuldet ist diese Unmündigkeit, wenn die Ursache derselben nicht am Mangel des Verstandes, sondern der Entschließung und des Mutes liegt, sich seiner ohne Leitung eines andern zu bedienen. Sapere aude! Habe Mut, dich deines eigenen Verstandes zu bedienen! ist also der Wahlspruch der Aufklärung. +\end{book} -- cgit v1.2.3