当 StringSink 使用的 String 超出范围时程序崩溃

问题描述

今天我开始尝试 Cryptopp 库。 我从文档 here 中举了一个例子。

程序崩溃了,我似乎无法弄清楚原因。

我的代码

#include <cryptopp/dll.h>
#include <cryptopp/hex.h>
#include <string>

int main(int argc,const char* argv[]) {

    std::cout << "START OF PROGRAM" << std::endl;

    {
        std::string encoded;
        CryptoPP::byte decoded[] = { 0xFF,0xEE,0xDD,0xCC,0xBB,0xAA,0x99,0x88,0x77,0x66,0x55,0x44,0x33,0x22,0x11,0x00 };

        //Method 1
        CryptoPP::HexEncoder encoder2;
        encoder2.Attach(new CryptoPP::StringSink(encoded));
        encoder2.Put(decoded,sizeof(decoded));
        encoder2.MessageEnd();

        //Method 2
        //CryptoPP::StringSource ss(decoded,sizeof(decoded),true,new CryptoPP::HexEncoder(new CryptoPP::StringSink(encoded)));

        std::cout << "Encoded: ";
        std::cout << encoded;
        std::cout << std::endl;
    }

    std::cout << "END OF PROGRAM" << std::endl;
}

输出为:

START OF PROGRAM
Encoded: FFeedDCCBBAA99887766554433221100

这意味着未达到 END OF PROGRAM,但 HexEncoder 已按预期完成其工作。一旦我的 std::string encoded; 超出范围,程序就会崩溃。如果我将 std::string encoded; 移动到外部作用域(int main(...) 的作用域),则打印 END OF PROGRAM 并且程序在 main 结束时崩溃。

此外,如果我不调用 encoder2.Put(...),程序不会崩溃,但显然 HexEncoder 也不会执行任何操作。使用方法 2 而不是方法 1 会导致相同的错误

我得到的错误是:

HEAP[app.exe]: Invalid address specified to RtlValidateHeap( 000001CE84480000,000001CE84761390 )

关于我的环境:

我使用 Microsoft Visual Studio 2019。我使用了 cryptopp 源代码中的 VS-solution 来使用 DLL-Import Debug 构建配置构建库。我对配置所做的更改是:

  • 我不得不将运行时库设置从 /MTd 更改为 /MDd(因为我正在处理并希望在其中使用 cryptopp 的较大程序正在使用 /MDd) .

  • 我还删除CRYPTOPP_ENABLE_COMPLIANCE_WITH_FIPS_140_2=1 预处理器定义,因为它引起了问题(我认为是因为 在 Visual Studio 调试器中运行我的程序)。目前我不关心 FIPS 合规性。

其他详情

一个涉及采用 FileSinkstringstream 的示例确实按预期工作,没有我上面描述的问题:

std::stringstream encoded;
CryptoPP::HexEncoder encoder2(new CryptoPP::FileSink(encoded));
encoder2.Put(decoded,sizeof(decoded));
encoder2.MessageEnd();
std::cout << encoded.str();

我进行的一些涉及对称 Salsa20 加密和解密的测试(来自 here 的示例)也正常运行(构建和运行)。

问题

有人可以解释哪里出了问题,我该如何修复它,或者它是库中的错误还是我的构建过程中的错误

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)