分享一个 变量没有初始化 可能带来的问题

先看 code:


static void do_ctors_aux(void)
{
    /* SGX RTS does not support .ctors currently */
   
    fp_t *p = NULL;
    uintptr_t init_array_addr;
    size_t init_array_size;
    const void *enclave_start = (const void*)&__ImageBase;

    elf_get_init_array(enclave_start, &init_array_addr, &init_array_size);
    
    if (init_array_addr == 0 || init_array_size == 0)
        return;

    fp_t *fp_start = (fp_t*)(init_array_addr + (uintptr_t)(enclave_start));
    fp_t *fp_end = fp_start + (init_array_size / sizeof(fp_t));
    
    /* traverse .init_array in forward order */
    for (p = fp_start; p < fp_end; p++)
    {
        (*p)();                            //使用 init_array_addr 
    }
}


init_array_array  本来应该在 elf_get_init_array()  里面被赋值的。


但是在 elf_get_init_array() 里面:

int elf_get_init_array(const void* enclave_base,
        uintptr_t *init_array_addr, size_t *init_array_size)
{
    ElfW(Half) phnum = 0;
    const ElfW(Ehdr) *ehdr = (const ElfW(Ehdr)*)enclave_base;
    ElfW(Phdr) *phdr = get_phdr(ehdr);

    if (!init_array_addr || !init_array_size)
        return -1;

    if (phdr == NULL)
        return -1;  /* Invalid image. */

    *init_array_addr = 0;
    *init_array_size = 0;

    /* Search for Dynamic segment */
    for (; phnum < ehdr->e_phnum; phnum++, phdr++)
    {
        if (phdr->p_type == PT_DYNAMIC)
        {
            size_t      count;
            size_t      n_dyn = phdr->p_filesz/sizeof(ElfW(Dyn));
            ElfW(Dyn)   *dyn = GET_PTR(ElfW(Dyn), ehdr, phdr->p_paddr);
            
            for (count = 0; count < n_dyn; count++, dyn++)
            {
                switch (dyn->d_tag)
                {
                    case DT_INIT_ARRAY:
                        *init_array_addr = dyn->d_un.d_ptr;
                        break;
                    case DT_INIT_ARRAYSZ:
                        *init_array_size = dyn->d_un.d_val;
                        break;
                }
            }
        }
    }

    return 0;
}


有可能 init_array_addr 还没有被赋值,函数就return -1 了。 这样就会产生 还使用没有赋值的变量的情况。


整改办法:


在 do_ctors_aux()中增加 对 elf_get_init_array() 的返回值的判断。







  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值