タグ付けされた質問 「static-analysis」

プログラムを実行せずにソースコードまたはオブジェクトコードを分析する。これは、自動化されたツールまたは人間による分析によって行われます。

5
プロジェクトの規模と言語の厳密さとの間に相関関係はありますか?
私の同僚に言語の厳密さとパラダイムの違いを説明して、私は次のように断言しました: 動的言語やインタープリター言語などのトレラント言語は、プロトタイプや小規模プロジェクト、または中規模のWebアプリケーションに最適です。Node.jsでPythonやJavaScriptなどのエレガントな動的言語を選択する場合の利点は次のとおりです。 迅速な開発、 定型コードの削減、 Javaのような「企業言語」から逃げる若くて創造的なプログラマを引き付ける能力。 静的に型指定された/コンパイルされた言語は、ビジネスに不可欠なアプリや、中規模から大規模のアプリ向けのアプリなど、より厳密なものが必要なアプリケーションに最適です。 数十年にわたって開発された有名なパラダイムとパターン、 静的チェックの容易さ、 数十年の経験を持つ多くのプロの開発者を見つける能力。 Haskell、Adaなどの厳格な言語、またはC#のコードコントラクトなどの手法は、ライフクリティカルなシステムや非常に安定していると予想されるシステムなど、柔軟性よりも安全性を重視するシステム(Has​​kellが非常に柔軟である場合でも)に適しています。利点は次のとおりです。 コンパイル時に可能な限り多くのバグをキャッチする機能、 静的チェックの容易さ、 正式な証明のしやすさ。 しかし、大企業が大規模プロジェクトに使用している言語と技術を見ると、私の主張は間違っているようです。たとえば、Pythonは、YouTubeやその他のGoogleアプリケーションなど、重要な量の厳密性を必要とする大規模システムに使用されています。 プロジェクトの規模と使用すべき言語/パラダイムの厳密さとの間にはまだ相関関係がありますか? 考慮するのを忘れた3番目の要因はありますか? 私はどこが間違っていますか?

4
メソッドが複数のタイプのチェック済み例外をスローしないのはなぜですか?
SonarQubeを使用してJavaコードを分析しますが、このルール(クリティカルに設定)があります。 パブリックメソッドは最大で1つのチェック済み例外をスローする必要があります チェック例外を使用すると、メソッド呼び出し元はエラーを伝播または処理することでエラーを処理します。これにより、これらの例外はメソッドのAPIの一部になります。 呼び出し元の複雑さを合理的に保つために、メソッドは複数の種類のチェック済み例外をスローするべきではありません。」 ソナーの別のビットにはこれがあります: パブリックメソッドは最大で1つのチェック済み例外をスローする必要があります チェック例外を使用すると、メソッド呼び出し元はエラーを伝播または処理することでエラーを処理します。これにより、これらの例外はメソッドのAPIの一部になります。 呼び出し元の複雑さを合理的に保つために、メソッドは複数の種類のチェック済み例外をスローするべきではありません。 次のコード: public void delete() throws IOException, SQLException { // Non-Compliant /* ... */ } 以下にリファクタリングする必要があります。 public void delete() throws SomeApplicationLevelException { // Compliant /* ... */ } オーバーライドするメソッドはこのルールによってチェックされず、いくつかのチェックされた例外をスローできます。 例外処理に関する私の読書でこの規則/推奨事項に出くわしたことは一度もなく、このトピックに関する標準、議論などを見つけようとしました。私が見つけた唯一のことはCodeRachからのこれです:メソッドは最大でいくつの例外をスローする必要がありますか? これは広く受け入れられている標準ですか?

4
なぜマイクロソフト「Roslyn」に時間を費やすのでしょうか?
Microsoft "Roslyn"のホワイトペーパーと例のいくつかを読んでいるところですが、このコンセプトは非常に興味深いようです。私が知ることができることから、コンパイラであるブラックボックスを開き、Visual Studioで記述されたコードに関する情報とメトリックを取得するために使用できるインターフェイスを提供します。 Roslynには、コードを「スクリプト化」してオンザフライでコンパイル/実行する機能もあるようです(CodeDomに似ています)が、私の経験では、そのタイプの機能の使用は限られています。 コード分​​析とメトリック要素は興味深いスペースですが、それは非常に長い間存在しており、コード分析とリファクタリングツール(ReSharper、CodeRushなど)にすでに多くのお金を投資している多くのプロバイダーがあります、nCoverなど)、彼らはそれをかなりうまくやっています! 既存のツールのいずれかのライセンスを購入することで、わずかなコストで提供できるものを実装するために、なぜ会社が邪魔にならないのでしょうか? おそらく、言及されたツールのドメイン外に配置するRoslynプロジェクトの重要な機能をいくつか見落としていました...

