YAML Emitter using YAML::DoubleQuoted when emitted in a destructor of a staticly created struct/class

Open
#1,281 1 comment 0 reactions 0 assignees View on GitHub

@alex-thiessen-for-siemens is already working on this.

Since Sep 20, 2026.

  • #1500 by @alex-thiessen-for-siemens — open

Assessment

Difficulty
4/5
Estimated time
3-5 days
Newbie friendliness
35/100
Issue type
Bug
Clarity
Mostly clear
Activity status
Stale
Tech stack
cpp, yaml
Domain
backend

Research direction

Start with the issue’s example and inspect emitter.h, especially YAML::Emitter::Write(const std::string&) and its StringFormat::value regex check. Reproduce the output difference between the call in main() and the destructor, then trace why the regex match changes during static destruction. Done means both serializations emit the same unquoted YAML; the issue does not name a test file.

Written by the indexing model from the issue text.

Description

bug

What steps will reproduce the problem?

  1. Create a struct/class containing a destructor and a function to serialize an arbitrary type of data, with the destructor calling the serialization function.

  2. Create a static instance of that class and call the serilization function at least once.

What is the expected output? What do you see instead?
The expected output would be to see the serialized data, as many times as requested, beeing exactly the same, however, the last time the yaml string is printed, all keys, as well as all strings, are wrapped in double quotes.

Example

struct EmitterTest
{
    ~EmitterTest()
    {
        Serialize();
    }

    void Serialize()
    {
        YAML::Emitter out;

        out << YAML::BeginMap << YAML::Key << "Test";
        out << YAML::BeginMap;
        out << YAML::Key << "String1" << YAML::Value << "String1";
        out << YAML::Key << "String2" << YAML::Value << "String2";
        out << YAML::Key << "String3" << YAML::Value << "Foo";
        out << YAML::EndMap;
        out << YAML::EndMap;

        std::cout << out.c_str() << std::endl;
    }
}

static EmitterTest s_Test;

int main()
{
    s_Test.Serialize();
}

Expected output:

Test:
  String1: String1
  String2: String2
  String3: Foo
Test:
  String1: String1
  String2: String2
  String3: Foo

Actual output:

Test:
  String1: String1
  String2: String2
  String3: Foo
"Test":
  "String1": "String1"
  "String2": "String2"
  "String3": "Foo"

yaml-cpp version: 0.8.0

Additional Information
Note that this only happens when Serialize() is called once before destruction. Digging into the problem makes the problem pretty obvious: In emitter.h the function YAML::Emitter::Write(const std::string&) queries the StringFormat::value, by trying to match the string with a regex. This regex match returns false in the serialization called in the destructor, otherwise it returns true.

Dominant language
C++
Stars
6.1k
Forks
2.2k
Avg merge
22h 2m
Merged PRs (30d)
1

Getting set up

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from jbeder/yaml-cpp

All issues in jbeder/yaml-cpp

Similar issues

More C++ issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.