Visual Studio 2015 中的安全功能

Safe functions in visual studio 2015

本文关键字:安全 全功能 Studio 2015 Visual      更新时间:2023-10-16

在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无论如何都不是您可以使用的。