【问题标题】:Static analysis: Passing pointer to uninitialized data静态分析:将指针传递给未初始化的数据
【发布时间】:2013-09-02 06:51:49
【问题描述】:

过去,我们在 C 代码中遇到了一些未初始化数据的问题。我在下面的代码示例中尝试了两种不同的静态代码分析工具。他们都没有抱怨将指针传递给未初始化的数据。你知道有什么工具可以解决这个问题吗?

提前谢谢你!

static int useByVal(const int int_val) 
{
    return int_val + 1;
}

static void useByRef(int* const int_ptr) 
{
    if (int_ptr != (void*)0) 
    {
        (*int_ptr)++;
    }
}

int main(void) 
{
    int i;
    int k;

    /*** GOOD: The tool detects error: Using value of uninitialized automatic object 'i' */
    i = useByVal(i);

    /*** BAD: The tool does not catch uninitialized object 'k' when passed by reference */
    useByRef(&k);

    /*** BAD: Since call to 'useByRef(&k)', the tool now consider 'k' as initialized */
    return i+k;
}

【问题讨论】:

  • 尝试frama-c.com 或使用MELT 自定义GCC ......顺便说一句,使用带有gcc -Wall -O2 的最新GCC 4.8 会在前两个错误时发出警告。
  • 谢谢!不知道 -O2 有助于提高 GCC 的警告级别。以后有时间会试试 MELT。

标签: variables pointers static code-analysis initialization


【解决方案1】:

不,我不知道是否有任何工具可以捕捉到这一点。原因是他们通常在逐个功能的基础上进行分析。换句话说,在分析main 时,工具不会分析useByValuseByRef,而是对它们做出合理的假设(就像它们期望一个未初始化的对象一样)。

此外,如果他们确实在这种情况下生成了消息,那么您需要添加 cmets / pragma 以删除它们并说“这种用法没问题;不要再发出消息了” .由于指针传递的性质和频率,您的程序将充满它们。

更好地实现一些动态技术并在测试期间发现问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2012-05-24
    相关资源
    最近更新 更多