【问题标题】:Assigning value to unintialized pointer BEFORE dereferencing在取消引用之前为未初始化的指针赋值
【发布时间】:2017-10-06 04:35:15
【问题描述】:

我发现了一个代码 sn-p,其中声明了一个 char 指针(比如 *pData),但没有初始化为 NULL。

char *pData, *pData2;
char string[10] =  "Hello"
pData2 = &string[0];
SomeFuntionToAssignValue(pData2, &pData);

SomeFuntionToAssignValue(char *pData2, char **pData)
{
    if (something)
    {
        *pData = pData2;
    }
    else if (something)
    {
        *pData = &pData2[some calculation]
    }
}

在调用函数 SomeFuntionToAssignValue() 之后,取消引用 pData 是否可以在任何时间点抛出“内存访问异常”错误?

因为在编译或本地测试期间(这里测试是在可以随时重新加载的目标中完成的,因此通常内存损坏的可能性会降低)我们没有遇到任何“内存访问异常”错误。

但是在现场环境中进行测试时,至少一周的时间没有重新加载目标,抛出了“内存访问异常”错误。

那么,不做char *pData = NULL 是否有可能导致“内存访问异常”错误?

【问题讨论】:

  • C 没有“内存访问异常”,除非您指定平台、体系结构和编译器。
  • 按照你展示的方式调用你的函数,调用后使用pData是安全的。
  • @Someprogrammerdude - 如果some calculation 在 [0,strlen(pData2)] 范围内给出结果,则安全
  • @AjayBrahmakshatriya 平台是 Linux,我猜它是 gcc 编译器。但我确实遇到了需要修复的内存访问异常错误。
  • @ArtemyVysotsky :是的,范围已处理。 strlen(pData) 在代码中使用。

标签: c pointers dereference memory-access


【解决方案1】:

是的,有机会,因为您的 SomeFuntionToAssignValue 并不总是分配给 *pData。并且将pData 初始化为空可以防止出现问题,因为其他代码可能正在检查NULL,但无法检查其未初始化的值。但这一切都取决于您未显示的代码;总的来说,这种模式没有任何问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 2021-01-13
    • 2013-05-13
    • 2021-12-29
    • 2019-10-28
    • 1970-01-01
    • 2021-03-19
    相关资源
    最近更新 更多