主要内容

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

MISRA C++:2023 Rule 0.0.1

A function shall not contain unreachable statements

自 R2024b 起

描述

规则定义

A function shall not contain unreachable statements. 1

理由

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

Polyspace 实现

规则检查器报告了一个违规项:

  • 当代码的某一段无法被执行,因为之前使用了以下语句之一导致控制流中断:

    • breakreturn

    • 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 语句来解决这个问题。

检查信息

组:与语言无关的问题
类别:必需

版本历史记录

在 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++:2008

  • MISRA C++:2023

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