Я хотел бы добавить CXXFLAG
в мои системы сборки, которые заставляют всю базу кода быть четко определенными. Поэтому каждый кусок кода, который статически демонстрирует неопределенное поведение, должен быть отклонен компилятором.Как заставить g ++ отказаться от кода, который демонстрирует неопределенное поведение?
Например reinterpret_cast<A*>(someIntPtr)->aMember
без какого-либо контекста выполнения не определено (а), в то время как int i = bar(); i /= i;
может привести к непредсказуемому поведению (б) в зависимости от оценки во время выполнения bar()
(которые могут возвращать ноль).
Я ожидаю, что (а) случаи будут пойманы, а не обязательно (b).
Может быть, это может поймать 'я/= i' тоже, так как если это не определено поведение, это просто глупо способ сказать' я = 1'. –
Ответы на [Реализация C++, которая обнаруживает неопределенное поведение?] (Http://stackoverflow.com/q/7237963/2509), адрес, который можно сделать с помощью g ++ в этом направлении. – dmckee
@Benjamin Lindley: 'i/i' не является silliy способом сказать' 1', потому что 'i/i' не определено iff' i == 0'. Во всех остальных случаях вы правы, это '1'. – bitmask