Прогнал сорцы через 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
elseif (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 с помощью этой проги.
XaeroX, про cppcheck не знал, спасибо. А у PVS-Studio просто контора в том же городе, где я живу, так про них и узнал. Раньше статическими анализаторами не интересовался.
Таки да, в триал версии уже половину тыков в вижуал студии натыкал, но даже когда они кончатся, я так понял, можно будет продолжать использование.
Цитата:
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 не нашёл.
Это оставляется, чтобы потом была возможность быстро включить.
Цитата:
FreeSlave писал: fprintf ( file, "\n", j );
Это вообще пофигу. Ну не используется аргумент, только и всего. Гораздо опаснее конструкции, типа
C++ Source Code:
fprintf( file, "%s", j );
где j - int.
Цитата:
FreeSlave писал: Булевый массив имеет размер 64 (кстати, почему здесь false, а не FALSE?), константа NUM_ROWS равна 74, происходит выход за пределы массива.
Страус Труп предусмотрительно убрал проверку на выход за пределы массива в спецификации языка С++. Наслаждайтесь.
А что касается ксаша, так он был прогнан через PVSStudio и cppcheck в тот самый момент, когда первый был анонсирован на хабре. Я его сразу же скачал и прогнал. Нашел 10 некритичных ошибок и пару не то чтобы критичных, но потенциально неприятных.