代码之家  ›  专栏  ›  技术社区  ›  Navaneeth K N

我应该在MSVC-C上使用POSIX函数的安全版本吗

  •  6
  • Navaneeth K N  · 技术社区  · 14 年前

    我正在写一些C代码,希望在多个编译器上编译(至少在 MSVC GCC ). 因为我是C语言的初学者,所以我打开了所有警告,并将警告视为错误( -Werror /WX 防止我犯愚蠢的错误。

    当我编译一些使用 strcpy

    warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.

    拷贝字符串

    my_strcpy()
    {
    #ifdef WIN32
     // use strcpy_s
    #ELSE
     // use strcpy    
    }
    

    有什么想法吗?

    3 回复  |  直到 14 年前
        1
  •  4
  •   Secure    14 年前

    关于这个话题有很多很多的讨论。我敢肯定,像strncpy,strlcpy之类的嫌疑犯会再次出现在这里。只需在搜索框中键入“strcpy”并阅读一些较长的线程即可获得概述。

    当然,这也带来了一些其他的蠕虫,特别是对于初学者:内存处理责任和接口设计。都是一个自己的话题,5个人会给你10条建议怎么做。一个中心库通常有一个很好的效果,它强制执行一个决策,你将遵循整个代码库,而不是使用模块A中的方法A和模块b中的方法b,当你试图连接A和b时给你带来麻烦。。。

        2
  •  4
  •   R.. GitHub STOP HELPING ICE    14 年前

    每当您在非恒定大小的缓冲区之间移动数据时,您必须(喘息!天哪!)事实上 认为 关于它是否合适。使用函数(如MS-specific strcpy_s strlcpy )声称是“安全的”会保护你不受伤害 明显的缓冲区溢出情况,但不会保护您免受字符串截断导致的错误。在计算缓冲区的必要大小时,它也不能防止整数溢出。

    除非您是处理C字符串的专家,否则我建议您忘记特殊函数和注释 每一个

    另一种方法是将所有字符串处理完全包装在一个string对象中,该对象将缓冲区的长度与字符串一起存储,并在需要放大字符串时自动重新分配,然后只使用字符串 const char * 用于在需要将字符串传递给系统函数或其他库时对字符串进行只读访问。这将牺牲一点您期望从C获得的性能,但它将帮助您确保不犯错误。只是不要走极端。没有必要复制像这样的东西 strchr , strstr 常量字符* 你可以做任何你想做的事。

        3
  •  1
  •   Pete Kirkham    14 年前

    snprintf 这在两个平台上都可用,而不是根据平台有不同的路径。您需要使用define来阻止MSVC上的警告。