Visual Studio 2015 中的安全功能
Safe functions in visual studio 2015
在Windows,Visual Studio 2015下编码C时,我发现自己由于不推荐使用的函数而被迫修改我的代码,通过添加第二个参数,当然使用安全函数(例如以_s结尾)。
我想知道,这些功能是否存在于C标准库中,如果我将它们转移到我的linux分区,我可以使用C编译器编译它们吗?
当我编写有关偏移函数的字符串翻转时,我的担忧出现了:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *flipstr(char *str, size_t size, size_t offset);
int main(int , char **)
{
char str[] = "JonSon";
char *p = flipstr(str, sizeof(str), 3);
if (p) {
printf("%sn", p);
}
return 0;
}
char *flipstr(char *str, size_t size, size_t offset)
{
if (offset > strlen(str)) {
return NULL;
}
char *tmp = (char *)calloc(size, sizeof(char));
strncpy_s(tmp, size, str, offset);
memmove(str, str + offset, strlen(str + offset));
memcpy(str + strlen(str + offset), tmp, strlen(tmp));
free(tmp);
return str;
}
不,它们中的大多数都不是标准的,您不应该仅仅因为Microsoft中的某个人决定"弃用"一半的标准库而支持他们的非标准扩展而使用它们。当然,他们的所作所为是有道理的,但最终这简直是荒谬的。您最好禁用警告并编写便携式 C/C++。
这里有几个问题...
首先,使用strcpy
没有错,这是一个神话。它没有被弃用,这只是Microsoft gaga。
其次,strncpy
从未打算成为strcpy
的安全版本。它从未打算用于古代Unix中旧的非标准字符串格式以外的任何东西。
第三,strncpy
不安全、危险。看到这个和这个。有很多关于这个的博客可以找到。
所以忘记strncpy
,因此,也忘记strncpy_s
。实际上,在 C11 边界检查接口中有一个叫做 strncpy_s
的函数(编译器实现它不是强制性的)。
如果这个C11标准功能与同名的非标准Microsoft垃圾功能完全兼容,我不知道。我不会指望它。但是由于Visual Studio 2015是90年代初的古老编译器,因此C11无论如何都不是您可以使用的。
相关文章:
- XLL功能的线程安全
- 如何实现功能线程安全
- 安全 [是/否];[1/2/3/等]功能
- 在称为函数内更改功能指针(STD ::函数)安全吗?
- 功能的向后兼容性和安全版本
- 如何分析、查找和修复C++功能中的安全漏洞?
- Visual Studio 2015 中的安全功能
- 致电openssl beio/ec_key/evp_key/.._ nullptr上的免费功能是安全的吗?
- 通过网络将指针发送到静态功能是安全的吗?
- 使功能异常安全
- 如何使用 Windows 本机 Wifi 功能连接到请求网络安全密钥的 Wifi
- Vim无法用叮当声设置全功能
- boost套接字读写功能是否线程安全
- 使用 C++14 的自动功能类型返回扣除代替 std::common_type 是否始终安全?
- 如何摆脱不安全的功能(sprintf,..)
- 功能与安全/静态与动态实例化
- 我可以使用c++作为Windows Phone 8的全功能开发语言吗?
- 洛基的长寿功能对我来说似乎不安全,是这样吗?
- 向下投射具有附加功能的派生类的共享指针-这样安全吗
- 朋友功能的安全风险是什么