Я знаю, что неопределенное поведение потенциально может вызвать что угодно, что делает любую программу, содержащую UB, потенциально бессмысленной. Мне было интересно, есть ли способ определить самую раннюю точку в программе, в которой неопределенное поведение может вызвать проблемы. Вот пример, иллюстрирующий мой вопрос.
void causeUndefinedBehavior()
{
//any code that causes undefined behavior
//every time it is run
char* a = nullptr;
*a;
}
int main()
{
//code before call
//...
causeUndefinedBehavior();
//code after call
//...
}
Насколько я понимаю, возможные моменты неопределенного поведения могут быть вызваны (не обязательно проявлены):
- Когда
causeUndefinedBehavior()
компилируется. - Когда
main()
компилируется. - Во время работы программы.
- В момент выполнения
causeUndefinedBehavior()
.
Или точка, в которой вызывается неопределенное поведение, совершенно разная для каждого случая и каждой реализации?
Кроме того, если я закомментирую строку, где вызывается causeUndefinedBehavior()
, устранит ли это UB, или он все еще будет в программе, поскольку код, содержащий UB, был скомпилирован?