C安全编程教学-声明和初始化-在使用前声明标识符(一)_开发语言

注:本课程参考文献《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;
  • 1.

    这段代码在C11标准下编译时会报错,因为C11要求每个声明必须提供类型指示符。

答案
    为了兼容C11标准,应该明确提供类型指示符,修改代码如下:

extern int foo;
  • 1.

4.2编译器对隐含声明的支持

问题描述
    某开发者在使用支持C11标准的编译器编译一段代码时,遇到了关于隐含类型声明的编译错误。该开发者了解到,一些编译器为了支持遗留代码,仍然允许隐含类型声明的使用。

答案
    尽管有些编译器可能支持隐含类型声明,但这种做法并不推荐。为了确保代码的兼容性和可维护性,开发者应该按照C11标准的要求,为每个声明提供明确的类型指示符。

4.3结构体声明中的类型指示符

问题描述
    一个开发者在编写C代码时,遇到了关于结构体声明的编译错误。代码示例如下:

struct {  
    foo;  
    int bar;  
} myStruct;
  • 1.
  • 2.
  • 3.
  • 4.

    编译器提示缺少类型指示符。

答案
    在C11标准下,结构体的每个成员声明都必须包含类型指示符。修改代码如下:

struct {  
    int foo;  
    int bar;  
} myStruct;
  • 1.
  • 2.
  • 3.
  • 4.

    这样修改后,代码将符合C11标准的要求。

 非常感谢您花时间阅读我的博客,希望这些分享能为您带来启发和帮助。期待您的反馈与交流,让我们共同成长,再次感谢!

👇个人网站👇

 安城安的云世界

 

C安全编程教学-声明和初始化-在使用前声明标识符(一)_安全_02