HLFX.Ru Forum
Показать все 7 сообщений этой темы на одной странице

HLFX.Ru Forum (https://hlfx.ru/forum/index.php)
- Half-Life SDK (https://hlfx.ru/forum/forumdisplay.php?forumid=8)
-- PVS-Studio (https://hlfx.ru/forum/showthread.php?threadid=3942)


Отправлено FreeSlave 28-05-2013 в 21:58:

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 с помощью этой проги.


Отправлено marikcool 29-05-2013 в 05:09:

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

__________________
vk.com/skullcapstudios


Отправлено XaeroX 29-05-2013 в 05:16:

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

__________________

xaerox on Vivino


Отправлено FreeSlave 29-05-2013 в 13:17:

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

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


Отправлено XaeroX 29-05-2013 в 13:28:

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

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

__________________

xaerox on Vivino


Отправлено FreeSlave 29-05-2013 в 14:56:

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

Цитата:

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 не нашёл.


Отправлено Дядя Миша 29-05-2013 в 15:55:

Цитата:
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'


Временная зона GMT. Текущее время 17:47.
Показать все 7 сообщений этой темы на одной странице

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