8
従来のコードベースの品質基準の低下に反対する方法 [閉まっている]
ここには、想像できない悪いコードを含む大規模なレガシーコードベースがあります。 現在、いくつかの品質基準を定義し、それらを完全に新しいコードベースだけでなく、レガシーコードに触れる場合でも満たすことを望んでいます。 そして、すでに数千件の違反があるSonar(コード分析ツール)でそれらを実施しています。 ここで、レガシーのこれらの違反を減らすための議論が行われました。レガシーだからです。 議論は読みやすさの規則についてです。ネストされたifs / for ..の数など。 さて、レガシーコードのコーディング品質の低下に反対するにはどうすればいいですか?

1
コード分​​析の目的は何ですか?いつ使用する必要がありますか?
Visual Studioのコード分析について聞いたことがありますが、使用しませんでした。私はMSDNを読みましたが、それでもコード分析の実際の使用法を理解していません。 StyleCopと同じではありませんか? どこかで、FxCopも言及されました。コード分​​析との違いは何ですか? すべてのプロジェクトでコード分析を使用する必要がありますか?同僚が行ったコードレビューは不十分ですか?

10
エントロピーの概念を使用して、ソースコードを便利な方法で分析できますか?
複雑さの相対的な価値を生み出すルールを含む静的ソースコード分析のコンテキストを定義できると私には思えます。ソースコードには「エネルギー」がないため、物理的な意味ではそうではないことはわかっていますが、少なくとも学問的には類似性を引き出す努力が行われていると確信しています。これについての知識はありますか?

3
静的分析の型に代わるものはありますか?
プログラミング言語での静的型付けは、コンパイル時に特定の保証を強制するのに役立ちますが、型はこの仕事のための唯一のツールですか?不変条件を指定する他の方法はありますか? たとえば、言語または環境は、配列の長さ、または関数への入力間の関係に関する保証を実施するのに役立ちます。型システム以外では、このようなことは聞いたことがありません。 関連することは、静的分析を行うための非宣言的な方法があるかどうかです(ほとんどの場合、型は宣言的です)。

3
複雑さと到達可能性の間に相関関係はありますか?
最近、uniで循環的複雑度(McCabe)とソフトウェアの到達可能性を研究しています。今日、私の講師は、2つの測定値の間に相関関係はないと述べましたが、これは本当ですか? それほど複雑ではないプログラム(これまで見てきたわずかなものから)が到達可能性の点で「より良い」結果をもたらすように見えるので、間違いなく何らかの相関関係があると思います。 誰もが2つのメトリックを一緒に見ようとする試みを知っていますか?そうでない場合、多数のプログラムの複雑さと到達可能性の両方に関するデータを見つけるのに適した場所は何ですか?

7
静的コード分析の本当の利点は何ですか?
pc-lintやQACなどのツールを使用して、コードベースで静的コード分析を実行できます。 私の経験では、静的解析はしばしば大量のノイズ、つまり実際のバグではないが特定のルールセットのルールの1つに違反するものに関する警告を生成します。特定のルールを無効にする(ルールセットで有効にするか、コード内の特別なコメントを使用する)ことは、本当に面倒なプロセスです。 静的コード分析の本当の利点は何ですか?

