История изменений
Исправление 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 не был получен выделением динамической памяти, но уже освобождён, либо получен из фрейма уже завершившейся функции.
Опять ссылкопроблемы.