Статические и локальные объекты потока должны быть постоянно инициализированы.
Статические и локальные объекты потока должны быть постоянно инициализированы.
Статические и локальные объекты потока инициализируются в начале выполнения кода. Стандарт языка C++ только частично задает порядок инициализации нескольких статических или локальных объектов потока, и порядок может измениться от сборки до сборки. Если вы инициализируете статический или локальный объект потока от другого такого объекта, компилятор может получить доступ к последнему объекту, прежде чем это будет инициализировано. Чтобы избежать доступа перед инициализацией, инициализируйте статические и локальные объекты потока при помощи объектов, которые оценивают к константе во время компиляции. Инициализация с константами происходит перед инициализацией с переменными и часто происходит во время компиляции.
Это правило применяется к глобальным переменным, статическим переменным, статическим переменным члена класса и статическим переменным функционального осциллографа.
Polyspace® отмечает инициализации статических или локальных объектов потока с помощью инициализаторов и конструкторов, которые не оценивают к константам во время компиляции. К константе - инициализируйте статические или локальные объекты потока, используйте:
constexpr
конструктор только с аргументами константы
Константное выражение
Значение
Поскольку объекты строки используют динамическое выделение памяти неизвестного размера, компилятор не может оценить их во время компиляции. Polyspace отмечает инициализацию объектов строки независимо от того, задаете ли вы инициализатор.
Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.
Группа: Фундаментальные понятия |