注:本课程参考文献《C安全编码标准》
欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~
目录
一.前言
二.不安全代码
三.兼容解决
四.练习和答案
4.1遗留代码中的隐含声明
4.2编译器对隐含声明的支持
4.3结构体声明中的类型指示符
一.前言
C11标准明确要求使用类型指示符,不允许隐含的函数声明存在。相比之下,C90标准则允许变量和函数的类型隐含声明。因此,一些遗留的代码采用了这种隐含的类型声明方式。尽管有些C编译器为了支持这些遗留代码,仍然允许隐含类型声明的使用,但这种做法并不推荐用于新代码的开发。这些编译器可以选择继续支持隐含声明,以确保那些依赖此功能的现有程序能够正常编译和运行。
二.不安全代码
C语言不再允许在声明中缺少类型指示符。C语言标准规定:
在每个声明的声明指示符,以及每个struct声明和类型名称中的指示符-限定符列表中,至少应提供一个类型指示符。
下面这个不兼容代码示例省略了类型指示符:
extern foo;
有些C实现对违反这一约束的情况没有诊断。这些不相容的C翻译器继续将这种声明视作隐含int类型。
三.兼容解决
下面的相容解决方案明确包含了type指示符:
extern int foo;
四.练习和答案
4.1遗留代码中的隐含声明
问题描述:
一段遗留的C代码使用了C90标准的隐含函数声明方式,如下所示:
extern foo;
这段代码在C11标准下编译时会报错,因为C11要求每个声明必须提供类型指示符。
答案:
为了兼容C11标准,应该明确提供类型指示符,修改代码如下:
extern int foo;
4.2编译器对隐含声明的支持
问题描述:
某开发者在使用支持C11标准的编译器编译一段代码时,遇到了关于隐含类型声明的编译错误。该开发者了解到,一些编译器为了支持遗留代码,仍然允许隐含类型声明的使用。
答案:
尽管有些编译器可能支持隐含类型声明,但这种做法并不推荐。为了确保代码的兼容性和可维护性,开发者应该按照C11标准的要求,为每个声明提供明确的类型指示符。
4.3结构体声明中的类型指示符
问题描述:
一个开发者在编写C代码时,遇到了关于结构体声明的编译错误。代码示例如下:
struct {
foo;
int bar;
} myStruct;
编译器提示缺少类型指示符。
答案:
在C11标准下,结构体的每个成员声明都必须包含类型指示符。修改代码如下:
struct {
int foo;
int bar;
} myStruct;
这样修改后,代码将符合C11标准的要求。
非常感谢您花时间阅读我的博客,希望这些分享能为您带来启发和帮助。期待您的反馈与交流,让我们共同成长,再次感谢!
👇个人网站👇