主要内容

本页采用了机器翻译。点击此处可查看最新英文版本。

MISRA C:2012 Rule 2.2

A project shall not contain dead code

描述

规则定义

A project shall not contain dead code 1 .

理由

如果一个运算可以被访问,但删除该运算不会影响程序的行为,则该运算构成死代码。

死代码的存在可能表明程序逻辑中存在错误。由于编译器可以删除死代码,因此死代码的存在可能会给代码评审人员带来困惑。

Polyspace 实现

规则检查器报告不会影响程序行为的运算中的规则违规。最常见的情况是,某个运算的结果在后续运算中并未被使用。例如:

  • 您可能会执行一个运算,但没有将结果赋值给一个变量,即使是临时变量。

  • 您可以将一个运算的结果赋值给一个变量,但之后可能不会使用该变量。

  • 您可以为变量赋值,但随后并不使用该值。有关更多详细信息,请参阅写入后未被读取

  • 您可以将运算结果赋给一个变量,但随后立即覆盖该变量的值。

其他不常见的情况包括调用空函数或冗余常量运算。其中一些涉及常量的运算出现在生成的代码中,可能会被编译器优化掉。例如,运算 2u * 1u 是一个冗余运算,编译器很可能会将其优化为 2u。也就是说,该运算在运行时不太可能发生。无论编译器是否进行了优化,规则检查器都会报告该运算违反了规则。

Polyspace® 未报告以下内容违反此规则:

  • 未使用的参数声明。未使用的定义违反了 MISRA C:2012 规则 2.3。

  • 未使用非 void 函数的返回值,因为该函数除了返回值之外可能还有其他副作用。删除函数调用可能会影响程序行为。

  • 一个用于在代码中使用其结果的转换运算符。

故障排除

如果您预期会出现违规,但未看到该违规,请参阅诊断为何编码规范违规未按预期显示

示例

全部展开

extern volatile unsigned int v;
extern char *p;

void f ( void ) {
    unsigned int x;


    ( void ) v;      /* Compliant - Exception*/
    ( int ) v;       /* Non-compliant  */
    v >> 3;          /* Non-compliant  */

    x = 3;           /* Non-compliant  */

    *p++;            /* Non-compliant  */
    ( *p )++;        /* Compliant  */
}

在此示例中,当对变量执行运算但未使用该运算的结果时,就违反了该规则。例如,

  • 对变量 v 执行的运算 (int)>> 是多余的,因为其结果未被使用。

  • 运算 = 是多余的,因为在运算之后没有读取局部变量 x

  • p++ 执行的运算 * 是多余的,因为其结果未被使用。

以下情况不违反该规则:

  • 一个变量被强制转换为 void 类型。该转换表示您故意不使用该值。

  • 运算的结果被使用。例如,对 p 执行 * 运算并非多余,因为 *p 递增了。

void g ( void ) {
               /* Compliant  */
}

void h ( void) {
     g( );     /* Non-compliant */
}

在此示例中,g 是一个空函数。虽然函数本身并不违反规则,但调用该函数却违反了规则。

检查信息

组:未使用的代码
类别:必需
AGC 类别:必需

版本历史记录

在 R2014b 中推出

全部展开


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.