分享一个 变量没有初始化 可能带来的问题
2017-02-22 11:54
232 查看
先看 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() 的返回值的判断。
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() 的返回值的判断。
相关文章推荐
- C语言中变量没有初始化 所带来的问题
- 关于C#更新Access数据库时发现的一个没有任何技术含量的问题,给大家分享,希望能给大家帮助
- 分享一个CLASSPATH的问题导致SERVLET出错却没有任何log
- non-local static 变量初始化顺序不确定,带来的问题
- 基于自组网技术的智能无线抄表方案 现代生活中,水表、电表和煤气表的抄录和收费,是城市生活的一个大问题。人工入室抄表,扰民不说,还可能给居民带来不安全因素;对于各职能公司来说,派人上门抄表也无形中耗费了大量人力资源和时间。近年来,信息化社会在逐 步改变人们的
- 一个bool变量没有初始化, 结果耗掉数小时
- 有关QT中声明一个vector为全局变量的初始化问题
- 关于如何初始化一个类内的静态二维数组变量问题
- non-local static 变量初始化顺序不确定,带来的问题
- 分享一个jquery ajax 中不能修改全局变量问题的方法
- 没有默认构造函数的问题, 对于类成员变量有别的类成员,则在类 构造函数中也必须对那个类成员变量进行初始化,除非那个类 成员有默认构造函数
- 变量初始化问题--一个年轻工程师的见解(2007年工作一年时写的)
- 注意访问器中的一个小细节,关于有访问器没有成员变量的问题
- non-local static 变量初始化顺序不确定,带来的问题
- c++中定义一个全局变量,子函数修改变量后,主函数没有改变问题
- 一个可遇不可求的 bug 全局变量初始化顺序问题 哈哈
- 初始化python类的实例时,私有变量的值与上一个实例的相同,问题定位
- non-local static 变量初始化顺序不确定,带来的问题
- C++初始化列表问题,类中有一个对象类型的数组成员变量,在初始化列表中初始化时报错“[]”操作符语法错误
- java中一个值得注意的问题---类成员初始化与变量初始化的区别