主要内容

MISRA C++:2008 Rule 8-4-4

A function identifier shall either be used to call the function or it shall be preceded by &

Description

Rule Definition

A function identifier shall either be used to call the function or it shall be preceded by &.1

Rationale

Using function identifiers in a clear and specific way helps developers understand if the intention is to call the function or to use the address of the function. When taking the address of a function by using the function identifier without the & operator, the program can work as intended, but confusion can arise as to whether a function call was intended instead.

Polyspace Implementation

The rule checker reports a rule violation whenever you use a function identifier to represent the address of a function without using the & operator.

Troubleshooting

If you expect a rule violation but Polyspace® does not report it, see Diagnose Why Coding Standard Violations Do Not Appear as Expected.

Examples

expand all

In the following code, the assignment std::vector<void(*)()> eventHandlers = {onEvent1, onEvent2}; lacks the & operator on the function identifiers onEvent1 and onEvent2, which can lead to confusion about whether the initializer list is intended to be two function calls, or the addresses of the two functions.

#include <iostream>
#include <vector>

void onEvent1() {
    std::cout << "Event 1 triggered!" << std::endl;
}

void onEvent2() {
    std::cout << "Event 2 triggered!" << std::endl;
}

void processEvents(const std::vector<void(*)()>& callbacks) {
    for (auto callback : callbacks) {
        callback();
    }
}

int main() {
    std::vector<void(*)()> eventHandlers = {onEvent1, onEvent2}; //Noncompliant 

    processEvents(eventHandlers);
}

Check Information

Group: Declarators
Category: Required

Version History

Introduced in R2013b


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.