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

Притча о нулевом указателе для ленивых 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 и т.д.). Да, проверка может не пригодиться на практике. Возможно, памяти всегда будет достаточно. Но что, вам жалко, что ли? Пишите надёжный код. Не будьте как те программисты из притчи.

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


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

Следующие комментарии next comments
close comment form
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
Ваше сообщение отправлено.

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


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

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