Ric*_*Man 0 c linux gcc fopen tr24731
我正在尝试用 c 语言编写一个简单的边缘检测程序。我使用的是 Red Hat Enterprise Linux Server 7.7 (Maipo) 和 gcc 版本 4.8.5。
这是代码的开头:
#include <stdio.h>
#define size 200
int _tmain(int argc, _TCHAR* argv[])
{
char filein[size] = "./image.bmp";
FILE *fin;
fopen_s(&fin, filein, "rb");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我最初对 _TCHAR* 有很多问题,所以最终我用 char 替换了它,我不知道这以后是否会成为问题,但至少它编译并消除了这些错误。现在我收到隐式声明警告。我尝试通过添加其他#include 来修复它。
我尝试用以下方法修复它:
#include <stdio.h>
#include <errno.h>
#include <string.h>
#define size 200
int main(int argc, char* argv[])
{
char filein[size] = "./image.bmp";
FILE *fin;
fopen_s(&fin, filein, "rb");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,我仍然收到同样的警告,有人可以告诉我我做错了什么吗?
谢谢。
非常感谢,这有效!
#include <stdio.h>
#define size 200
int main(int argc, char* argv[])
{
char filein[size] = "./image.bmp";
FILE *fin;
fin = fopen(filein, "rb");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这一_s系列函数是 C 标准附录 K 中的可选函数,很少有任何 C 实现会费心去实现附录 K。附录 K 中引入的“安全”函数的实际用途存在很大争议;只需放弃这些函数并使用标准函数,例如fopen.
我唯一一次遇到这些_s函数是在为 Windows 编写的代码中,并且 Microsoft 包含了这些函数自己的版本,但不符合附录 K 中规定的标准。
请参阅此处查看附件 K 实用性的研究:http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1967.htm
他们的结论是:
尽管自最初提案提出已有十多年,自 ISO/IEC TR 24731-1:2007 批准以来已近十年,自将边界检查接口引入 C 标准以来已近五年,但尚未出现可行的符合性实现。API 仍然存在争议,实施者也继续拒绝实施请求。
边界检查接口的设计虽然用意良好,但存在太多需要纠正的问题。人们发现,与依赖现有方法或现代技术相比,使用 API 会导致质量更差、安全性更差的软件。更有效和更少侵入性的方法已经变得司空见惯,并且通常受到用户和安全专家的青睐。
因此,我们建议附件K要么从C标准的下一个修订版中删除,要么弃用然后删除。