Каковы все распространенные неопределенные поведения, о которых должен знать программист C ++?
Скажи, как:
a[i] = i++;
c++
undefined
undefined-behavior
c++-faq
yesraaj
источник
источник
Ответы:
Указатель
NULL
указателяmemcpy
для копирования перекрывающихся буферов .Переполнение буфера
Целочисленные переполнения
int64_t i = 1; i <<= 72
не определено)Типы, Cast и Const
int i; i++; cout << i;
)volatile
илиsig_atomic_t
при получении сигналаФункция и шаблон
OOP
Исходный файл и предварительная обработка
long int
#if
выраженииБыть классифицированным
источник
Порядок оценки параметров функции - неопределенное поведение . (Это не приведет к сбою, взрыву или заказу пиццы в вашей программе ... в отличие от неопределенного поведения .)
Единственное требование - все параметры должны быть полностью оценены перед вызовом функции.
Это:
Может быть эквивалентно этому:
Или это:
Это может быть либо; дело за компилятором. Результат может иметь значение, в зависимости от побочных эффектов.
источник
Компилятор может переупорядочить части выражения выражения (при условии, что значение не изменилось).
Из оригинального вопроса:
Двойная проверка блокировки. И одна легкая ошибка.
источник
Мой фаворит - «Бесконечная рекурсия в создании шаблонов», потому что я считаю, что это единственный случай, когда неопределенное поведение происходит во время компиляции.
источник
Присваивание константе после удаления
const
с помощьюconst_cast<>
:источник
Помимо неопределенного поведения , существует также такое же неприятное поведение, определяемое реализацией .
Неопределенное поведение возникает, когда программа делает что-то, результат которого не указан стандартом.
Поведение, определяемое реализацией, - это действие программы, результат которого не определен стандартом, но реализация должна быть задокументирована. Пример «Многобайтовые символьные литералы» из вопроса переполнения стека. Есть ли компилятор C, который не может это скомпилировать? ,
Поведение, определяемое реализацией, кусает вас только тогда, когда вы начинаете портировать (но обновление до новой версии компилятора также портирует!)
источник
Переменные могут быть обновлены только один раз в выражении (технически один раз между точками последовательности).
источник
Основное понимание различных экологических ограничений. Полный список приведен в разделе 5.2.4.1 спецификации C. Вот несколько из них;
На самом деле я был немного удивлен ограничением в 1023 метки падежа для оператора switch, я могу предвидеть, что его превышение для сгенерированного кода / lex / parsers довольно легко.
Если эти пределы превышены, у вас есть неопределенное поведение (сбои, недостатки безопасности и т. Д.).
Да, я знаю, что это из спецификации C, но C ++ разделяет эти основные поддержки.
источник
Используется
memcpy
для копирования между перекрывающимися областями памяти. Например:Поведение не определено в соответствии со стандартом C, который включен в стандарт C ++ 03.
7.21.2.1 Функция memcpy
7.21.2.2 Функция memmove
источник
Единственный тип, для которого C ++ гарантирует размер, это
char
. И размер равен 1. Размер всех других типов зависит от платформы.источник
Объекты уровня пространства имен в разных единицах компиляции никогда не должны зависеть друг от друга для инициализации, потому что их порядок инициализации не определен.
источник