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:
9 | ipick = USENTENCEG_Pick(isentenceg, name); |
name всегда не null, скорее имелась в виду проверка на name[0].
explode.cpp
C++ Source Code:
3 | pev->origin = pev->origin; |
Ну здесь и так понятно.
squeakgrenade.cpp
C++ Source Code:
1 | else if (pev->movetype = MOVETYPE_FLY) |
3 | pev->movetype = MOVETYPE_BOUNCE; |
Типичная ошибка - оператор присваивания там, где нужен оператор сравнения.
agrunt.cpp
C++ Source Code:
1 | if ( HasConditions( bits_COND_SEE_ENEMY ) ) |
4 | return &slAGruntRangeAttack1[ 0 ]; |
8 | // attack an unseen enemy |
9 | // return &slAGruntHiddenRangeAttack[ 0 ]; |
10 | return &slAGruntRangeAttack1[ 0 ]; |
Одинаковые инструкции в ветвлении 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++) |
4 | m_iIsATeam[i] = TEAM_NO; |
5 | m_bHasBeenSorted[i] = false; |
Булевый массив имеет размер 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 не устраивает? 
__________________
Отправлено 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 - халявный. 
__________________
Отправлено 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'