Почему компиляция не выдает ошибку для кода, которая приводит к неопределенному поведению - PullRequest
1 голос
/ 11 декабря 2010

Например, статьи обычно говорят, что если malloc и delete сочетаются друг с другом, или говорят, что это неправильно и не делают этого.

Но почему компилятор не проверяет нас?

Будут ли случаи, когда этот вид кода является правильным и предназначенным intended Поэтому компилятор не всегда может сказать, что это неправильно,

Или есть ли какие-либо технические трудности для компиляторачто?

Ответы [ 4 ]

2 голосов
/ 11 декабря 2010

Множество причин.Сверху головы.

  • Некоторое неопределенное поведение может определять эффекты как расширение, специфичное для реализации.

  • Некоторое неопределенное поведение происходит только нав программной среде или на входе, поэтому код может потенциально вызывать неопределенное поведение, но не обязательно делает это.

  • Многие случаи неопределенного поведения трудно диагностировать.Может включать вещи, которые могут потенциально конфликтовать в последующих единицах перевода.Если бы их было легко диагностировать, вполне вероятно, что стандарт потребовал бы реализации для выдачи диагностики, как это происходит во многих случаях.

1 голос
/ 11 декабря 2010

На самом деле теоретически невозможно определить, если в некоторых случаях malloc сочетается с delete. Представьте себе проблему остановки и удаление в конце программы.

1 голос
/ 11 декабря 2010

Итак, что бы вы сказали по этому поводу?

int* p = (int*)malloc(sizeof(p));
foobar(&p);
delete p;

foobar находится в другом модуле компиляции. Вы не знаете, что он делает.

0 голосов
/ 11 декабря 2010

Компилятор не обязательно знает, был ли указатель создан с использованием new, malloc или это просто указатель на что-то в стеке.Однако отладчики памяти, такие как valgrind, могут найти некоторые из этих ошибок.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...