您是否使用TR 24731'安全'功能?

时间:2008-12-16 22:21:00

标签: c security coding-style tr24731

ISO C委员会(ISO/IEC JTC1/SC21/WG14)已发布TR 24731-1并正在制作TR 24731-2

  

TR 24731-1:C库的扩展第一部分:界限检查接口

     

WG14正在研究更安全的C库函数。该TR旨在通过添加具有缓冲区长度的额外参数来修改现有程序。最新草案见N1225号文件。理由是在N1173号文件中。这将成为技术报告类型2.

     

TR 24731-2:C库的扩展 - 第二部分:动态分配函数

     

WG14正在研究更安全的C库函数。该TR面向使用动态分配而不是缓冲区长度的额外参数的新程序。最新草案见N1337号文件。这将成为技术报告类型2.

问题

  • 您是否使用支持TR24731-1功能的库或编译器?
  • 如果是,哪个编译器或库以及在哪个平台上?
  • 您是否发现了因修复代码以使用这些功能而导致的任何错误?
  • 哪些功能提供最大价值?
  • 有没有提供任何价值或负值的东西?
  • 您打算将来使用该库吗?
  • 您是否正在跟踪TR24731-2的工作?

5 个答案:

答案 0 :(得分:64)

自从他们成立以来(当它是一个TR)时,我一直是这些TR的声音批评者,并且永远不会在我的任何软件中使用它们。它们掩盖症状而不是解决原因,我认为,如果有的话,它们会对软件设计产生负面影响,因为它们提供了错误的安全感,而不是促进可以更有效地实现相同目标的现有实践。我并不孤单,事实上我并不知道在委员会之外发展这些TR的一个主要支持者。

我使用glibc并且因此知道我将不得不处理这个废话,正如glibc的主要维护者Ulrich Drepper,said about the topic

  

建议的安全(r)ISO C库   未能完全解决问题。   ......提议创造一个人的生命   程序员更难是不会   救命。但这正是如此   建议。 ......他们都需要更多   工作要做或者很简单   愚蠢的。

他接着详细介绍了许多拟议函数的问题,并在其他地方表示glibc永远不会支持这一点。

奥斯汀集团(负责维护POSIX)对TR提供了非常严格的审查,他们的评论和委员会的回复here。奥斯汀集团的审查工作非常好,详细说明了TR的许多问题,所以我不会在这里详细介绍。

所以底线是:我没有使用支持或支持这个的实现,我不打算永远使用这些功能,我看不到TR的正面价值。我个人认为,TR仍然以任何形式存在的唯一原因是因为它受到了微软的推动,最近证明尽管有广泛的反对意见,尽管标准委员会已经将事情弄得一团糟。如果这些功能一直标准化,我认为它们不会被广泛使用,因为该提案已经存在了几年,并且未能获得任何真正的社区支持。

答案 1 :(得分:28)

答案 2 :(得分:7)

好的,现在是 TR24731-2的展位

是的,自从我在glibc中看到它们以来,我一直使用asprintf() / vasprintf(),是的,我是他们的坚定拥护者。

为什么呢? 因为它们能够一次又一次地提供我需要的功能:一种功能强大,灵活,安全且(相对)易于使用的方式,可以将任何文本格式化为新分配的字符串。

我也非常支持memstream:像asprintf()open_memstream()(不是fmemopen() !!!)为你分配一个足够大的缓冲区并给你一个{{1你的打印功能,你的打印功能完全不知道它们是打印成字符串还是文件,你可以简单地忘记问题,你需要多少空间。

答案 3 :(得分:5)

  

您是否使用支持TR24731-1功能的库或编译器?   如果是这样,哪个编译器或库以及哪个平台?

是的,Visual Studio 2005& 2008(显然是Win32开发)。

  

您是否因修复代码以使用这些功能而发现任何错误?

排序....我编写了自己的安全功能库(我们经常使用的只有15个),可以在多个平台上使用 - Linux,Windows,VxWorks,INtime,RTX和uItron。创建安全功能的原因是:

  • 由于标准C功能使用不当,我们遇到了大量错误。
  • 我对TR函数传递或返回的信息不满意,或者在某些情况下,他们的POSIX替代品。

编写函数后,发现了更多错误。所以是的,使用函数是有价值的。

  

哪些功能提供最大价值?

更安全的vsnprintf版本,strncpy,strncat。

  

有没有提供任何价值或负值?

fopen_s和类似的功能对我个人来说几乎没有什么价值。如果fopen返回NULL,我很好。您应该始终检查函数的返回值。如果有人忽略了fopen的返回值,那么是什么让他们检查fopen_s的返回值?我知道fopen_s将返回更具体的错误信息,这些信息在某些情况下很有用。但是对于我正在做的事情,这没关系。

  

您打算将来使用该库吗?

我们现在正在使用它 - 在我们自己的“安全”库中。

  

您是否正在跟踪TR24731-2的工作?

没有

答案 4 :(得分:5)

不,这些功能绝对无用,除了鼓励编写代码以外它没有任何用途,因此它只能在Windows上编译。

snprintf非常安全(正确实现时),因此snprintf_s毫无意义。如果缓冲区溢出(通过清除连接到字符串),strcat_s将销毁数据。还有许多其他例子完全忽略了事情的运作方式。

真正有用的功能是BSD strlcpy和strlcat。但是,微软和Drepper都出于自私的原因拒绝了这些,以及各地C程序员的烦恼。