0

我正在尝试用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;

}

我最初对 _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;

}

但是,我仍然收到同样的警告,有人可以告诉我我做错了什么吗?

谢谢。

非常感谢,这行得通!

#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;

}
4

2 回答 2

5

这一_s系列函数是来自 C 标准的 Annex K 的可选函数,很少有任何 C 实现费心去实现 Annex K。Annex 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 继续存在争议,实施请求继续被实施者拒绝。

Bounds 检查接口的设计虽然是出于好意,但存在太多需要纠正的问题。与依赖现有方法或现代技术相比,使用 API 会导致软件质量更差、安全性更低。更有效且侵入性更小的方法已变得司空见惯,并且经常受到用户和安全专家的青睐。

因此,我们建议附录 K 要么从 C 标准的下一个修订版中删除,要么弃用然后删除。

于 2020-02-20T18:47:42.130 回答
2

fopen_s仅在 C11 的可选边界检查库中可用。为了使用它,您需要执行以下操作:

#define __STDC_WANT_LIB_EXT1__ 1
#include <stdio.h>
#include <errno.h>
... // rest of program

然后编译-std=c11并祈祷。

因为边界检查库对编译器的支持很差,我不确定 gcc 实际实现了多少。C 程序员的普遍共识似乎是边界检查库是危险的,应该避免——它的发布是一场彻底的惨败。

你最好忘记所有关于这个库并使用它fopen

于 2020-02-20T18:50:21.653 回答