Main Content

MISRA C++:2023 Rule 25.5.1

The setlocale and std::locale::global functions shall not be called

Since R2024b

Description

Rule Definition

The setlocale and std::locale::global functions shall not be called.

Rationale

A call to the setlocale() or std::locale::global() function can introduce data races with other calls to the setlocale() function, or with calls to functions that use the locale such as fprintf() and tolower().

Polyspace Implementation

The checker reports a violation on explicit calls to the setlocale() or std::locale::global() functions.

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 this example, all uses of setlocale() violate the rule.

#include <stdio.h>
#include <locale.h>
#include <time.h>
#include <wchar.h>
 
int main(void)
{
    setlocale(LC_ALL, "en_US.UTF-8");     //Noncompliant
    setlocale(LC_NUMERIC, "de_DE.utf8");  //Noncompliant
    setlocale(LC_TIME, "ja_JP.utf8");     //Noncompliant
 
    wchar_t timeString[100];
    time_t currentTime = time(NULL);
    wcsftime(timeString, 100, L"%A %c", localtime(&currentTime));
    wprintf(L"Number: %.2f\nDate: %ls\n", 3.14, timeString);
}

Check Information

Group: Localization Library
Category: Required

Version History

Introduced in R2024b