Мы используем куки, чтобы пользоваться сайтом было удобно.
Хорошо
to the top
close form

Заполните форму в два простых шага ниже:

Ваши контактные данные:

Шаг 1
Поздравляем! У вас есть промокод!

Тип желаемой лицензии:

Шаг 2
Team license
Enterprise license
** Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности
close form
Запросите информацию о ценах
Новая лицензия
Продление лицензии
--Выберите валюту--
USD
EUR
RUB
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Бесплатная лицензия PVS‑Studio для специалистов Microsoft MVP
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Для получения лицензии для вашего открытого
проекта заполните, пожалуйста, эту форму
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
Мне интересно попробовать плагин на:
* Нажимая на кнопку, вы даете согласие на обработку
своих персональных данных. См. Политику конфиденциальности

close form
check circle
Ваше сообщение отправлено.

Мы ответим вам на


Если вы так и не получили ответ, пожалуйста, проверьте, отфильтровано ли письмо в одну из следующих стандартных папок:

  • Промоакции
  • Оповещения
  • Спам

>
>
>
Притча о нулевом указателе для ленивых …

Притча о нулевом указателе для ленивых C программистов

07 Мар 2024

Я согласен, что ошибка выделения памяти с помощью malloc редкая ситуация, и после такой ошибки, скорее всего, невозможно полноценное функционирование программы. Но меня удивляет, с каким упорством программисты, приводя эти аргументы, предлагают вообще ничего не делать в такой ситуации. Я не призываю всех делать сложные механизмы восстановления работы после нехватки памяти или использовать заранее выделенные резервные буферы. Многим программам не нужны такие сложные механизмы. Тем не менее я не понимаю, почему хотя бы минимально не обработать такие ситуации корректно. Раз других объяснений пока не хватило, попробую в этот раз рассказать короткую притчу.

1107_The_parable_of_null_pointers_ru/image1.png

Эта статья является расширенным комментарием для дискуссий на некоторых площадках. Поэтому если вы не в контексте, то предварительно отсылаю вас к этим двум публикациям:

Притча

Жила-была компания, занимающаяся разработкой программного обеспечения. Был у них большой клиент, который платил много денег и всё было хорошо. Но потом этот клиент начал жаловаться, что у некоторых пользователей приложения начали падать.

Почему падает вроде понятно — разыменование нулевого указателя. Понятно, да непонятно, так как разработчики не могут у себя проблему воспроизвести. Да ещё и клиент с приватными данными работает. Не пришлёт он тебе ни стектрейс, ни дамп, не позволит провести сеанс удалённой отладки.

Клиент же тем делом всё больше раздражается. Делать что-то надо. Отправляет компания разработчиков с исходниками и отладочными версиями в офис заказчика. Чтобы те баг искали под присмотром и в закрытом контуре.

Дорогое это удовольствие, так команду отвлекать, тем более что ехать нужно было в другую страну.

Нашли они баг. На некоторых 32-битных Windows машинах памяти мало было, или файл подкачки был маленький. Не хватало памяти иногда. Функция выделения памяти malloc возвращала NULL. Нулевой указатель разыменовывался, и программа падала.

Так почему было так сложно всё это сразу понять? А потому, что команда программистов ленивая была и не проверяла, что функция malloc возвращает. Думали, что раз памяти нет, то всё равно сделать ничего нельзя. Пусть программа падает. Она и падала с сообщением про нулевой указатель.

Программа как минимум могла бы напечатать "Out of memory". Это сократило бы время на исследование. Команду бы не пришлось никуда отправлять, а можно было бы быстро выяснить, что за характеристики и настройки у машин, на которых такое происходит. Да ещё бы и клиент более доволен был качеством программного обеспечения.

Вот такая история, которая то ли была, то ли нет. Пишу же я это из-за того, что есть программисты, которые продолжают оспаривать простые вещи. Ищут обоснования, почему не надо проверку писать, вместо того чтобы просто взять и написать код, адекватно реагирующий на различные ситуации.

Мораль

Не ленитесь. Обработайте указатель, который вернула функция malloc (realloc, calloc, strdup и т.д.). Да, проверка может не пригодиться на практике. Возможно, памяти всегда будет достаточно. Но что, вам жалко, что ли? Пишите надёжный код. Не будьте как те программисты из притчи.

Последние статьи:

Опрос:

Попробуйте PVS-Studio бесплатно

Unicorn with gift
Популярные статьи по теме


Комментарии (0)

Следующие комментарии next comments
close comment form