HLFX.Ru Forum
профиль •  правила •  регистрация •  календарь •  народ •  FAQ •  поиск •  новое •  сутки •  главная •  выход  
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > PVS-Studio
Статический анализ исходного кода HL
  Предыдущая тема   Следующая тема
Автор
Тема Новая тема    Ответить
FreeSlave
Житель форума

Дата регистрации: Nov 2007
Проживает: Тула
Сообщений: 1088

Рейтинг



PVS-Studio

Прогнал сорцы через PVS-Studio - выявляет потенциальные ошибки, о которых не говорит компилятор, имеет интеграцию с visual studio, в том числе с 2005-ой. Вот, кстати, Твит самого дяди Кармака по поводу программы - https://twitter.com/ID_AA_Carmack/s...763219536429056

Некоторые интересные вещи в коде HL (серверная часть):

zombie.cpp:

C++ Source Code:
if ((m_Activity == ACT_MELEE_ATTACK1) || (m_Activity == ACT_MELEE_ATTACK1))

Идентичные условия

sound.cpp:
C++ Source Code:
1
char name[64];
2
int ipick;
3
 
4
if (!fSentencesInit)
5
  return -1;
6
 
7
name[0] = 0;
8
 
9
ipick = USENTENCEG_Pick(isentenceg, name);
10
if (ipick > 0 && name)
11
  ...

name всегда не null, скорее имелась в виду проверка на name[0].

explode.cpp
C++ Source Code:
1
else
2
{
3
  pev->origin = pev->origin;
4
}

Ну здесь и так понятно.

squeakgrenade.cpp
C++ Source Code:
1
else if (pev->movetype = MOVETYPE_FLY)
2
{
3
  pev->movetype = MOVETYPE_BOUNCE;
4
}

Типичная ошибка - оператор присваивания там, где нужен оператор сравнения.

agrunt.cpp
C++ Source Code:
1
if ( HasConditions( bits_COND_SEE_ENEMY ) )
2
{
3
  //normal attack
4
  return &slAGruntRangeAttack1[ 0 ];
5
}
6
else
7
{
8
  // attack an unseen enemy
9
  // return &slAGruntHiddenRangeAttack[ 0 ];
10
  return &slAGruntRangeAttack1[ 0 ];
11
}

Одинаковые инструкции в ветвлении if-else (подобная ошибка есть ещё в паре мест).

nodes.cpp
C++ Source Code:
fprintf ( file, "\n", j );

Здесь по идее и хороший компилятор бы подсказал, что аргументы не соответствуют формату, но вижуал студия промолчала, PVS же нашла.

На клиенте:

vgui_ScorePanel.cpp
C++ Source Code:
1
for (int i = 0; i < NUM_ROWS; i++)
2
{
3
  m_iSortedRows[i] = 0;
4
  m_iIsATeam[i] = TEAM_NO;
5
  m_bHasBeenSorted[i] = false;
6
}

Булевый массив имеет размер 64 (кстати, почему здесь false, а не FALSE?), константа NUM_ROWS равна 74, происходит выход за пределы массива.

Было много других вещей, относящихся скорее к оформлению кода, местам, где разработчики не успели что-то дописать (опять же, одинаковые ветвления в if-else скорее означают, что предполагалось, что ветвления будут разными, но сроки поджимали и оставили как есть) и старому стилю (типа проверки указателя на null после выделения памяти с помощью new - сейчас рекомендуется ловить исключения).

В общем-то, штука эта работает и Кармак одобряет. Может, кто-нибудь проанализирует xash с помощью этой проги.

Сообщить модератору | IP: Записан
Сообщение: 120631

Старое сообщение 28-05-2013 21:58
- За что?
marikcool
Житель форума

Дата регистрации: Jul 2011
Проживает: kz
Сообщений: 1522
Возраст: 39

Рейтинг



кинь в личку ссылку на pvs-studio, свои исходники погоняю)

__________________
vk.com/skullcapstudios

Сообщить модератору | IP: Записан
Сообщение: 120637

Старое сообщение 29-05-2013 05:09
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 35059
Нанёс повреждений: 514 ед.
Возраст: 39

Рейтинг



Награды
 
[1 награда]


Чем вас старый добрый cppcheck не устраивает?

__________________

Сообщить модератору | IP: Записан
Сообщение: 120638

Старое сообщение 29-05-2013 05:16
-
FreeSlave
Житель форума

Дата регистрации: Nov 2007
Проживает: Тула
Сообщений: 1088

Рейтинг



XaeroX, про cppcheck не знал, спасибо. А у PVS-Studio просто контора в том же городе, где я живу, так про них и узнал. Раньше статическими анализаторами не интересовался.

marikcool, http://www.viva64.com/ ссылка же есть в твите Кармака.

Сообщить модератору | IP: Записан
Сообщение: 120654

Старое сообщение 29-05-2013 13:17
- За что?
 XaeroX
Crystice Softworks

Дата регистрации: Oct 2005
Проживает: Торонто
Сообщений: 35059
Нанёс повреждений: 514 ед.
Возраст: 39

