LINUX.ORG.RU

История изменений

Исправление hateyoufeel, (текущая версия) :

Дело не в предупреждении, а в том, чтоfree(p);printf("%p",p);в актуальных и более старых версиях gcc ведёт себя как надо: печатает адрес только что освобождённого блока памяти.

Это не важно. Целочисленное знаковое переполнение тоже ведёт себя как надо, пока не начинает вести как не надо.

Разыменовывать NULL не надо, но вроде бы в -O0 можно вполне быть уверенным что оно его действительно сделает как чтение/запись по нулевому (в x86) адресу. В -O2 вроде бы уже могут быть фокусы. Не вникал т.к. мне не нужно.

Конечно могут. И даже будут. Например, может быть вызвана функция, которую на самом деле никто не вызывал. Но это всё явные случаи UB, про которые все знают. Есть ещё куча более забавных вещей. Например, бесконечный цикл без условий – UB. Или то что указатели нельзя просто так сравнивать друг с другом. У сишников часто от этого мозг лопается, но так написано в стандарте и так реализованы компиляторы. И поэтому C – очень плохой язык.

Исходная версия hateyoufeel, :

Дело не в предупреждении, а в том, чтоfree(p);printf("%p",p);в актуальных и более старых версиях gcc ведёт себя как надо: печатает адрес только что освобождённого блока памяти.

Это не важно. Целочисленное знаковое переполнение тоже ведёт себя как надо, пока не начинает вести как не надо.

Разыменовывать NULL не надо, но вроде бы в -O0 можно вполне быть уверенным что оно его действительно сделает как чтение/запись по нулевому (в x86) адресу. В -O2 вроде бы уже могут быть фокусы. Не вникал т.к. мне не нужно.

Конечно могут. И даже будут. Например, может быть вызвана функция, которую на самом деле никто не вызывал. Но это всё явные случаи UB, про которые все знают. Есть ещё куча более забавных вещей. Например, бесконечный цикл без условий – UB. У сишников часто от этого мозг лопается.