You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用memset正确置零字节?23字节置零异常问题求解

正确置零uint256_t前23字节的解决方案

问题根源分析

你遇到的结果不符合预期,核心有两个问题:

  1. memset的操作对象可以更明确,避免union内存布局带来的误解;
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 09:02:58