C++函数返回时触发stack smashing detected错误求助
问题排查与修复
核心问题:非法指针触发栈溢出
你遇到的*** stack smashing detected ***错误,根源在主函数的调用参数错误:
derive_aes_key(999c3293c8ed1e8173cc9d6e84ed9476884670422517291995183336a7f9b0f6, 32, aes_key);
这里第一个参数直接写了十六进制字符串字面量,但C++会把它当成一个超大整数常量,而非unsigned char*类型的指针。这个整数被强转为指针后,指向的是非法内存地址,当derive_aes_key里的HMAC函数尝试读取该地址的32字节数据时,会越界访问栈内存,触发栈溢出检测机制。
次要语法问题
你的derive_aes_key函数中,HMAC调用语句末尾缺少分号:
HMAC(EVP_sha256(), shared_secret, shared_secret_len, NULL, 0, prk, &prk_len)
虽然你提到代码执行到了输出语句,可能编译时被忽略,但这属于语法错误,必须补上。
修复方案
1. 正确传递共享密钥
把十六进制字符串转换成unsigned char数组后再传递:
// 将十六进制字符串转为字节数组 unsigned char shared_secret[] = {0x99, 0x9c, 0x32, 0x93, 0xc8, 0xed, 0x1e, 0x81, 0x73, 0xcc, 0x9d, 0x6e, 0x84, 0xed, 0x94, 0x76, 0x88, 0x46, 0x70, 0x42, 0x25, 0x17, 0x29, 0x19, 0x95, 0x18, 0x33, 0x36, 0xa7, 0xf9, 0xb0, 0xf6}; unsigned char aes_key[AES_KEY_SIZE]; derive_aes_key(shared_secret, 32, aes_key);
也可以编写辅助函数自动将十六进制字符串转成字节数组,避免手动逐个输入字节。
2. 补全语法错误
给HMAC调用语句加上分号:
HMAC(EVP_sha256(), shared_secret, shared_secret_len, NULL, 0, prk, &prk_len);
3. 额外建议:添加错误检查
HMAC函数会返回非NULL表示执行成功,建议加上错误检查,避免后续逻辑基于错误的PRK执行:
if (!HMAC(EVP_sha256(), shared_secret, shared_secret_len, NULL, 0, prk, &prk_len)) { cerr << "HMAC密钥派生失败" << endl; return false; }
内容的提问来源于stack exchange,提问作者Alex Watson
相关产品推荐
相关产品推荐

