The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Индекс форумов
Составление сообщения

Исходное сообщение
"Результаты сравнения качества кода открытых и проприетарных ..."
Отправлено Ordu, 08-Май-13 01:57 
>>> Неинициализированные переменные (Uninitialized Variables) 1,374 / 1,692
> Неужели так сложно инициализировать переменные начальными значениями?

Иногда сложно. Случаются такие гадостные ситуации, когда инициализация объекта означает, например, выделение памяти и открытие файлового дескриптора. Естественно, что такая инициализация происходит пошагово, вероятно между "шагами" появляются какие-то вычисления (размер памяти под выделение, или приведение имени файла к каноническому), вычисления могут порождать исключения... Кроме того, можно представить себе большой массив int'ов, который либо после выделения надо заполнять дефолными значения, либо не забыть потом заполнить настоящими. Иногда дефолтных значений нет: логика программы говорит о том, что массив должен быть заполнен специально вычисленными числами. В такой ситуации, лучше не изобретать никаких дефолтных значений: в такой ситуации, если какой-то элемент массива в процессе вычислений будет пропущен и не заполнен, и впоследствии будет произведено чтение из этого элемента, то это можно отловить valgrind'ом. Если же запихнуть дефолтное значение в этот элемент, то valgrind будет считать переменную инициализированной и не ткнёт носом в ошибку.

В общем и целом, чтобы надёжно избавиться от неинициализированной переменной как класса  ошибки, который может привести к уязвимости, надо перелопачивать понятие переменной, уходить от C/C++ понимания переменной, и использовать понимание в стиле Pascal, когда любая переменная может либо хранить какое-то значение, либо быть неинициализированной. И генерировать runtime-исключение, в случае попытки чтения неинициализированной переменной. Но этот подход, как вы понимаете, имеет свои недостатки (переменная перестаёт быть просто ячейкой памяти, и C перестаёт быть кроссплатформенным ассемблером), и эти недостатки неприемлимы ни для С, ни для C++, в общем случае.

ps. Да, и здесь ведь ошибка "неинициализированная переменная" детектится в результате статического анализа кода. И у меня, например, нет уверенности в том, что какой-либо пристойный стиль программирования позволяет обойтись без таких "ошибок". Тут бы valgrind'ом пройтись следом, и посмотреть что скажет анализ времени выполнения. Вовсе не факт, что каждая такая "ошибка" на самом деле ошибка, а не вполне себе работоспособная и здравая задумка программиста.

 

Ваше сообщение
Имя*:
EMail:
Для отправки ответов на email укажите знак ! перед адресом, например, !user@host.ru (!! - не показывать email).
Более тонкая настройка отправки ответов производится в профиле зарегистрированного участника форума.
Заголовок*:
Сообщение*:
 
При общении не допускается: неуважительное отношение к собеседнику, хамство, унизительное обращение, ненормативная лексика, переход на личности, агрессивное поведение, обесценивание собеседника, провоцирование флейма голословными и заведомо ложными заявлениями. Не отвечайте на сообщения, явно нарушающие правила - удаляются не только сами нарушения, но и все ответы на них. Лог модерирования.



Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру