拯救C语言编译警告密集恐惧症

1 概要

大家在编译C语言项目时,是否遇到过满屏的警告,是否你也跟我一样视若无睹,直到有一天项目出了问题,或者被要求清理掉警告,今天我们解析一下主要的C语言警告。

我这里使用的GCC版本是 4.8.5。GCC 的警告类型很多,详情可以参考GCC文档(gcc.pdf (gnu.org) )53页。

2 -Warray-bounds

说明:警告数组越界访问。

注意:当我们定义数组的大小为 len,数组的最大访问下标为 len-1。

3 -Wformat=

说明:警告格式化字符串的问题,例如使用了错误的格式说明符。

注意:常见于对无符号类型使用有符号格式化方法,由于存在数据类型隐式转换,可能导致未预期的结果。

4 -Wformat-extra-args

说明:警告格式化函数调用时提供了额外的参数,这些参数在格式化字符串中未使用。

常见于笔误。

5 -Wmissing-braces

说明:警告在初始化数组或结构体时缺少了花括号。

注意:编码中我们常使用 { 0 } 初始化多维数组没有任何问题,但是会引起此警告,多维数组被要求按行初始化。

6 -Wmissing-field-initializers

说明:警告在初始化结构体时部分初始化。

此类警告常见于结构体成员初始化,未初始化部分会自动初始化为0,但为了提高代码可读性,建议全部初始化。

7 -Wmissing-prototypes

警告函数声明缺少了原型,即在调用前没有声明函数的参数类型。

8 -Wparentheses

说明:警告括号缺失或者不当使用导致的逻辑错误。

注意:使用括号明确优先级,特别是关系运算符和位运算符一起使用时,关系运算符优先级大于位运算符。

9 -Wpointer-sign

说明:警告对指针类型进行了符号转换,这可能是不安全的。

10 -Wpointer-to-int-cast

说明:警告将指针转换为整数类型,这可能导致数据丢失。

11 -Wreturn-type

说明:警告函数的返回类型与声明不一致。常见于函数设计了返回值,但是某些逻辑下却没有返回值。

12 -Wsign-compare

说明:警告有符号整数和无符号整数之间的比较,这可能导致未预期的行为。

这类警告应该是十分常见和最容易发生的,其根源在于我们对变量的属性定义并不十分严谨。因此常常会存在不同类型之间变量的比较。在 C 语言中,当不同类型的变量之间进行比较时,首先会转化为同一类型,然后再进行比较。这里涉及到两个概念,整型提升算术转化

不同符号类型的数据进行比较时,若都是正数,常不会出现问题,若是存在负数,可能会出现未预期的行为。因为上面所说的整形提升,负数被解释为正数,就已经不是原来的值了。

13 -Wstrict-aliasing

警告违反了严格的别名规则,可能导致未定义行为。常见于对对象做类型转换后并解引用取其值

14 -Wstrict-prototypes

警告函数原型不严格或不完整。C99及以后的标准引入了“原型声明”(prototype declaration),要求函数声明中必须明确列出每个参数的类型,并且如果没有参数,应该使用void来明确指出

15 -Wswitch

警告switch语句中的case标签可能有问题,例如重复或遗漏了default。常见于缺少default分支

16 -Wtype-limits

警告在使用类型极限值时可能的错误,比如超出类型范围。

17 unused 类型的警告

  • -Wunused-but-set-variable
  • -Wunused-function
  • -Wunused-label
  • -Wunused-value
  • -Wunused-variable
    很明显,这是警告代码中存在未使用的变量,函数等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值