確かに、オープンソースプロジェクトとクローズドプロジェクトのどちらのコードが優れているのか疑問に思いましたか?私たちのブログを読んだ後、あなたはすべてのバグがオープンソースプロジェクトによって収集されたと思うかもしれません。しかし、そうではありません。エラーは、保存方法に関係なく、すべてのプロジェクトに存在します。そして、品質が向上すると品質も向上します。これは、1つのプロジェクトで2年間バグが修正された方法についての小さなメモですが、5分で修正できた可能性があります。
イベントの年代学
Minetestは、約200,000行のC、C ++、およびLuaコードを含むオープンソースのクロスプラットフォームゲームエンジンです。これにより、ボクセル空間でさまざまなゲームモードを作成できます。マルチプレイヤー、および多くのコミュニティmodをサポートします。
2018年11月10日、プロジェクトのバグトラッカーで問題番号7852が 開かれました -item_image_button []:ボタンが小さすぎます。
説明は次のとおりです。
ボタンが小さすぎるため、画像が境界線を超えています。ボタンは在庫スロットと同じサイズである必要があります。以下の例を参照してください(幅と高さ1を使用)。そしてスクリーンショット:
スクリーンショットでは、ボタンの内側の領域の境界の外側に写真のわずかな流出を見ることができます。バグは2018年に気づき、その理由は2020年に発見されまし
た。この素晴らしいストーリーの次のイベントは、2020年7月の技術記事「PVS-Studio:セルフホストエージェントを使用したAzureDevOpsでのプルリクエストの分析」の公開でした。 今年の。アナライザーをAzureDevOpsに統合する例を示すために、同じゲームが選択されました-minetest。この記事にはいくつかのエラーが含まれていますが、特定の1つに関心があります:
V636'rect.getHeight()/ 16'式は、 'int'タイプから 'float'タイプに暗黙的にキャストされました。部分的な部分の損失を回避するために、明示的な型キャストを利用することを検討してください。例:double A =(double)(X)/ Y;。hud.cpp 771
void drawItemStack(....)
{
float barheight = rect.getHeight() / 16;
float barpad_x = rect.getWidth() / 16;
float barpad_y = rect.getHeight() / 16;
core::rect<s32> progressrect(
rect.UpperLeftCorner.X + barpad_x,
rect.LowerRightCorner.Y - barpad_y - barheight,
rect.LowerRightCorner.X - barpad_x,
rect.LowerRightCorner.Y - barpad_y);
}
幅と高さの値を16で割ると、結果の一部が破棄されます。整数分割。
そして今、6ヶ月後に、分析の結果は、ゲーム開発者によって認められた、と の問題10726 - 修正エラーが作成されたプロの静的コードアナライザによって見つけ、彼らがこのバグとの間の接続を確立ところ、 問題#7852を。この丸みと歪んだボタンサイズ。
結論
静的コードアナライザーを使用すると、コード内のエラーを特定する時間を大幅に節約できます。説明されているバグは重要ではないと主張することができますが、私たちの経験では、これは重大度のエラーの典型的なライフサイクルであることが示されています。
ここに重大なバグがあったとしましょう。彼らはそれを修正するために全力を尽くし、1時間のデバッグでそれを見つけて修正したでしょう。しかし、アナライザーはそれでも数分でそれを見つけるでしょう。
したがって、エラーを自動的に見つける方法は、開発されたプロジェクトに否定できない利益をもたらすと結論付けることができます。 PVS-Studioのようなツールは、このプロセスの代わりではなく、他のプログラマーによるコードレビューへの追加と見なされるべきです。
この記事を英語を話す聴衆と共有したい場合は、翻訳リンクSvyatoslavRazmyslovを使用してください。 バグを見つけるのにそれほど時間がかかる必要がありましたか?..。