- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 C 代码,其中有这一行。
sprintf_s(var, outfile_ppm, local_filecounter++);
在这里,var
是 char*
类型和 local_filecounter
是 int
类型。
当我运行代码时,它会给我这个警告:
warning: implicit declaration of function 'sprintf_s' is invalid in C99 [-Wimplicit-function-declaration]
这个警告是什么?如何消除它?
最佳答案
sprintf_s
功能是附件 K/TR 24731 边界检查接口(interface)的一部分。但是,任何对这些接口(interface)感兴趣的人都应该阅读 N1967 Field Experience With Annex K — Bounds Checking Interfaces 。以下是摘录:
Despite more than a decade since the original proposal and nearly ten years since the ratification of ISO/IEC TR 24731-1:2007, and almost five years since the introduction of the Bounds checking interfaces into the C standard, no viable conforming implementations has emerged. The APIs continue to be controversial and requests for implementation continue to be rejected by implementers.
确实,如果你看看GCC C11 status page ,你会看到(添加了强调):
Bounds-checking (Annex K) [Optional]: Library issue (not implemented)
附件 K(sprintf_s
和其他类似的 _s
版本的函数)的唯一主要实现是在 Visual Studio 中。流行的解释是,这些函数由 Microsoft 在自己的代码库内部使用来解决安全问题。
其他实现依赖于 Valgrind、mudflap、地址清理器等工具来解决同一组问题,而 Microsoft 之外的代码库很少实际使用这些功能,因此实现它们的动力很小。
换句话说,如果您不使用Visual Studio,则无法使用这些功能。幸运的是,它们不是必需的。
调用sprintf_s
这个问题一开始就非常可疑......
// Wait, what? Something smells fishy...
sprintf_s(var, outfile_ppm, local_filecounter++);
sprintf_s
的第三个参数应该是一个格式字符串,但是 local_filecounter++
看起来太可疑了,不可能是格式字符串。
通常,您会使用 snprintf
,它截断其输出以适合缓冲区,或 asprintf
如果您可以使用 C 标准之外的函数。
char var[256];
snprintf(var, sizeof(var), outfile_ppm, localfile_counter++);
请注意,如果 var
没有您不能使用的数组类型 sizeof(var)
计算其大小,以及有关数组用作函数参数时衰减为指针的常见警告适用于此处。
摘要:您不能使用sprintf_s()
除非你切换到Visual Studio或者自己实现。坚硬的 cookies 。
小注意事项:理论上,您应该定义 __STDC_WANT_LIB_EXT1__
如果你想要sprintf_s
。然而,在实践中,定义 sprintf_s
的唯一主要实现据我所知,无论宏是否存在,完全都会这样做。事情可能已经改变。
关于c - sprintf_s() 隐式声明警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45198063/
我想写入数据到一个字符缓冲区。因此,我有一个格式化我的数据的功能。例如,我只是像这样将一个 int 值传递给函数: using namespace std; #include char* write
Visual Studio 提示我将 sprintf 替换为 sprintf_s,而不是 snprintf。 sprintf_s 不需要长度参数,它如何避免缓冲区溢出问题? 最佳答案 有两个版本。一种
我在使用 C/C++ 程序的 Windows 上的 Visual Studio 中收到“0xC0000005:访问冲突读取位置错误”,并尝试简化以说明我的问题。下面的代码运行得很好: char tmp
已关闭。此问题需要 debugging details 。目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and the
我有一个使用 sprintf_s 的 C 程序。它在 Windows 中工作正常,但是当我在 Linux 中编译代码时,出现以下错误: sprintf_s was not declared in th
我在 sprintf_s 中偶尔执行以下代码时发生崩溃。这段代码工作了很多年,没有任何问题。当我按照下面的语句在 strcat_s 和 sprintf_s 中给出大小时,不会出现崩溃。这可能是什么原因
我遇到了问题。示例: try { char strMes[6]; sprintf_s(strMes, sizeof(strMes), "%s", "012345678"); p
我在使用这个函数时遇到了一个有趣的问题。我使用它如下: int nSeq = 1; char cBuf[8]; int j = sprintf_s(cBuf, sizeof(cBuf), "%08d"
包含 banned.h(微软安全工具之一)后,编译器警告我 sprintf() 函数不安全,MSDN 中心给了我使用 的建议sprintf_s,因为我的项目是跨平台的,所以我写了一个sprintf函数
以下代码会导致错误并终止我的应用程序。这是有道理的,因为缓冲区只有 10 个字节长,而文本有 22 个字节长(缓冲区溢出)。 char buffer[10]; int length = spri
我有一个使用 sprintf_s 的 C 程序。它在 Windows 中运行良好,但是当我在 Linux 中编译我的代码时出现此错误: sprintf_s was not declared in th
对于新项目,我应该更喜欢哪个功能?来自 strsafe.h 或 sprintf_s 的 StringCchVPrintf 最佳答案 我建议使用 snprintf如果您使用 C 编写代码(因为 snpr
我正在尝试创建一个类,比如说 MyClass,在以下条件下工作: MyClass name = "everyone"; // Assigns "everyone" into a local str
这是我从 int 到 char* 的转换: char* str = malloc(sizeof("0000")); int int_ = 10; sprintf_s(str, sizeof("0000
我有一个 C++ 应用程序,其中客户报告了一个崩溃。但是崩溃不容易重现。在分析了一些日志之后,我发现崩溃可能发生在以下代码部分之间。请告诉我,如果我在其中包含这些代码语句,应用程序是否有可能崩溃?
在 C++ 中,使用 VS2012,我想获取 Mac 地址并将其转换为汽车格式。我使用 sprintf_s function() 以便在汽车模式下进行转换。在 Debug模式下,一切正常,但在 Rel
我正在使用来自 C# 的 C++ dll(不是我的)。我使用 Console.SetOut 和 Console.SetError 成功地将 C# 控制台输出重定向到一个文件。 有什么办法可以从“外部”
我正在尝试使用 WCHAR 中的 sprintf_s 创建一个新字符串。我的代码如下所示: #include #include void main(int argc, char ** argv)
这是工作的原始代码: // ... unsigned __int64 num = 57; sprintf_s(buffer, sizeof(buffer), "%llu", num); 但是,当我尝试
我写了一个跨平台代码,给出了当前日期 (mm/dd/yy) 和时间 (hh/mm/ss) 和完整日期 (yyyymmdd),此代码适用于 windows(MSVS2015) 但不适用于Linux(GC
我是一名优秀的程序员,十分优秀!