主要内容

MISRA C++:2023 Rule 0.0.1

R2026b

A function shall not contain unreachable statements

自 R2024b 起

描述

A function shall not contain unreachable statements. 1

理由

从函数入口点不可达的语句通常表明程序逻辑存在错误。除非程序使用未定义的行为,否则不可达代码块不会执行,也不会对程序输出产生任何影响。

Polyspace 实现

在出现以下情况时,规则检查项会报告违规:

  • 由于之前的控制流中断(使用以下语句之一),导致某段代码不可达:

    • break 和 return

    • goto

    • while(1) 等简单无限循环

  • 由于前面的 catch 语句处理了抛出异常,导致某个 catch 语句不可达。

故障排除

如果您预期会出现违规,而 Polyspace® 未报告该违规,请参阅诊断为何编码规范违规未按预期显示。

示例

全部展开

typedef enum _suit {UNKNOWN_SUIT, SPADES, HEARTS, DIAMONDS, CLUBS} suit;
suit nextcard(void);
void guess(suit s);

suit deal (void){
    suit card = nextcard();
    if( (card < SPADES) || (card > CLUBS) ) 
        card = UNKNOWN_SUIT;
        return card;

    if (card < HEARTS) {   // Noncompliant - code follows return
        guess(card);
    }
    return card;
}

suit deal_fixed (void){
    suit card = nextcard();
    if( (card < SPADES) || (card > CLUBS) )  {
        card = UNKNOWN_SUIT;
        return card;
    }
    if (card < HEARTS) {   // Compliant
        guess(card);
    }
    return card;
}

在此示例中,函数 deal() 存在缺陷,因为第一个 if 代码块缺少花括号。由于缺少花括号,第一个 return 语句始终会将代码流返回到调用该函数的位置。后面的 if 代码块和第二个 return 语句在任何上下文中都无法执行。

函数 deal_fixed() 中修复了此问题。该函数正确地在第一个 if 代码块两端添加了花括号,避免了代码块中的 return 语句之后存在静态不可达代码。

#include <new>

extern void print_str(const char* p);
extern void throw_exception();

void func() {
    try {
        throw_exception();
    }
    catch(std::exception& exc) {
        print_str(exc.what());
    }

    catch(std::bad_alloc& exc) {  //Noncompliant
        print_str(exc.what());
    }
}

void func_fixed() {
    try {
        throw_exception();
    }
    
    catch(std::bad_alloc& exc) {  // Compliant
        print_str(exc.what());
    }
    catch(std::exception& exc) {
        print_str(exc.what());
    }
}

在此示例中,函数 func() 中的第二个 catch 语句接受了一个 std::bad_alloc 对象。由于 std::bad_alloc 类派生自 std::exception 类,因此第二个 catch 语句被接受 std::exception 对象的上一个 catch 语句隐藏。

函数 func_fixed() 通过对 catch 语句进行重新排序修复了此问题。

检查信息

组:与语言无关的问题
类别:必需
PQL 名称:std.misra_cpp_2023.R0_0_1

版本历史记录

在 R2024b 中推出


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:2025

  • MISRA C++:2008

  • MISRA C++:2023

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