Main Content

MISRA C++:2008 Rule 17-0-1

Reserved identifiers, macros and functions in the Standard Library shall not be defined, redefined or undefined

Description

Rule Definition

Reserved identifiers, macros and functions in the Standard Library shall not be defined, redefined or undefined.

Rationale

Redefining or undefining reserved identifiers, macros and functions from the Standard Library is not good practice. In some cases, these actions can lead to undefined behavior.

Polyspace Implementation

The checker raises a violation if identifiers and macros from the Standard Library are defined, redefined or undefined.

In general, the checker considers identifiers and macros that begin with an underscore followed by an uppercase letter as reserved for the Standard Library.

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

#define __TIME__ 3  //Noncompliant  
#undef __TIME__   //Noncompliant  

#define __cplusplus 3 //Noncompliant  
#undef __cplusplus //Noncompliant  

#define break 3 //Noncompliant  
#undef break //Noncompliant  

#define pow 3 //Noncompliant  
#undef pow //Noncompliant  


#define example 3 //Compliant 
#undef example //Compliant 

#define example 7 //Compliant

In this example, Polyspace flags preprocessor directives that define or undefine reserved C++ identifiers and macros. For instance:

  • Defining and undefining __TIME__ is noncompliant because __TIME__ is a reserved C++ macro.

  • Defining and undefining __cplusplus is noncompliant because __cplusplus is a reserved C++ macro.

  • Defining and undefining break is noncompliant because break is a reserved C++ identifier.

  • Defining and undefining pow is noncompliant because pow is a reserved C++ function.

  • Defining, undefining, and redefining example is compliant because example is not a reserved C++ macro, identifier, or function.

Check Information

Group: Library Introduction
Category: Required

Version History

Introduced in R2013b