如何用memset正确置零字节?23字节置零异常问题求解
正确置零uint256_t前23字节的解决方案
问题根源分析
你遇到的结果不符合预期,核心有两个问题:
memset的操作对象可以更明确,避免union内存布局带来的误解;secp256k1_scalar_set_b32的调用存在越界访问——你传递的x.i8 + 12仅能提供20字节有效数据,但该函数需要读取完整的32字节数组,导致后续12字节是栈上的随机值,最终打印的标量包含了这些无效数据,让你误以为memset未正确执行。
修正代码方案
1. 正确置零前23字节
推荐直接操作union的i8数组,逻辑更清晰,两种方式任选:
方式一:使用memset(简洁高效)
static uint256_t rand256_and_mask(struct seed *seed) { uint256_t r = rand256(seed); // 直接对字节数组操作,明确置零前23字节 memset(r.i8, 0, 23); return r; }
方式二:循环置零(避免编译器优化歧义)
static uint256_t rand256_and_mask(struct seed *seed) { uint256_t r = rand256(seed); for (size_t i = 0; i < 23; ++i) { r.i8[i] = 0; } return r; }
2. 修正secp256k1_scalar_set_b32的越界问题
如果你需要用x的最后9字节作为标量,直接传递x.i8即可——前23字节已被置零,函数读取的32字节中仅最后9字节是有效随机数据,不会触发溢出:
secp256k1_scalar_set_b32(&priv_offsets[j][i], x.i8, &overflow);
内容的提问来源于stack exchange,提问作者BsMthethwa
相关产品推荐
相关产品推荐

