Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Почему драйверы для Windows 8 глючат 
:(
    Опции темы
Thunderbolt
Дата 1.5.2013, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


DevRel
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 7.11.2007
Где: Тула

Репутация: нет
Всего: 16



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

Статья длинная и сюда не поместится. Дам ссылку: Почему драйверы для Windows 8 глючат
--------------------
Карпов Андрей, DevRel в PVS-Studio.
PM MAIL WWW   Вверх
feodorv
Дата 1.5.2013, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



Спасибо за очередную статью!

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

#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 


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
volatile
Дата 2.5.2013, 00:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 13
Всего: 85



Цитата

Когда-то давно, оператор '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)



Это сообщение отредактировал(а) volatile - 2.5.2013, 00:46
PM MAIL   Вверх
feodorv
Дата 2.5.2013, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 9
Всего: 45



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

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

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


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
akizelokro
Дата 3.9.2013, 05:17 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: нет
Всего: 5



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

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

Это сообщение отредактировал(а) akizelokro - 3.9.2013, 05:20


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0679 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.