MISRA C++:2023 Rule 25.5.3
The pointer returned by the C++ Standard Library functions
asctime, ctime, gmtime,
localtime, localeconv, getenv,
setlocale or strerror must not be used following a
subsequent call to the same function
Since R2024b
Description
Rule Definition
The pointer returned by the C++ Standard Library functions
asctime, ctime, gmtime,
localtime, localeconv, getenv,
setlocale or strerror must not be used following a
subsequent call to the same function.
1
Rationale
The C Standard allows nonreentrant functions such as getenv to return
a pointer to a static buffer. Because the buffer is static, a second
call to getenv can modify the buffer. If you continue to use the pointer
returned from the first call past the second call, you can see unexpected results. The
buffer that it points to might no longer contain values
from the first call.
The same rationale is true for other nonreentrant functions covered by this rule. For the purposes of this rule, calls to these pairs of functions are treated as calls to the same function:
setlocaleandlocaleconvasctimeandctimegmtimeandlocaltime
Polyspace Implementation
Polyspace® reports violations of this rule when these events happen in this sequence:
You point to the buffer returned from a nonreentrant standard function such as
getenvorsetlocale.user = getenv("USER");You call that nonreentrant standard function or its matching pair again.
user2 = getenv("USER2");You use or dereference the pointer from the first step expecting the buffer to remain unmodified since that step. In the meantime, the call in the second step has modified the buffer.
For instance:
var=*user;
In some cases, a violation can appear when you do not call the
getenv function a second time but simply return the pointer. For
example:
char* func() {
user=getenv("USER");
.
.
return user;
}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
Check Information
| Group: Localization library |
| Category: Mandatory |
Version History
Introduced in 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.