这个函数或变量可能存在安全隐患 Visual Studio。

11

我在使用 Visual Studio 时遇到了问题。 我尝试使用“time.h”中的 localtime 函数。

Visual Studio 告诉我这是一个不安全的函数。 不过,为了完成学校的练习,我必须使用它。 我看到你可以通过进入项目属性、构建选项卡并勾选“启用不安全代码”来禁用此不安全的错误。

然而,我没有构建选项卡,就像你在这里看到的一样: http://puu.sh/4NkYC.png

我正在使用Windows 7和Visual Studio 2012 Ultimate。 看起来“构建选项卡”和“启用不安全代码”已经消失了 :/ 也许你知道如何解决这个问题?

非常感谢:)


你在想C#的unsafe关键字,这是完全不同的。 - SLaks
2
@SLaks - 什么是localtime便携式、“安全”的变体? - Pete Becker
6个回答

35

您可以使用以下指令关闭警告:

#pragma warning(disable : 4996) //_CRT_SECURE_NO_WARNINGS

15

Visual Studio(VS)编译器出现了这个错误。消除这个问题很简单。

  1. 进入VS上下文菜单 项目 > 属性
  2. 点击 配置 > 属性 > C/C++ > 预处理器
  3. 编辑 预处理器定义 ,在最后一行添加 _CRT_SECURE_NO_WARNINGS

这个编译警告就会消失。


15

localtime因为返回指向静态分配的struct tm的指针而被MS-Compiler标记为不安全。这显然是一个坏主意。
因此,Microsoft发明了localtime_s,它接受由您分配的struct tm的指针
struct tm timeinfo;
localtime_s(&timeinfo, &rawtime);

使用这个函数(并使您的程序特定于Microsoft),或通过定义_CRT_SECURE_NO_WARNINGS关闭警告。


4
unsafe是C#的一部分,而不是C++。例如,这些文档清楚地表明:

/unsafe (C#编译器选项)

在C++中,Visual Studio会抱怨它认为不安全的函数,并建议你使用#define _CRT_SECURE_NO_WARNINGS来避免大量的警告,例如:

localtime可能会给你以下警告:

警告 C4996: 'localtime':此函数或变量可能不安全。 考虑改用 localtime_s。若要禁用已停用警告,请使用 _CRT_SECURE_NO_WARNINGS。有关详细信息,请参阅在线帮助。


4
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
char counter_str[10];

int main()
{ 
  time_t my_time = time(NULL)// declaring argument of time();
  sprintf(counter_str,ctime(&my_time));//fetch current time
  printf(counter_str);

}

3
鉴于这可能回答了问题,最好在提供的代码中包含一些简短的解释或描述。 - itwasntme
#define _CRT_SECURE_NO_WARNINGS - SilverTech

0

可移植、"安全" 的 localtime 版本是 localtime_r。与 Henno 在答案中提到的微软的 localtime_s 相似,localtime_r 接受一个额外的参数,这是一个指向要填充的 struct tm 的指针,而不是使用共享的静态分配的指针,就像 localtime 所做的一样。 示例:

time_t t = time(NULL);
struct tm tmbuf;
localtime_r(&t, &tmbuf);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接