我有下一个实验代码。该代码因标记行上的分段错误而失败。
如果我从匿名命名空间中取出 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();
...
}
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);