summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Stöckel <astoecke@techfak.uni-bielefeld.de>2015-03-15 13:06:25 +0100
committerAndreas Stöckel <astoecke@techfak.uni-bielefeld.de>2016-04-25 22:19:27 +0200
commit2f394e84881ba663f1747a66891f994a54e5fdd4 (patch)
treec6cf04c6616581f474236c2756785c5f9808a02f
parent45a0c86e35fd693cdfb40d8d3bcb251fe4b786b0 (diff)
Fix crash when an undefined annotation is met in the input
-rw-r--r--src/core/parser/stack/Stack.cpp9
-rw-r--r--test/formats/osml/OsmlParserTest.cpp13
-rw-r--r--testdata/osmlparser/undefined_annotation.osml13
3 files changed, 34 insertions, 1 deletions
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> 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}