タグ付けされた質問 「software-verification」

プログラムの正当性を証明するための方法と手法に関する質問。

6
実際の正式なプログラム検証
ソフトウェアエンジニアとして、工業製品用のコードをたくさん書いています。クラス、スレッド、いくつかの設計作業、およびパフォーマンスの妥協を伴う比較的複雑なもの。私は多くのテストを行い、テストにうんざりしているので、Coq、Isabelleなどの正式な証明ツールに興味を持ちました...これらのいずれかを使用して、コードにバグがないことを正式に証明できますか?それと?-しかし、これらのツールの1つをチェックアウトするたびに、日常のソフトウェアエンジニアリングに使用できると確信せずに立ち去ります。今、それは私だけである可能性があり、私はそれについてのポインタ/意見/アイデアを探しています:-) 特に、これらのツールの1つを機能させるには、検討中のプログラムのオブジェクト、メソッドなどを証明者に適切に定義するために莫大な投資が必要になるという印象を受けます。それから、証明者は、対処しなければならないすべてのサイズを考えると、蒸気が尽きないのではないかと思います。または、副作用を取り除く必要があるかもしれません(これらの証明ツールは宣言型言語で本当にうまくいくようです)、それが高速ではないため使用できない「実証済みのコード」になるかどうか疑問に思います十分に小さい。また、使用する言語を変更する余裕はありません。JavaまたはC ++である必要があります。OXXXmlでコードを作成するのは上司に伝えることはできません。コードの正確性を証明できます... フォーマルプルーフツールの経験が豊富な人はコメントできますか?再び-私なりLOVE正式な証明ツールを使用して、私は彼らが素晴らしいと思いますが、私は彼らが私は、Java / C ++の卑しい溝から到達することはできません象牙の塔にいるという印象を持っている...(PS:IまたLOVEハスケル、OCamlは...間違った考え方得ることはありません:私は、宣言型言語や形式的な証明のファンですが、私は)私は現実的ソフトウェア工学にその便利を作ることができる方法を確認しようとしています 更新:これはかなり広いので、次のより具体的な質問を試してみましょう:1)証明者を使用して産業用Java / C ++プログラムの正確性を証明する例はありますか?2)Coqはそのタスクに適していますか?3)Coqが適切な場合、最初にCoqでプログラムを作成し、次にCoqからC ++ / Javaを生成する必要がありますか?4)このアプローチは、スレッド化とパフォーマンスの最適化を処理できますか?

6
チューリングの「ハルティング問題‍」を解決するアルゴリズム
この質問は、コンピューターサイエンススタック交換で回答できるため、理論的なコンピューターサイエンススタック交換から移行されました。 7年前に移行され ました。 「アランチューリングは、1936年に、考えられるすべてのプログラム入力ペアの停止問題を解決する一般的なアルゴリズムが存在できないことを証明しました。」 私はのために停止問題を解決するための一般的なアルゴリズムを見つけることができますいくつかの可能なプログラム入力ペアを? プログラミング言語(複数の言語)を見つけることができます。この言語のすべての種類のプログラムに対して、プログラムが終了するか永久に実行されるかを決定できますか?

2
プログラムの正確性、仕様
ウィキペディアから:理論的なコンピューターサイエンスでは、アルゴリズムが仕様に関して正しいと言われているときに、アルゴリズムの正当性が主張されます。 しかし問題は、「適切な」仕様を取得することは簡単な作業ではなく、正しいものを取得するための100%正しい方法(私が知る限り)がないため、単なる推定であるため、 「1つ」のように「見える」という理由だけで述語を仕様としてとるのは、プログラムが「正しく」見えるという理由だけでプログラムを正しいとみなさないのはなぜですか?

4
2つのアルゴリズムが入力に対して同じ結果を返すかどうかをどのように確認しますか?
すべての入力のセットが無限であるときに、2つのアルゴリズム(たとえば、マージソートとナイーブソート)がすべての入力に対して同じ結果を返すかどうかを確認するにはどうすればよいですか? 更新:一般的なケースでアルゴリズム的にこれを行うことがどのように不可能かを説明してくれたベンに感謝します。Daveの答えは、常に機能するとは限らないが、非常に効果的なアルゴリズムと手動(人間の機知と隠phorの対象)の両方の方法の素晴らしい要約です。

