apiaryio / drafter

API Blueprint Parser (C++)
https://apiblueprint.org/
MIT License
301 stars 54 forks source link

API Blueprint causes Drafter to abort #713

Closed kylef closed 5 years ago

kylef commented 5 years ago

The following API Blueprint causes Drafter to abort:

# My API

## Data Structures

### MyObject

+ key: `` (require)

## GET /{?a&b}

+ Response 200 (application/json)
    + Attributes (MyObject)

There are three interesting points here and if you remove any one of them the document parses:

Full stack trace:

(lldb) bt
* thread #1, queue = 'com.apple.main-thread', stop reason = signal SIGABRT
  * frame #0: 0x00007fff6c24b2c6 libsystem_kernel.dylib`__pthread_kill + 10
    frame #1: 0x00007fff6c306bf1 libsystem_pthread.dylib`pthread_kill + 284
    frame #2: 0x00007fff6c1b56a6 libsystem_c.dylib`abort + 127
    frame #3: 0x0000000100120f29 drafter`void (anonymous namespace)::renderProperty<refract::Element<refract::dsd::String> >((null)=0x00007ffeefbfcbf0, element=0x0000000101805750, (null)=size=2) at JsonValue.cc:96:9
    frame #4: 0x0000000100120e7f drafter`void (anonymous namespace)::RenderPropertyVisitor::operator(this=0x00007ffeefbfca50, el=0x0000000101805750)<refract::Element<refract::dsd::String> >(refract::Element<refract::dsd::String> const&) at JsonValue.cc:379:13
    frame #5: 0x000000010012092c drafter`refract::impl::state_functor<(anonymous namespace)::RenderPropertyVisitor, void, false>::operator(this=0x00007ffeefbfca48, e=0x0000000101805750)(refract::Element<refract::dsd::String> const&) at Utils.h:199:17
    frame #6: 0x000000010002590e drafter`refract::Element<refract::dsd::String>::visit(this=0x0000000101805750, v=0x00007ffeefbfca48) const at Element.h:129:13
    frame #7: 0x0000000100120795 drafter`void refract::visit<(anonymous namespace)::RenderPropertyVisitor, (anonymous namespace)::RenderPropertyVisitor&, void, void>(ifc=0x0000000101805750, f=0x00007ffeefbfcaa8)::RenderPropertyVisitor&&) at Utils.h:253:13
    frame #8: 0x0000000100120694 drafter`(anonymous namespace)::renderProperty(value=0x00007ffeefbfcbf0, element=0x0000000101805750, options=size=2) at JsonValue.cc:386:9
    frame #9: 0x00000001001203ce drafter`(anonymous namespace)::renderValueSpecific(element=0x00000001018054b0, options=size=2) at JsonValue.cc:223:17
    frame #10: 0x000000010012014f drafter`mpark::variant<drafter::utils::so::Null, drafter::utils::so::True, drafter::utils::so::False, drafter::utils::so::String, drafter::utils::so::Number, drafter::utils::so::Object, drafter::utils::so::Array> (anonymous namespace)::RenderValueVisitor::operator(this=0x00007ffeefbfcd18, el=0x00000001018054b0)<refract::Element<refract::dsd::Object> >(refract::Element<refract::dsd::Object> const&) const at JsonValue.cc:131:20
    frame #11: 0x000000010011762a drafter`refract::impl::state_functor<(anonymous namespace)::RenderValueVisitor, mpark::variant<drafter::utils::so::Null, drafter::utils::so::True, drafter::utils::so::False, drafter::utils::so::String, drafter::utils::so::Number, drafter::utils::so::Object, drafter::utils::so::Array>, false>::operator(this=0x00007ffeefbfcd10, e=0x00000001018054b0)(refract::Element<refract::dsd::Object> const&) at Utils.h:89:26
    frame #12: 0x000000010004b30e drafter`refract::Element<refract::dsd::Object>::visit(this=0x00000001018054b0, v=0x00007ffeefbfcd10) const at Element.h:129:13
    frame #13: 0x0000000100116a06 drafter`mpark::variant<drafter::utils::so::Null, drafter::utils::so::True, drafter::utils::so::False, drafter::utils::so::String, drafter::utils::so::Number, drafter::utils::so::Object, drafter::utils::so::Array> refract::visit<(anonymous namespace)::RenderValueVisitor, (ifc=0x00000001018054b0, f=0x00007ffeefbfcd98)::RenderValueVisitor&, mpark::variant<drafter::utils::so::Null, drafter::utils::so::True, drafter::utils::so::False, drafter::utils::so::String, drafter::utils::so::Number, drafter::utils::so::Object, drafter::utils::so::Array>, void, void>(refract::IElement const&, (anonymous namespace)::RenderValueVisitor&&) at Utils.h:268:13
    frame #14: 0x0000000100116887 drafter`(anonymous namespace)::renderValue(element=0x00000001018054b0, options=size=2) at JsonValue.cc:138:16
    frame #15: 0x0000000100123778 drafter`(anonymous namespace)::renderValueSpecific(element=0x0000000101804e70, options=size=2) at JsonValue.cc:285:16
    frame #16: 0x00000001001236af drafter`mpark::variant<drafter::utils::so::Null, drafter::utils::so::True, drafter::utils::so::False, drafter::utils::so::String, drafter::utils::so::Number, drafter::utils::so::Object, drafter::utils::so::Array> (anonymous namespace)::RenderValueVisitor::operator(this=0x00007ffeefbfcf48, el=0x0000000101804e70)<refract::Element<refract::dsd::Extend> >(refract::Element<refract::dsd::Extend> const&) const at JsonValue.cc:131:20
    frame #17: 0x000000010011770a drafter`refract::impl::state_functor<(anonymous namespace)::RenderValueVisitor, mpark::variant<drafter::utils::so::Null, drafter::utils::so::True, drafter::utils::so::False, drafter::utils::so::String, drafter::utils::so::Number, drafter::utils::so::Object, drafter::utils::so::Array>, false>::operator(this=0x00007ffeefbfcf40, e=0x0000000101804e70)(refract::Element<refract::dsd::Extend> const&) at Utils.h:97:26
    frame #18: 0x00000001000f04be drafter`refract::Element<refract::dsd::Extend>::visit(this=0x0000000101804e70, v=0x00007ffeefbfcf40) const at Element.h:129:13
    frame #19: 0x0000000100116a06 drafter`mpark::variant<drafter::utils::so::Null, drafter::utils::so::True, drafter::utils::so::False, drafter::utils::so::String, drafter::utils::so::Number, drafter::utils::so::Object, drafter::utils::so::Array> refract::visit<(anonymous namespace)::RenderValueVisitor, (ifc=0x0000000101804e70, f=0x00007ffeefbfcfc8)::RenderValueVisitor&, mpark::variant<drafter::utils::so::Null, drafter::utils::so::True, drafter::utils::so::False, drafter::utils::so::String, drafter::utils::so::Number, drafter::utils::so::Object, drafter::utils::so::Array>, void, void>(refract::IElement const&, (anonymous namespace)::RenderValueVisitor&&) at Utils.h:268:13
    frame #20: 0x0000000100116887 drafter`(anonymous namespace)::renderValue(element=0x0000000101804e70, options=size=2) at JsonValue.cc:138:16
    frame #21: 0x00000001001215b2 drafter`(anonymous namespace)::renderProperty(obj=0x00007ffeefbfd370, element=0x0000000101805de0, options=size=2) at JsonValue.cc:317:41
    frame #22: 0x00000001001213cf drafter`void (anonymous namespace)::RenderPropertyVisitor::operator(this=0x00007ffeefbfd1d0, el=0x0000000101805de0)<refract::Element<refract::dsd::Member> >(refract::Element<refract::dsd::Member> const&) at JsonValue.cc:379:13
    frame #23: 0x0000000100120a6c drafter`refract::impl::state_functor<(anonymous namespace)::RenderPropertyVisitor, void, false>::operator(this=0x00007ffeefbfd1c8, e=0x0000000101805de0)(refract::Element<refract::dsd::Member> const&) at Utils.h:219:17
    frame #24: 0x000000010004553e drafter`refract::Element<refract::dsd::Member>::visit(this=0x0000000101805de0, v=0x00007ffeefbfd1c8) const at Element.h:129:13
    frame #25: 0x0000000100120795 drafter`void refract::visit<(anonymous namespace)::RenderPropertyVisitor, (anonymous namespace)::RenderPropertyVisitor&, void, void>(ifc=0x0000000101805de0, f=0x00007ffeefbfd228)::RenderPropertyVisitor&&) at Utils.h:253:13
    frame #26: 0x0000000100120694 drafter`(anonymous namespace)::renderProperty(value=0x00007ffeefbfd370, element=0x0000000101805de0, options=size=2) at JsonValue.cc:386:9
    frame #27: 0x00000001001203ce drafter`(anonymous namespace)::renderValueSpecific(element=0x0000000101804d90, options=size=2) at JsonValue.cc:223:17
    frame #28: 0x000000010012014f drafter`mpark::variant<drafter::utils::so::Null, drafter::utils::so::True, drafter::utils::so::False, drafter::utils::so::String, drafter::utils::so::Number, drafter::utils::so::Object, drafter::utils::so::Array> (anonymous namespace)::RenderValueVisitor::operator(this=0x00007ffeefbfd498, el=0x0000000101804d90)<refract::Element<refract::dsd::Object> >(refract::Element<refract::dsd::Object> const&) const at JsonValue.cc:131:20
    frame #29: 0x000000010011762a drafter`refract::impl::state_functor<(anonymous namespace)::RenderValueVisitor, mpark::variant<drafter::utils::so::Null, drafter::utils::so::True, drafter::utils::so::False, drafter::utils::so::String, drafter::utils::so::Number, drafter::utils::so::Object, drafter::utils::so::Array>, false>::operator(this=0x00007ffeefbfd490, e=0x0000000101804d90)(refract::Element<refract::dsd::Object> const&) at Utils.h:89:26
    frame #30: 0x000000010004b30e drafter`refract::Element<refract::dsd::Object>::visit(this=0x0000000101804d90, v=0x00007ffeefbfd490) const at Element.h:129:13
    frame #31: 0x0000000100116a06 drafter`mpark::variant<drafter::utils::so::Null, drafter::utils::so::True, drafter::utils::so::False, drafter::utils::so::String, drafter::utils::so::Number, drafter::utils::so::Object, drafter::utils::so::Array> refract::visit<(anonymous namespace)::RenderValueVisitor, (ifc=0x0000000101804d90, f=0x00007ffeefbfd518)::RenderValueVisitor&, mpark::variant<drafter::utils::so::Null, drafter::utils::so::True, drafter::utils::so::False, drafter::utils::so::String, drafter::utils::so::Number, drafter::utils::so::Object, drafter::utils::so::Array>, void, void>(refract::IElement const&, (anonymous namespace)::RenderValueVisitor&&) at Utils.h:268:13
    frame #32: 0x0000000100116887 drafter`(anonymous namespace)::renderValue(element=0x0000000101804d90, options=size=2) at JsonValue.cc:138:16
    frame #33: 0x0000000100123778 drafter`(anonymous namespace)::renderValueSpecific(element=0x0000000101805ab0, options=size=2) at JsonValue.cc:285:16
    frame #34: 0x00000001001236af drafter`mpark::variant<drafter::utils::so::Null, drafter::utils::so::True, drafter::utils::so::False, drafter::utils::so::String, drafter::utils::so::Number, drafter::utils::so::Object, drafter::utils::so::Array> (anonymous namespace)::RenderValueVisitor::operator(this=0x00007ffeefbfd6c8, el=0x0000000101805ab0)<refract::Element<refract::dsd::Extend> >(refract::Element<refract::dsd::Extend> const&) const at JsonValue.cc:131:20
    frame #35: 0x000000010011770a drafter`refract::impl::state_functor<(anonymous namespace)::RenderValueVisitor, mpark::variant<drafter::utils::so::Null, drafter::utils::so::True, drafter::utils::so::False, drafter::utils::so::String, drafter::utils::so::Number, drafter::utils::so::Object, drafter::utils::so::Array>, false>::operator(this=0x00007ffeefbfd6c0, e=0x0000000101805ab0)(refract::Element<refract::dsd::Extend> const&) at Utils.h:97:26
    frame #36: 0x00000001000f04be drafter`refract::Element<refract::dsd::Extend>::visit(this=0x0000000101805ab0, v=0x00007ffeefbfd6c0) const at Element.h:129:13
    frame #37: 0x0000000100116a06 drafter`mpark::variant<drafter::utils::so::Null, drafter::utils::so::True, drafter::utils::so::False, drafter::utils::so::String, drafter::utils::so::Number, drafter::utils::so::Object, drafter::utils::so::Array> refract::visit<(anonymous namespace)::RenderValueVisitor, (ifc=0x0000000101805ab0, f=0x00007ffeefbfd748)::RenderValueVisitor&, mpark::variant<drafter::utils::so::Null, drafter::utils::so::True, drafter::utils::so::False, drafter::utils::so::String, drafter::utils::so::Number, drafter::utils::so::Object, drafter::utils::so::Array>, void, void>(refract::IElement const&, (anonymous namespace)::RenderValueVisitor&&) at Utils.h:268:13
    frame #38: 0x0000000100116887 drafter`(anonymous namespace)::renderValue(element=0x0000000101805ab0, options=size=2) at JsonValue.cc:138:16
    frame #39: 0x000000010011679c drafter`refract::generateJsonValue(el=0x0000000101805ab0) at JsonValue.cc:144:12
    frame #40: 0x000000010003da6f drafter`(anonymous namespace)::renderPayloadBody(payload=0x0000000101803360, format=JSONRenderFormat, expanded=0x0000000101805ab0) at RefractAPI.cc:108:60
    frame #41: 0x000000010003cfd8 drafter`PayloadToRefract(payload=0x0000000101803360, action=0x00007ffeefbfdf70, context=0x00007ffeefbfec98) at RefractAPI.cc:377:31
    frame #42: 0x000000010003e1d6 drafter`TransactionToRefract(transaction=0x0000000101803340, action=0x0000000101800ea0, request=0x00007ffeefbfe1d8, response=0x0000000101803360, context=0x00007ffeefbfec98) at RefractAPI.cc:433:23
    frame #43: 0x000000010003ea41 drafter`ActionToRefract(action=0x0000000101800ea0, context=0x00007ffeefbfec98) at RefractAPI.cc:486:21
    frame #44: 0x000000010005a593 drafter`void (anonymous namespace)::NodeInfoToElements<std::__1::vector<snowcrash::Action, std::__1::allocator<snowcrash::Action> >, refract::dsd::Array, std::__1::unique_ptr<refract::Element<refract::dsd::Array>, std::__1::default_delete<refract::Element<refract::dsd::Array> > > (this=0x00007ffeefbfe410, nodeInfo=0x0000000101800ea0)>(drafter::NodeInfo<std::__1::vector<snowcrash::Action, std::__1::allocator<snowcrash::Action> > > const&, std::__1::unique_ptr<refract::Element<refract::dsd::Array>, std::__1::default_delete<refract::Element<refract::dsd::Array> > >  const(&)(drafter::NodeInfo<snowcrash::Action> const&, drafter::ConversionContext&), refract::dsd::Array&, drafter::ConversionContext&)::'lambda'(drafter::NodeInfo<snowcrash::Action> const&)::operator()(drafter::NodeInfo<snowcrash::Action> const&) const at RefractAPI.cc:68:24
    frame #45: 0x0000000100058346 drafter`refract::dsd::Array std::__1::transform<std::__1::__wrap_iter<drafter::NodeInfo<snowcrash::Action>*>, std::__1::back_insert_iterator<refract::dsd::Array>, void (anonymous namespace)::NodeInfoToElements<std::__1::vector<snowcrash::Action, std::__1::allocator<snowcrash::Action> >, refract::dsd::Array, std::__1::unique_ptr<refract::Element<refract::dsd::Array>, std::__1::default_delete<refract::Element<refract::dsd::Array> > > (drafter::NodeInfo<snowcrash::Action> const&, drafter::ConversionContext&)>(drafter::NodeInfo<std::__1::vector<snowcrash::Action, std::__1::allocator<snowcrash::Action> > > const&, std::__1::unique_ptr<refract::Element<refract::dsd::Array>, std::__1::default_delete<refract::Element<refract::dsd::Array> > >  const(&)(drafter::NodeInfo<snowcrash::Action> const&, drafter::ConversionContext&), refract::dsd::Array&, drafter::ConversionContext&)::'lambda'(drafter::NodeInfo<snowcrash::Action> const&)>(__first=__wrap_iter<drafter::NodeInfo<snowcrash::Action> *> @ 0x00007ffeefbfe430, __last=__wrap_iter<drafter::NodeInfo<snowcrash::Action> *> @ 0x00007ffeefbfe428, __result=back_insert_iterator<refract::dsd::Array> @ 0x00007ffeefbfe420, __op=(anonymous class) @ 0x00007ffeefbfe410)) at algorithm:1963:21
    frame #46: 0x000000010003f822 drafter`void (anonymous namespace)::NodeInfoToElements<std::__1::vector<snowcrash::Action, std::__1::allocator<snowcrash::Action> >, refract::dsd::Array, std::__1::unique_ptr<refract::Element<refract::dsd::Array>, std::__1::default_delete<refract::Element<refract::dsd::Array> > > (nodeInfo=0x00007ffeefbfe568, transformFunctor=0x000000010003e2a0, content=0x0000000101801f50, context=0x00007ffeefbfec98)>(drafter::NodeInfo<std::__1::vector<snowcrash::Action, std::__1::allocator<snowcrash::Action> > > const&, std::__1::unique_ptr<refract::Element<refract::dsd::Array>, std::__1::default_delete<refract::Element<refract::dsd::Array> > >  const(&)(drafter::NodeInfo<snowcrash::Action> const&, drafter::ConversionContext&), refract::dsd::Array&, drafter::ConversionContext&) at RefractAPI.cc:64:9
    frame #47: 0x000000010003f72e drafter`ResourceToRefract(resource=0x00007ffeefbfe720, context=0x00007ffeefbfec98) at RefractAPI.cc:538:5
    frame #48: 0x000000010003ff6d drafter`ElementToRefract(element=0x00000001018010d8, context=0x00007ffeefbfec98) at RefractAPI.cc:585:20
    frame #49: 0x000000010005ce53 drafter`void (anonymous namespace)::NodeInfoToElements<std::__1::vector<snowcrash::Element, std::__1::allocator<snowcrash::Element> >, refract::dsd::Array, std::__1::unique_ptr<refract::IElement, std::__1::default_delete<refract::IElement> > (this=0x00007ffeefbfe7d0, nodeInfo=0x00000001018010d8)>(drafter::NodeInfo<std::__1::vector<snowcrash::Element, std::__1::allocator<snowcrash::Element> > > const&, std::__1::unique_ptr<refract::IElement, std::__1::default_delete<refract::IElement> >  const(&)(drafter::NodeInfo<snowcrash::Element> const&, drafter::ConversionContext&), refract::dsd::Array&, drafter::ConversionContext&)::'lambda'(drafter::NodeInfo<snowcrash::Element> const&)::operator()(drafter::NodeInfo<snowcrash::Element> const&) const at RefractAPI.cc:68:24
    frame #50: 0x000000010005ab6f drafter`refract::dsd::Array std::__1::transform<std::__1::__wrap_iter<drafter::NodeInfo<snowcrash::Element>*>, std::__1::back_insert_iterator<refract::dsd::Array>, void (anonymous namespace)::NodeInfoToElements<std::__1::vector<snowcrash::Element, std::__1::allocator<snowcrash::Element> >, refract::dsd::Array, std::__1::unique_ptr<refract::IElement, std::__1::default_delete<refract::IElement> > (drafter::NodeInfo<snowcrash::Element> const&, drafter::ConversionContext&)>(drafter::NodeInfo<std::__1::vector<snowcrash::Element, std::__1::allocator<snowcrash::Element> > > const&, std::__1::unique_ptr<refract::IElement, std::__1::default_delete<refract::IElement> >  const(&)(drafter::NodeInfo<snowcrash::Element> const&, drafter::ConversionContext&), refract::dsd::Array&, drafter::ConversionContext&)::'lambda'(drafter::NodeInfo<snowcrash::Element> const&)>(__first=__wrap_iter<drafter::NodeInfo<snowcrash::Element> *> @ 0x00007ffeefbfe7f0, __last=__wrap_iter<drafter::NodeInfo<snowcrash::Element> *> @ 0x00007ffeefbfe7e8, __result=back_insert_iterator<refract::dsd::Array> @ 0x00007ffeefbfe7e0, __op=(anonymous class) @ 0x00007ffeefbfe7d0)) at algorithm:1963:21
    frame #51: 0x000000010003fe82 drafter`void (anonymous namespace)::NodeInfoToElements<std::__1::vector<snowcrash::Element, std::__1::allocator<snowcrash::Element> >, refract::dsd::Array, std::__1::unique_ptr<refract::IElement, std::__1::default_delete<refract::IElement> > (nodeInfo=0x00007ffeefbfe940, transformFunctor=0x000000010003fed0, content=0x0000000101800d40, context=0x00007ffeefbfec98)>(drafter::NodeInfo<std::__1::vector<snowcrash::Element, std::__1::allocator<snowcrash::Element> > > const&, std::__1::unique_ptr<refract::IElement, std::__1::default_delete<refract::IElement> >  const(&)(drafter::NodeInfo<snowcrash::Element> const&, drafter::ConversionContext&), refract::dsd::Array&, drafter::ConversionContext&) at RefractAPI.cc:64:9
    frame #52: 0x000000010004062f drafter`drafter::BlueprintToRefract(blueprint=0x00007ffeefbfebd0, context=0x00007ffeefbfec98) at RefractAPI.cc:621:5
    frame #53: 0x0000000100035845 drafter`drafter::WrapRefract(blueprint=0x00007ffeefbfed88, context=0x00007ffeefbfec98) at SerializeResult.cc:55:32
    frame #54: 0x00000001000276b0 drafter`::drafter_parse_blueprint(source="# My API\n\n## Data Structures\n\n### MyObject\n\n+ key: `` (require)\n\n## GET /{?a&b}\n\n+ Response 200 (application/json)\n    + Attributes (MyObject)\n\n", out=0x00007ffeefbff588, parse_opts=(requireBlueprintName = false)) at drafter.cc:89:19
    frame #55: 0x000000010000181e drafter`ProcessRefract(config=0x00007ffeefbff738, in=0x00007ffeefbff720, out=0x00007ffeefbff718) at main.cc:43:15
    frame #56: 0x0000000100002036 drafter`main(argc=2, argv=0x00007ffeefbff7b8) at main.cc:74:12
    frame #57: 0x00000001000016f4 drafter`start + 52