被调用函数是否应该始终检查 C 中的数组大小?

Should the called function always check the array size in C?

这是一个关于编程风格的问题,而不是关于技术性的问题: 我的 C 函数是否应该始终需要数组长度的参数,尽管该函数不依赖于它?

所以要么喜欢这个void foo(int* a, int size)要么喜欢void foo(int* a)

例如当函数只操作数组的前 128 位时,函数是否需要数组长度并首先检查数组的长度是否正确,或者我应该相信调用者他遵循文档并且只调用函数数组的正确大小?

我是 C 的新手,所以我担心可能会出现缓冲区溢出之类的问题。为什么一个比另一个更好的技术推理会很棒。谢谢!

一般规则应该是尽快发现错误。您可以在编译时、link 时间或 运行 时间捕获错误,或者永远不会被捕获并具有未定义的行为。

因为您可以检查大小并产生 运行 时间错误,所以我认为如果您的函数的用户传递较小的数组,那么最好有未定义的行为。

当然有时速度更重要,如果不需要额外的速度,那么您必须转告您的用户会阅读文档。很多标准库函数就是这样写的。但这应该是您程序中的边缘情况。通常更喜欢捕获错误,这样您的代码中的错误就会更少。

我的规则是区分接口点和内部函数。接口函数需要偏执和健壮,但内部函数可以假设调用者知道他们在做什么,并且可以选择效率而不是健壮。

我会这么说,正如 Souvrav 所说,这不是强制性的,这意味着如果你 100% 确定长度是 "right",你可以跳过检查,但是不建议这样做,即使您有 120% 的把握不会溢出。此外,添加此检查可使该功能在您不确定长度的情况下可用,因此即使您认为不需要它,最好直接添加它,它可能会在您的代码增长时派上用场。

简答: 是的你应该。 :D 长答案: 由于您的数组实际上是一个内存指针,因此您无法轻易获得它的实际大小。因此,如果您的函数应该修改数组数据,明智的做法是检查它是否真的可以在不覆盖未分配给您的数组的内存的情况下执行此操作。 在将数据写入指针之前检查内存限制通常是一个好习惯! ;)

问得好,因为在盲目使用之前,您正试图了解编程风格/方法背后的意图。

让我谈谈我的看法。如果代码符合以下条件,则被认为是健康的。

  • 如果您能够阅读和理解代码,无需注释。
  • 如果你的代码对于未来的维护工程师来说很容易维护,没有太多困难。
  • 如果您能够在不彻底更改原始代码的情况下向原始代码添加扩展
  • 如果您的代码因输入组中的修改而关闭/不受影响,即您的代码解决了同一用例的所有不同变体。请参考Open/Closed principle.

在函数签名中包含长度的概念落在上面的前 2 个要点上。

作为功能/逻辑的作者,您确切地知道要实现什么,因此您不想增加长度。然而,想一想,一段时间后出现了一个 bug,你不在项目中了,其他人接管了维护的角色。工程师需要付出相当大的努力才能理解您编写的内容并执行修复。

虽然有人争辩说,他们可以写评论/拥有低级别的文档等,但这并不总是一个可行的解决方案。正确的方法是遵循一种编程风格,使代码审查直观,并帮助未来的开发人员轻松地为项目做出贡献。

总而言之,不,提供长度不是强制性的,但始终建议遵循良好的编码指南以培育良好的生态系统。

如果您想为任何开源项目做出贡献,那么您肯定应该接受这个概念:-)

祝你好运!

因为这是 C,你应该 "trust the programmer"。

无法确保 size 参数是数组的实际长度。它可以是任意数字。那么,为什么要麻烦(并弄乱界面)(并减慢程序速度)?