1
コンパイル時間の保証に向けてさらに調査しないのはなぜですか?
私はそれがすべてコンパイル時間であり、プログラムをコンパイルするとその実行について多くの保証が行われるという考えが大好きです。一般的に、静的型システム(Has​​kell、C ++など)は、動的型システムよりも強力なコンパイル時保証を提供するようです。 私が理解していることから、Adaはコンパイル時のチェックに関してさらに進んでおり、実行前にさまざまなバグを検出することができます。また、ある時点で、デリケートなフィールド(プログラミングエラーが人命にかかわる可能性がある場合)に選択されたことを考えると、かなり安全だと考えられています。 今、私は疑問に思う:より強力な静的保証が、より文書化され安全なコードにつながるなら、なぜ私たちはその方向でもっと研究しないのか? 欠落しているように見えるものの例はint、基礎となるアーキテクチャのビット数によって決定される範囲を持つジェネリック型を定義する代わりに、範囲を持つことができる言語です(次の例でInt [a..b]は、 aおよびbを含む): a : Int [1..24] b : Int [1..12] a + b : Int [2..36] a - b : Int [-11..23] b - a : Int [-23..11] または(これをAdaから): a : Int [mod 24] b : Int [mod 24] a + b : Int [mod …

2
Hoareスタイルの正当性の証明中に配列を処理する方法
この質問に関する議論の中で、Gillesは、配列を使用するアルゴリズムの正当性の証明には範囲外の配列アクセスがないことを証明する必要があることを正しく述べています。ランタイムモデルによっては、ランタイムエラーが発生したり、配列以外の要素にアクセスしたりします。 このような正当性の証明を実行する一般的な手法の1つは(少なくとも学部の研究では、おそらく自動検証で)、Hoareロジックを使用することです。標準のルールのセットに配列に関連するものが含まれていることは知りません。それらはモナド変数に制限されているようです。 形の公理を追加することを想像できます {0≤i<A.length∧P[A[i]/E]} A[i]:=E; {P}{0≤i<A.length∧P[A[i]/E]} A[i]:=E; {P}\qquad \displaystyle \frac{}{\{0 \leq i \lt A.\mathrm{length} \land {P[A[i]/E]} \}\ A[i] := E;\ \{P\}} ただし、右側の配列アクセスをどのように処理するか、つまり、あるステートメントx := Eの複雑な式一部である場合は、はっきりしません。EEEx:=Ex:=Ex := E 配列アクセスをHoareロジックでモデル化して、無効なアクセスがないことをプログラムの正確性を証明できるようにするにはどうすればよいですか? 答えが我々以外の文で使用される配列要素を許可しないと仮定することができるまたはいくつかの一環としてEにおけるX := Eこの表現を制限しないように。一時的な変数にいつでも必要な値を割り当てることができます。つまり、t := A [ i ]と書きます。i f(t > 0 )… i f(A [ i ] > 0 )の代わりに…A [ i ] …

4
関数コードが正しいことを証明するための一般的な正式なテクニックは何ですか?
論文の一部として作成しているHaskellプログラムの一部の証明を提供したいと思います。しかし、これまでのところ、良い参考資料を見つけることができませんでした。 グラハムハットンの入門書 『Haskellでのプログラミング(Googleブックス)』は、Haskellの学習中に読んだものですが、次のようなプログラムについて推論するためのいくつかのテクニックに触れています。 等式推論 重複しないパターンを使用する リストの誘導 第13章で説明しますが、あまり詳細ではありません。 Haskell、またはその他の機能的なコードの正式な証明手法の詳細を提供する推奨できる本や記事はありますか?

6
プログラム検証手法は、ハートブリードのジャンルのバグの発生を防ぐことができますか?
ハートブリードバグの問題について、ブルースシュナイアーは4月15日の暗号グラムで次のように書いています。「破滅的」は正しい言葉です。1から10のスケールで、これは11です。私は数年前に、特定のオペレーティングシステムのカーネルが最新のプログラム検証システムで厳密に検証されていることを読みました。したがって、今日のプログラム検証手法を適用することで、Heartbleedのジャンルのバグが発生するのを防ぐことができますか、それとも、これはまだ非現実的か、または基本的に不可能でしょうか。

2
一次論理検証の概要
ソフトウェア検証に対するさまざまなアプローチを自分に教えようとしています。私はいくつかの記事を読みました。私が学んだ限り、時間を伴う命題論理は一般にSATソルバーによるモデルチェックを使用します(進行中の反応型システムで)が、時間を伴う1次論理はどうですか?定理証明を使用していますか?それともSATを使用できますか? この問題に関する初心者向けの本や記事へのポインタは大歓迎です。

1
例外のあるデータフロー分析
データフロー分析は、制御フローグラフに対して機能します。検討中の言語が例外をサポートしている場合、制御フローグラフが爆発する可能性があります。 この爆破に対処するための標準的なテクニックは何ですか?例外によって引き起こされたエッジを完全に無視できますか?とにかく、データフロー分析は過剰近似を計算するので、精度は落ちますが適切なソリューションになります。これは本当ですか? 更新:最後に掘り下げることができたいくつかの便利なリンクを次に示します。 例外処理構造を持つプログラムの分析とテスト Javaプログラムの分析のための例外の効率的で正確なモデリング

2
シンボリックモデルチェックとは正確には何ですか?
シンボリックモデルチェックは、Kripkeモデルのようなモデルを使用したCTLのような式としての状態セットと遷移関係の表現に基づく状態空間トラバーサルであることを知っています。私は理論を知っています。しかし、実際のアプリケーションを理解するのは難しいと感じています。正確にどこで使用されていますか?それは正確には何をし、どのように機能しますか? 誰かが実際の例で説明し、理論を実践に関連付けることはできますか?

1
SATを使用して、量指定子除去の正確性を検証する
ましょうx=(x1,…,xn)x=(x1,…,xn)x=(x_1,\dots,x_n)とあることのブール変数の-vectors。私はブール述語をに持っています。友達にプリシラを渡します。それに応答して、彼女は私に与え、上のブール述語、と彼女は主張しますy=(y1,…,yn)y=(y1,…,yn)y=(y_1,\dots,y_n)nnnQ(x,y)Q(x,y)Q(x,y)x,yx,yx,yQ(x,y)Q(x,y)Q(x,y)P(x)P(x)P(x)xxx P(x)≡∃y.Q(x,y),P(x)≡∃y.Q(x,y),P(x) \equiv \exists y . Q(x,y), 言い換えれば、 ∀x.[P(x)⇔∃y.Q(x,y)].∀x.[P(x)⇔∃y.Q(x,y)].\forall x . [P(x) \Leftrightarrow \exists y . Q(x,y)]. なんとか彼女の主張を検証したい。プリシラはこの主張を確認するのにどのように役立ちますか? と両方がCNF式として表され、それらが大きすぎない(多項式サイズなど)と想定できます。PPPQQQ 理想的な世界では、この主張をSATに検証する問題を軽減できればすばらしいでしょう。SATソルバーがあり、SATソルバーを使用してこの主張を検証できればすばらしいと思います。ただし、この主張をSATインスタンスとして直接検証するという問題を定式化することは不可能だと確信しています。2QBF式の有効性をテストすることは、 SATよりもほぼ確実に困難です。(方向はSATインスタンスとして簡単に定式化できますが、方向は2つの交互の量指定子が本質的に含まれるため困難です。)⇐⇐\Leftarrow⇒⇒\Rightarrow しかし、プリシラが彼女の主張を裏付けるいくつかの追加の証拠を私に与えることができると仮定します。プリシラが私に与えることができる追加の証拠または証人はありますか?それにより、彼女の主張を簡単に確認できますか?特に、彼女が私に与えることができる追加の証拠または証人はありますか?これにより、彼女の主張をSATのインスタンスとして検証する問題を簡単に定式化できます(次に、SATソルバーを適用できます)? 私の設定の珍しい側面の1つは、SATのオラクルがあると(ヒューリスティックに)想定していることです。複雑さの理論が好きなら、このように考えることができます。私は、(つまり、)で計算できるマシンの役割を担っており、プリシラのアルゴリズムを使用して要求します。このような考え方について、mdxに感謝します。PNPPNPP^{NP}ΔP2Δ2P\Delta^P_2PNPPNPP^{NP} 私の動機/アプリケーション:システムの正式な検証(たとえば、シンボリックモデルのチェック)を行うつもりであり、推論の重要なステップには、数量詞の削除(つまり、から開始して取得する)が含まれます。量指定子の削除が正しく行われたことを確認するためのクリーンな方法を期待しています。QQQPPP 考えられるすべてので機能する解決策がない場合は、「健全だが完全ではない」解決策を提案してください。つまり、多くの、主張された同等性を検証できます。(主張を満たす主張の検証に失敗した場合でも、誤った主張を検証したと不適切に主張しない限り、ヒューリスティックとしてこれを試すことができます。特定の、機能する場合と機能しない場合があります。機能しない場合でも、始めたときより悪くはありません)。P 、Q P 、QP,QP,QP,QP,QP,QP,QP,QP,QP,QP,QP,QP,Q

5
部分的に正しいプログラムがどれほど正しいかを定量化できますか?
部分的正しさと呼ばれるものがあることは知っていますが、半正解が完全正解にどれだけ近いかを知る方法があるのか​​と思っていました。 たとえば、配列をほぼ完全に並べ替える並べ替えプログラムがある場合、Hoareロジックを使用して、正しい答えを得るのにどれだけ近いかを判断できますか?これを行う1つの方法は、一連のandステートメントを前提条件にして、これらのステートメントのうち、プログラムを通じて伝播される事後条件の結果として最も弱い前提条件がいくつあるかを確認することです。 ただし、この方法は非常に粗雑なようです。このようなことをする他の方法はありますか?
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.