Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Почему драйверы для Windows 8 глючат


Автор: Thunderbolt 1.5.2013, 20:20
Мы проверили пакет Windows 8 Driver Samples, используя анализатор PVS-Studio. И нашли в примерах разнообразные ошибки. Ничего ужасного в этом нет. Ошибки есть везде. Поэтому название звучит громковато. Однако, эти ошибки, действительно, могут представлять опасность. Ведь часто разработчики основывают свои проекты на демонстрационных примерах или заимствуют из них фрагменты кода.

Статья длинная и сюда не поместится. Дам ссылку: http://www.viva64.com/ru/b/0199/

Автор: feodorv 1.5.2013, 22:24
Спасибо за очередную статью!

Просто хочу сделать небольшое замечание:
Код

#define MP_FREE_MEMORY(_Memory)  \
  MpFreeMemory(_Memory); _Memory = NULL;

NDIS_STATUS StaStartScan(....)
{
  ....
  if (pExternalScanRequest != NULL)
    MP_FREE_MEMORY(pExternalScanRequest);
  ....    
}


Цитата

V640 The code's operational logic does not correspond with its formatting. The second statement will always be executed. It is possible that curly brackets are missing. st_scan.c 564

Макрос MP_FREE_MEMORY написан плохо. Вызовы функций не объединены в блок с помощью фигурных скобок. Конкретно здесь ошибки не будет. Просто указатель обнулится в любом случае, независимо был он равен нулю или нет.


Полагаю, что задумка автора макроса была такой:
Код

#define MP_FREE_MEMORY(_Memory)  \
  MpFreeMemory(_Memory), _Memory = NULL

То есть фигурные скобки здесь без надобности smile 

Автор: volatile 2.5.2013, 00:42
Цитата

Когда-то давно, оператор 'new' возвращал 0, если возникала ошибка выделения памяти. Те времена давно прошли. И теперь согласно стандарту, оператор 'new' генерирует в случае ошибки исключение std::bad_alloc().

Если не ошибаюсь, у мелкомягких нью и щас может не кидать исключения, в зависимости от установок, вернее способа линковки проекта.
А из текста не видно, каким образом слинкован проект.


Цитата(feodorv @  1.5.2013,  22:24 Найти цитируемый пост)
Полагаю, что задумка автора макроса была такой:
#define MP_FREE_MEMORY(_Memory)  \
  MpFreeMemory(_Memory), _Memory = NULL
То есть фигурные скобки здесь без надобности   

И даже более того, фигурные скобки там вообще нельзя вставлять, например:
Код

#define MP_FREE_MEMORY(_Memory)  \
 {MpFreeMemory(_Memory); _Memory = NULL;}

 ...
 if (...)
    MP_FREE_MEMORY(_Memory);
 else
    ...

Здесь будет ошибка: else без if
Либо, что хуже, если он обернут в вышележащий иф, то вообще... полный абзац будет ...

С запятыми, я бы тоже честно говоря, поостерегся, например:
Код

(a < b) ? somthing() : MP_FREE_MEMORY(_Memory);

здесь _Memory в любом случае обнулицца, не зависимо от условия.

Наименее опасный вариант в данном случае, имхо:
Код

#define MP_FREE_MEMORY(_Memory)  \
  do {MpFreeMemory(_Memory); _Memory = NULL;} while (0)


Автор: feodorv 2.5.2013, 10:56
Цитата(volatile @  2.5.2013,  01:42 Найти цитируемый пост)
С запятыми, я бы тоже честно говоря, поостерегся

Ну да, по-хорошему должно быть так:
Код

#define MP_FREE_MEMORY(_Memory)  \
  (MpFreeMemory(_Memory), (_Memory) = NULL)
 smile 

Автор: akizelokro 3.9.2013, 05:17
По хорошему, если говорить, то весь кусок кода забавен.
Взяли и присобачили дефайн, в котором для того, чтобы занулить указатель, функцию "переименовали" в CAPSLOCK-функцию.
Весёлая логика!  smile 

Уж проще бы функцию переписать или занулять указатель в коде.
Ладно, буду рассматривать как новоинтересный вариант wrapper'а. 
И, предположу, что начали экономить на зарплате программистов и в Microsoft'е, а это образчик "новоиндийского кода".
При всём уважении к индийским коллегам, но глючки в их коде я забавные видел.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)