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.
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:
setlocale
andlocaleconv
asctime
andctime
gmtime
andlocaltime
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
getenv
orsetlocale
.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