7
静的解析の落とし穴を避ける方法
私はジョエル・テストで少なくとも11点を獲得する会社で働いています。少なくとも紙の上では。 ただし、実際には、期待どおりに機能するものはなく、プロジェクトはDEFCON 1で半年間使用されています。今、私の同僚のほとんどは、日曜日の午後6時に帰宅できれば幸いです。 動作していないように感じた一見良いプラクティスの1つは、静的分析ツールの使用です。このプロジェクトは、gcc -Wall警告と独自の非常に高価な「C / C ++」ツールの両方を追跡します。 GCCの警告は、実際の(ほとんどの場合、不快ではない)バグを指すことはほとんどありません。 ただし、プロプライエタリなツールは、暗黙的なキャストや文字列リテラルのsizeof'ingなどをリストします。暗黙のキャストもスタイルブックでブラックリストに載っています。 標準的な慣行では、すべての警告を黙らせる必要があります。これにより、主に誤検知である警告が除外されることに注意してください。これは問題ではありません。 結果は次のとおりです。 人々はすべての右辺値とすべての引数に型キャストを追加し、プロセスで実際に問題のある型の不一致を隠します。 人々は1つのバグで紹介するか、別の問題のある言語機能を使用します(sizeofの代わりにstrlen、strcpyの代わりにstrncpyなど)。 警告は沈黙します。 バグレポートが開始されます。 主なポイントは、元のコードが機能しており、言語能力の範囲内で安全に遊んでいた人々によって書かれていたのに対し、修正はそうではなかったことです。 今、私はこの会社が救われるとは考えていません。ただし、「プロ」ツールを使用するためのより良い、できれば機能する方法があるかどうか、または私が将来決定を下す場合にそれらの使用を完全に避けるべきかどうかを知りたいです。 すべてのプログラマーが失敗することのない天才だとは限らないソリューション。なぜなら、そうであれば、そもそもツールを使用する必要がないからです。

5
アルゴリズムのランダウ表記(Big OまたはTheta表記)をプログラムで見つけるには?
私は、アルゴリズムを可能な限り最適化するために、手作業でアルゴリズムのLandau(Big O、Theta ...)表記を検索するのに慣れていますが、関数が本当に大きく複雑になっているとき、それはうまくいきません手でやるには時間がかかりすぎます。また、ヒューマンエラーが発生しやすくなります。 私はCodi​​lity(コーディング/アルゴリズム演習)に時間を費やし、提出されたソリューションのLandau表記(TimeとMemoryの両方の使用量)が表示されることに気付きました。 私は彼らがそれをどのように行うのだろうと思っていました...どのようにあなたはそれをしますか? 字句解析またはコードの解析以外の方法はありますか? この質問は主にPHPやJavaScriptに関係していますが、私はどんな言語や理論にも心を開いています。

