LINUX.ORG.RU

История изменений

Исправление byko3y, (текущая версия) :

Отвечаю по пунктам:

int c = a + *b;
// Ворнинг: сложение может переполниться. Рекомендуем выполнить сложение в типе long long и проверить результат.

В языках с поддержкой сильных типов есть проверка границ в рантайме. Также, здесь может быть опущена операция обрезания числа, если a или b имеют тип «long».

// Ворнинг: b может быть равен nullptr. Рекомендуем добавить проверку

Для этого в крестах ввели поддержку ссылок. Практически всегда сишный указатель — это на самом деле ссылка. Отсюда некорректные оптимизации, которые ломали работающий код, если в коде указатель был указателем, а не ссылкой. Этот костыль подперли костылем volatile, а потом какой-то поехавший из GCC обкурился стандартов и решил ввести правило strict aliasing, которое невозможно проверить во время компиляции и нарушение невозможно обнаружить в отладочной сборке.

// Ворнинг: a может быть не инициализирован. Пожалуйста, проверьте все динамические пути работы программы, ведущие к данной строке, и убедитесь, что а всегда инициализирован.

Правильное предупреждение.

// Ворнинг: c используется только в cout на следующей строке и поэтому не будет сохранён на стек.

Неправильное предупреждение. Хз, откуда его взяли.

// Ворнинг: убедитесь, что указатель b не нарушает правила strict aliasing.

Уже ответил: strict aliasing — абсолютное зло, нет никакого оправдания его существованию.

// Ворнинг: убедитесь, что указатель b не был получен выделением динамической памяти, но уже освобождён, либо получен из фрейма уже завершившейся функции.

Опять ссылкопроблемы.

Исходная версия byko3y, :

Отвечаю по пунктам:

int c = a + *b;
// Ворнинг: сложение может переполниться. Рекомендуем выполнить сложение в типе long long и проверить результат.

В языках с поддержкой сильных типов есть проверка границ в рантайме. Также, здесь может быть опущена операция обрезания числа, если a или b имеют тип «long».

// Ворнинг: b может быть равен nullptr. Рекомендуем добавить проверку

Для этого в крестах ввели поддержку ссылок. Практически всегда сишный указатель — это на самом деле ссылка. Отсюда некорректные оптимизации, которые ломали работающий код, если в коде указатель был указателем, а не ссылкой. Этот костыль подперли костылем volatile, а потом какой-то поехавший из GCC обкурился стандартов и решил ввести правило strict aliasing, которое невозможно проверить во время компиляции и нарушение невозможно обнаружить в отладочной сборке.

// Ворнинг: a может быть не инициализирован. Пожалуйста, проверьте все динамические пути работы программы, ведущие к данной строке, и убедитесь, что а всегда инициализирован.

Правильное предупреждение.

// Ворнинг: c используется только в cout на следующей строке и поэтому не будет сохранён на стек.

Неправильное предупреждение. Хз, откуда его взяли.

// Ворнинг: убедитесь, что указатель b не нарушает правила strict aliasing.

Уже ответил: strict aliasing — абсолютное зло, нет никакого оправдания его существованию.

// Ворнинг: убедитесь, что указатель b не был получен выделением динамической памяти, но уже освобождён, либо получен из фрейма уже завершившейся функции.

Опять ссылкопроблемы.