https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119179

--- Comment #2 from Giuseppe D'Angelo <dangelog at gmail dot com> ---
For instance something like this:

class VLA
{
private:
    static constexpr int DEFAULT_CAP = 256;
    int m_size = 0;
    int m_capacity = DEFAULT_CAP;

    int m_data[DEFAULT_CAP]; // uninit; just storage
    int *m_ptr = m_data; // points to the heap if exceeds local capacity

public:
    VLA() = default;
    ~VLA() {
        if (m_ptr != m_data)
            delete[] m_ptr; // e.g. like this
    }
    void push_back(int);
    // ...
};


which is basically a "std::vector<int> with SBO", found in many variations in
many codebases. Using this class causes the stack to be filled with 0xFE
https://gcc.godbolt.org/z/Mhvvv5eKo . 

But the point of using a VLA class is to be performant, and the internal
invariants shouldn't cause anything unsafe to be read, so the filling sounds
counter-productive. I don't want to find every usage of VLA in a codebase and
add [[uninitialized]] to it, I'd rather add it to the class itself or to the
member I want to keep NOT filled.

By the way: while reducing this example, I've noted that if one uses `VLA()
{}`, then the byte-filling gets disabled. Is it intended? It's not exactly
discussed
https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#index-ftrivial-auto-var-init
, and I guess could be an acceptable workaround.

Reply via email to