2
gccでビルドするプロジェクトの個人コード分析にClangを使用するのは賢明ですか?
を使用してビルドしているいくつかのCプロジェクトに取り組み始めましたgcc。この選択はいくつかの理由で行われたと思います: アームの非常に早い段階でクロスコンパイルする必要がありました(私はそう思います)。 パフォーマンスは、何よりも重要なスペックです。 gcc 以前も今も簡単な最初の選択です。 私はその選択に異議を唱える理由はなく、とにかくそうする立場にはありません。 単一のプロジェクトのコードベースは比較的小さいです。すべてのプロジェクトは比較的クリーンなMakefile(現在更新中)でビルドされ、gcc -Wall -Wextraほとんど文句を言わず、最小限のテストが行​​われます。自動化された静的分析やコードのフォーマットは行われておらず、コードは構文的に一貫性がありませんが、非常に読みやすく、考え抜かれています。 コードのすべての行を一度に再フォーマットしたくないので、この回答の周りのどこかで説明されているように(特にコンテキストが実際にはそれほど悪くないため)行うつもりです:リファクタリングし、主に、トピックを扱うときはできるだけ再フォーマットしますただし、コードスタイルを意識しないでトピックを取り上げます。残念ながら、私はコードスタイルやコミットの追加チェックを課す立場にはありませんが、ファイルを変更するときは既存のコード規則を尊重する必要があるという同僚の感覚があるように感じます(ただし、現在の状態はわかっていますが)コードの魔法のようなことが起こりませんでした)、そして良いコードを書きたいという欲求。 これは、このような心構えでCでプログラミングするのが初めてであり、さまざまなコード分析ツールと書式設定ツールに非常に惹かれていclangます。 したがって、私の質問の要点は次のとおりです。それclangを使用clangしてビルドしているときに、ヒントに従ってフォーマットおよび分析ツールを使用すると問題が発生する可能性がありますgccか?たとえば、一部の警告は、内部表現gccが使用しないか、バイトコードclangが生成しgccないものから発生する可能性があります。 警告ヒントが意味をなすように、gccコンパイルパラメータ(主にターゲットアーキテクチャと最適化レベル)を自動的に渡す良い方法はありclangますか? 私が精通していることgccとそのエラー報告を追加します。私は、より適切な言葉でわかりやすい警告だけでなく、より多くの(関連する)警告とエラーを取得することに関心があります。したがって、1 日の終わりclangに構築するために、その内部表現に基づいて生成できる追加のヒントを信頼できない場合、私はこれを行うことにあまりgcc興味がありません。 私は多くのコンテキストを含めたので、どんな発言をしても、私が持ち出せなかった根本的な質問に気軽に答えてください。

3
静的分析に依存して並行性バグを確実に「再現」することは安全ですか?
データをクエリするスレッドと同じデータを更新するIOイベントを同期するときに、いくつかの同時実行バグが潜んでいると思われるJavaコードを継承しました。ThreadSafeと呼ばれる静的分析ツールを試しています。これは、さまざまな同時実行性の問題(つまり、非同期に呼び出されたメソッドから同期されていないフィールドにアクセスしたフィールドと、コレクションへのアクセスの一貫性のない同期)を実際に検出します。 単体テストを作成してデータの競合を確実に再現することがどれほど難しいかを発見した後、バグを確実に「再現」するためにThreadSafeに依存することが賢明かどうか疑問に思いましたか?私が求めているのは、バグをいつ修正したかを静的分析ツールに頼って教えても安全ですか?(もちろん、バグを修正するには、状況に応じてそれぞれを理解する必要があります)。

2
Googleスケールでソースからコードベース全体を構築するにはどうすればよいですか?
最初の答え古い、最近アクティブに質問にリンクされている動画、Googleのリポジトリがどのように行われるかについて語っています。 言及された興味深いことの1つは、バイナリに依存することなく、すべてがソースからビルドされるという事実です。これは、依存関係が古くなって他のプロジェクトでまだ使用されているという問題を回避するのに役立ちます。 技術的にどのように可能ですか?私の会社で同じことを試してみると、会社のコードベースの規模とGoogleのコードベースの規模の大きなギャップを考慮しても、2つの理由で不可能です。 IDE(Visual Studio)は、たとえば50のプロジェクトを含む小さなソリューションでさえ大きな影響を受けるため、すぐに応答しなくなります。 静的分析は、コードベース全体のサイズによって処理されます。たとえば、コードメトリックスまたはコードコントラクトの静的チェックはほとんど不可能です(コードコントラクトはおそらく数日または数週間かかります)。 継続的インテグレーションでは、コンパイルにも非常に時間がかかり、多くの依存関係を持つプロジェクトが変更されるとすぐにサーバーがクランチされ、プロジェクトの大きなツリーを再コンパイルする必要があります。 中小企業はこれらの問題をどのようにして回避し、次のことができるのでしょうか。 パフォーマンスの低下に影響されずにIDEを使用します。 変更の結果、大量のコードベースを再コンパイルする必要がある場合でも、サーバーをクランチせずにコミットするたびにコードをコンパイルしますか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.