奇怪的行为(带有 swscanf 的未命名命名空间)

问题描述 投票:0回答:1

我有下一个实验代码。该代码因标记行上的分段错误而失败。

如果我从匿名命名空间中取出 str2MxfKey 函数或为命名空间指定一些名称,代码将运行没有任何问题。

这种奇怪的行为仅在发布版本中重现。有人可以向我解释该问题的根本原因吗?

Ubuntu 22.04、cmake 3.22.1、gcc 11.3.0

struct mxfKey
{
    uint8_t octet0;
    uint8_t octet1;
    uint8_t octet2;
    uint8_t octet3;
    uint8_t octet4;
    uint8_t octet5;
    uint8_t octet6;
    uint8_t octet7;
    uint8_t octet8;
    uint8_t octet9;
    uint8_t octet10;
    uint8_t octet11;
    uint8_t octet12;
    uint8_t octet13;
    uint8_t octet14;
    uint8_t octet15;
};

namespace {
    mxfKey str2MxfKey(const std::wstring &str) {
        mxfKey k;

        int rc = swscanf(str.c_str(),
                         L"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", // mxfkey
                         &k.octet0, &k.octet1, &k.octet2, &k.octet3,
                         &k.octet4, &k.octet5, &k.octet6, &k.octet7,
                         &k.octet8, &k.octet9, &k.octet10, &k.octet11,
                         &k.octet12, &k.octet13, &k.octet14, &k.octet15);
        if (rc != 16) {
            throw std::runtime_error("Error in str2MxfKey");
        }
        return k;
    }
}

void someExperiments() {
    std::wstring wstr = L"8c2197ad00e9476b8213b367123e506e";

    std::wcout << "Start" << std::endl;
    str2MxfKey(wstr);
    std::wcout << wstr << std::endl; // <----  Segmentation fault (core dumped)
    std::wcout << "End" << std::endl;
}

int main(int argc, char* argv[]) {
    someExperiments();
    ...
}
c++ gcc scanf wstring unnamed-namespace
1个回答
2
投票

swscanf 格式字符串错误。 %02x 需要一个 unsigned int 而不是 uint8_t。

试试这个:

    int rc = swscanf(str.c_str(),
        L"%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx%02hhx", // mxfkey
        &k.octet0, &k.octet1, &k.octet2, &k.octet3,
        &k.octet4, &k.octet5, &k.octet6, &k.octet7,
        &k.octet8, &k.octet9, &k.octet10, &k.octet11,
        &k.octet12, &k.octet13, &k.octet14, &k.octet15);
© www.soinside.com 2019 - 2024. All rights reserved.