Рейтинг



Награды
 
[1 награда]


Цитата:
FreeSlave писал:
А у PVS-Studio просто контора в том же городе, где я живу, так про них и узнал

Он платный, зараза...
А cppcheck - халявный.

__________________

Сообщить модератору | IP: Записан
Сообщение: 120655

Старое сообщение 29-05-2013 13:28
-
FreeSlave
Житель форума

Дата регистрации: Nov 2007
Проживает: Тула
Сообщений: 1088

Рейтинг



Таки да, в триал версии уже половину тыков в вижуал студии натыкал, но даже когда они кончатся, я так понял, можно будет продолжать использование.

Цитата:

potential user gets a full-blown version of the code analyzer. They can use it to check any projects as many times as needed. They get the whole message list. But they have a limited number of clicks (transfers to code)
.

В любом случае, прогнать уже написанный проект будет полезно, может быть pvs найдет что-нибудь, чего cppcheck не нашёл.

Сообщить модератору | IP: Записан
Сообщение: 120660

Старое сообщение 29-05-2013 14:56
- За что?
 Дядя Миша
racing for fish

Дата регистрации: Oct 2005
Проживает: Кубань
Сообщений: 33059
Нанёс повреждений: 392 ед.

Рейтинг



Цитата:
FreeSlave писал:
if ((m_Activity == ACT_MELEE_ATTACK1) || (m_Activity == ACT_MELEE_ATTACK1))

Ни на что не влияет.
Цитата:
FreeSlave писал:
char name[64];
int ipick;

if (!fSentencesInit)
return -1;

name[0] = 0;

ipick = USENTENCEG_Pick(isentenceg, name);
if (ipick > 0 && name)

Вторая проверка бессмысленна в любом случае, достаточно посмотреть код вызываемой функции.
Цитата:
FreeSlave писал:
else if (pev->movetype = MOVETYPE_FLY)
{
pev->movetype = MOVETYPE_BOUNCE;
}

Выглядит жутковато, но на работоспособность не влияет, т.к. условие превращается в else, что соответствует логике работы.
Цитата:
FreeSlave писал:
{
//normal attack
return &slAGruntRangeAttack1[ 0 ];
}
else
{
// attack an unseen enemy
// return &slAGruntHiddenRangeAttack[ 0 ];
return &slAGruntRangeAttack1[ 0 ];
}

Это оставляется, чтобы потом была возможность быстро включить.
Цитата:
FreeSlave писал:
fprintf ( file, "\n", j );

Это вообще пофигу. Ну не используется аргумент, только и всего. Гораздо опаснее конструкции, типа
C++ Source Code:
fprintf( file, "%s", j );

где j - int.
Цитата:
FreeSlave писал:
Булевый массив имеет размер 64 (кстати, почему здесь false, а не FALSE?), константа NUM_ROWS равна 74, происходит выход за пределы массива.

Страус Труп предусмотрительно убрал проверку на выход за пределы массива в спецификации языка С++. Наслаждайтесь.

А что касается ксаша, так он был прогнан через PVSStudio и cppcheck в тот самый момент, когда первый был анонсирован на хабре. Я его сразу же скачал и прогнал. Нашел 10 некритичных ошибок и пару не то чтобы критичных, но потенциально неприятных.

__________________
My Projects: download page

F.A.Q по XashNT
Блог разработчика в телеграме

Цитата:

C:\DOCUME~1\C4C5~1\LOCALS~1\Temp\a33328if(72) : see declaration of 'size_t'

Сообщить модератору | IP: Записан
Сообщение: 120669

Старое сообщение 29-05-2013 15:55
-
Тема: (Опционально)
Ваш ответ:



Переводчик транслита


[проверить длину сообщения]
Опции: Автоматическое формирование ссылок: автоматически добавлять [url] и [/url] вокруг интернет адресов.
Уведомление по E-Mail: отправить вам уведомление, если кто-то ответил в тему (только для зарегистрированных пользователей).
Отключить смайлики в сообщении: не преобразовывать текстовые смайлики в картинки.
Показать подпись: добавить вашу подпись в конец сообщения (только зарегистрированные пользователи могут иметь подписи).

Временная зона GMT. Текущее время 01:37. Новая тема    Ответить
  Предыдущая тема   Следующая тема
HLFX.Ru Forum HLFX.Ru Forum > Теория и практика > Half-Life SDK > PVS-Studio
Статический анализ исходного кода HL
Версия для печати | Отправить тему по E-Mail | Подписаться на эту тему

Быстрый переход:
Оцените эту тему:

Правила Форума:
Вы not можете создавать новые темы
Вы not можете отвечать в темы
Вы not можете прикреплять вложения
Вы not можете редактировать ваши сообщения
HTML Код ВЫКЛ
vB Код ВКЛ
Смайлики ВКЛ
[IMG] Код ВКЛ
 

< Обратная связь - HLFX.ru >

На основе vBulletin
Авторское право © 2000 - 2002, Jelsoft Enterprises Limited.
Дизайн и программирование: Crystice Softworks © 2005 - 2024