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

C 您是否使用TR 24731';安全';功能?,c,security,coding-style,tr24731,C,Security,Coding Style,Tr24731,ISO C委员会()已发布并正在致力于: TR 24731-1:C库的扩展第一部分:边界检查接口 WG14正在开发一个关于更安全的C库函数的TR。此TR面向修改现有程序,通常是通过添加一个额外的缓冲区长度参数。最新草案见文件N1225。基本原理见文件N1173。这将成为技术报告类型2 TR 24731-2:C库的扩展-第二部分:动态分配功能 WG14正在开发一个关于更安全的C库函数的TR。该TR面向使用动态分配的新程序,而不是缓冲区长度的额外参数。最新草案见文件N1337。这将成为技术报告类型2

ISO C委员会()已发布并正在致力于:

TR 24731-1:C库的扩展第一部分:边界检查接口 WG14正在开发一个关于更安全的C库函数的TR。此TR面向修改现有程序,通常是通过添加一个额外的缓冲区长度参数。最新草案见文件N1225。基本原理见文件N1173。这将成为技术报告类型2

TR 24731-2:C库的扩展-第二部分:动态分配功能 WG14正在开发一个关于更安全的C库函数的TR。该TR面向使用动态分配的新程序,而不是缓冲区长度的额外参数。最新草案见文件N1337。这将成为技术报告类型2

问题
  • 您是否使用支持TR24731-1函数的库或编译器
  • 如果是,哪个编译器或库以及在哪个平台上
  • 在修复代码以使用这些函数时,是否发现了任何错误
  • 哪些功能提供的价值最大
  • 是否有不提供值或负值的值
  • 你打算将来使用图书馆吗
  • 你在跟踪TR24731-2的工作吗

自从这些TR诞生以来(当它是一个TR的时候),我一直是一个直言不讳的批评家,并且永远不会在我的任何软件中使用它们。它们掩盖了症状,而不是解决了问题的原因。我认为,如果有任何问题,它们将对软件设计产生负面影响,因为它们提供了错误的安全感,而不是促进可以更有效地实现相同目标的现有实践。并非只有我一人,事实上,我不知道委员会外有哪一位主要支持者在开发这些TRs

我使用glibc,因此我知道我将不用处理这些废话,正如glibc的首席维护者Ulrich Drepper所说:

建议的safe(r)ISO C库 未能完全解决问题。 ... 提议让一个年轻人过上幸福的生活 程序员更难的是不去做 救命啊。但事实正是如此 提议。。。他们都需要更多 要做的工作或只是简单 傻

他接着详述了一些拟议功能的问题,并在其他地方表示,glibc永远不会支持这一点

奥斯汀集团(负责维护POSIX)对TR、他们的评论和委员会的回应进行了非常严格的审查。Austin Group review在详细说明TR的许多问题方面做得非常好,因此我在这里不详细介绍个人细节

所以底线是:我不使用支持或将支持此功能的实现,我不打算使用这些功能,我个人认为,TR仍然以任何形式存在的唯一原因是,微软正在大力推动TR,尽管存在广泛的反对意见,但最近证明微软非常有能力通过标准委员会对TR进行抨击。如果这些功能被标准化,我认为它们将不会被广泛使用,因为该提案已经存在了几年,并且没有获得任何真正的社区支持。

直接回答问题 我喜欢罗伯特的回答,但我对我提出的问题也有一些看法

  • 您是否使用支持TR24731-1函数的库或编译器

    不,我没有

  • 如果是,哪个编译器或库以及在哪个平台上

    我相信这些函数是由MS Visual Studio(例如MS VC++2008版)提供的,并且有一些警告鼓励您使用它们

  • 在修复代码以使用这些函数时,是否发现了任何错误

    还没有。我不希望在我的代码中发现很多东西。我使用的其他一些代码-也许。但我还没被说服

  • 哪些功能提供的价值最大

    我喜欢printf_s()函数族不接受“
    %n
    ”格式说明符这一事实

  • 是否有不提供值或负值的值

    tmpfile_s()
    tmpnam_s()
    函数令人失望。他们真的需要像
    mkstemp()
    那样工作,创建并打开文件以确保没有TOCTU(检查时间、使用时间)漏洞。就目前而言,这两者的价值微乎其微

    我还认为
    strerrorlen\u s()
    提供的价值很小

  • 你打算将来使用图书馆吗

    我对此犹豫不决。我开始研究一个库,该库将在标准C库上实现TR 24731的功能,但被证明它正常工作所需的大量单元测试所困扰。我不确定是否要继续这样做。我有一些代码想移植到Windows(主要是出于一种在所有平台上提供支持的不正当愿望——它已经在Unix衍生产品上工作了几十年了)。不幸的是,为了让它在没有MSVC编译器警告的情况下编译,我必须在代码中添加一些东西,以防止MSVC吹嘘我使用了非常可靠(仔细使用时)的标准C库函数。这不是开胃菜。这已经够糟糕的了,我不得不处理在这段时间里发展起来的20年的大部分系统;必须处理某人的乐趣想法(让人们在不需要的时候采用TR 24731)很烦人。这就是我开始开发库的部分原因——允许我在Unix和Windows上使用相同的界面。但我不确定从这里我能做什么

  • 你在跟踪TR24731-2的工作吗

    直到我去了标准实验室,我才开始追踪它
    #define __STDC_WANT_LIB_EXT1__ 1
    #include <stdarg.h>
    #include <stdio.h>
    int vsnprintf_s(char * restrict s, rsize_t n,
                    const char * restrict format, va_list arg);
    
    int vsnprintf_s(
       char *buffer,
       size_t sizeOfBuffer,
       size_t count,
       const char *format,
       va_list argptr 
    );
    
    struct tm *localtime_s(const time_t * restrict timer,
                           struct tm * restrict result);
    
    errno_t localtime_s(struct tm* _tm, const time_t *time);
    
    struct tm *localtime_r(const time_t *restrict timer,
                           struct tm *restrict result);
    
    char *strtok_s(char *strToken, const char *strDelimit, char **context); 
    
    char *strtok_s(char * restrict s1, rsize_t * restrict s1max, const char * restrict s2, char ** restrict ptr);