constexpr在编译时不求值

时间:2020-06-27 14:41:29

标签: c++

我正在尝试在编译时对字符串进行加密,但是该字符串似乎仍然存在于可执行文件的数据中。

我禁用了所有优化,但是仍然存在

class str {
public:
    template<unsigned int Size>
    constexpr str(wchar_t(&String)[Size], wchar_t KeyCharacter)
        : m_Buffer{}, m_Key{}, m_Size{} {
        this->m_Size = Size;
        this->m_Key = KeyCharacter;
        this->SetString(String);
    }
    ~str() {

    }
    template<unsigned int Size>
    constexpr void SetString(wchar_t(&String)[Size]) {
        for(unsigned int i{}; i < this->m_Size; ++i) {
            this->m_Buffer[i] = String[i] ^ this->m_Key;
            String[i] = L'\0';
        }
        this->m_Buffer[this->m_Size] = L'\0';
    }
    constexpr wchar_t* GetString() {
        return this->m_Buffer;
    }
    wchar_t m_Buffer[250];
    wchar_t m_Key;
    unsigned int m_Size;
};

int main() {
    wchar_t unstr[] = { L"Hello, world!" };
    str s(unstr, L'a');
    getchar();
    return 0;
}

顺便说一句,该代码不会评估为memcpy调用,这只是伪代码的解释

pseudocode

如您所见,hello world文本仍然存在,但是在SetString函数中将其清空。它在运行时为空,但仍显示在二进制文件中。

这是怎么回事?为什么琴弦还在那里?我该如何解决?

0 个答案:

没有答案