如何防止缓冲区溢出

时间:2018-03-27 12:49:57

标签: c

我从一个不包含数组大小的C程序传递一个数组;也就是说,它只是传递一个指向数组的指针。该数组是泛型<Item>。如何确定数组的末尾以检测缓冲区溢出?

我尝试迭代数组,直到收到的内容不是<Item>。这大部分时间都有效,但有时最后的废话将是<Item>类型。我正在使用C并从外部类调用一个函数我没有处理开发。 <Item>是一个对其他数组有多个引用的结构(有点像链表)。

编辑: api声称该阵列是一个只读版本。问题是,如果我不知道大小,我就读不懂。它似乎没有哨兵价值。有一个随机注释表明,如果需要大小,请使用sizeOf(array)/ sizeOf(Item),这不起作用。它是由一个不再在这里工作的团队开发的。问题是其他代码已经依赖于这个C代码,我无法改变它而不必担心破坏其他代码。

2 个答案:

答案 0 :(得分:7)

无法仅基于指向该数组元素的指针来确定数组的结尾。

  

我尝试迭代数组,直到收到的内容不是<Item>

还无法确定特定内存位置是否包含特定类型的对象 - 或者它是否包含任何对象。即使你可以,你如何确定你找到的对象是否真的是数组的一部分,而不仅仅是恰好存在的单独的<Item>对象?

一种可能的解决方案是使用sentinel值来表示数组的结尾。例如,您可以定义接口<Item>.member == 0当且仅当它是数组的最后一个元素时。这与以null结尾的字符串的工作方式类似。

答案 1 :(得分:3)

如果你拥有的只是一个指针,没有大小或已知&#34;数组结束&#34;数据中的标记(sentinel),那么你就有了不可能的情况。在这种情况下,无法确定传递的数组的大小/结束。