【问题标题】:Not able to solve KlockWork Buffer Overflow error无法解决 KlockWork 缓冲区溢出错误
【发布时间】:2021-06-05 05:07:51
【问题描述】:

我无法找出这个 KlockWork 问题的解决方案。

KlockWork 显示 ABV.GENERAL (1:P1) Defer 以下代码

void fun1(uint32_t size)
{
  if(size > 256)
  {
    return;
  }
  uint32_t *arr = (uint32_t *)malloc(size * sizeof(uint32_t));
  if(arr == NULL)
  {
    return;
  }
  memset(arr, 0, size * sizeof(uint32_t)); 
  fun2(arr, size);
  free(arr);
}

void fun2(uint32_t *arr, uint32_t size)
{
  uint32_t i = 0;
  if(size > 256)
  {
    return;
  }
  while( i < size )
  {
    arr[i] = i;
    printf("%d", arr[i]);
    i++;
  }
}

错误:大小为“size*4”的数组“arr”可能使用索引值 min(size+(-1), 255)..min(size+(-1), 255)

请提出一些避免此错误的方法。

谢谢

【问题讨论】:

  • 也许它与类型有关。可变大小一次是int,一次是uint32_t
  • 对不起.. 传递给 fun1 的参数大小也是 uint32..
  • 绝不!永远不要转换malloc 的结果值。这是一种遗留用途,它隐藏了几个可能的错误(例如,你所做的不包括&lt;stdlib.h&gt;)它早于C 中没有void 类型的时代。你不应该使用强制转换如果您已正确包含 &lt;stdlib.h&gt; 文件。

标签: arrays c malloc static-analysis klocwork


【解决方案1】:

在我看来,您缺少这些头文件之一,或者 fun2 函数的转发函数原型:

#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>

void fun2(uint32_t*arr, uint32_t size);

我已经在所有这些东西之前编译了你的代码,没有收到任何警告或错误。加上我在 cmets 中告诉你的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-05-12
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-25
    相关资源
    最近更新 更多