かりに、ここに一つのソフトウェアがあるとします。
コンピュータのCPUは、マシン語(機械語)で動作しますから、そのソフトウェアは、マシン語になったプログラムか、または、シェルスクリプトやawk,Perl,PHP,などの何らかのインタプリタが解釈実行するインタプリタタイプのものでしょう。
そのソフトウェアやプログラムが、どの様な機能を内蔵しているか知りたい時、一般的には、操作説明書や操作マニュアルを見ると思います。
しかし、取扱説明書や操作マニュアルには、メンテナンス用のコマンドや、秘密の機能は書かれていない事もあるでしょう。
秘密の機能や、利用者には見せないコマンドは、何処に描かれるでしょうか?
一般的にソフトウェアが作られる場合、各段階で仕様書や設計書などが作成されますので、その中に書かれていることが多いと思います。
https://www.google.co.jp/search?q=ソフトウェア+設計書
そして、設計書に基づいてソースコードが書かれます。
インタプリタ形式のソースコードなら、そのソースコードがプログラムとして、インタプリタが、解釈実行しますが、インタプリタ形式では無いコンパイラ形式の場合、コンパイルと言う事を通して別の形式に変換します。
C言語の場合、ソースコードをコンパイルすると、オブジェクト形式になります。
この事をコンパイルするなどと言います。
しかし、オブジェクト形式ではまだ動作することが出来ません。理由は、オブジェ形式では、各種変数が納められるメモリー上の具体的なアドレスなどが入っていないからです。
次に、リンケージを行いますと、メモリ上に配置される各種変数や処理ルーチンのアドレスが入ります。
さて、コンパイラには、各種のコンパイルオプションがあります。このオプションの指定により生成されるもののサイズや含まれる機能が変わります。
つまり、ソースコードだけ入手しても、コンパイル時のオプションが異なれば、生産物のサイズやそこに含まれる機能に、違いが生まれます。
また、コンパイルする時のコンパイラやコンパイル環境が異なれば、生産物が同じにならない事もあります。
これは、どういうことかと言うと、何らかのソフトウェアが実行バイナリとして、手元にある場合に、そのソフトウェアにどんな機能があるのか調べるために、ソースコードを何らかの方法で入手して、読破できたとしても、コンパイル結果が異なるなら、そのソフトウェアの機能を調べて、確認が終わったと言い切れないと言う事になります。
コンパイルして出来たものと、当初入手した実行バイナリが全く同じサイズ、マシン語が全く同じ順番で並んでいて、比較結果として同じなら、そのソースコードから生成される事が確認できたと言えますので、そのソースコードを調べて、機能やコマンドに問題が無かったと言いたいのですが、そう言うストーリーに持ち込めません。
ならば、コンパイル環境や、コンパイルオプションも入手する必要があると言う事になります。
しかし、そこまですれば、完璧な確認をすることが出来るでしょうか?。
コンパイラやリンケージの動作の詳細は理解出来ているのでしょうか?。
コンパイルやリンケージを行うソフトウェアの挙動は、把握できているのでしょうか?
例えば、A=B+C が、コンパイル結果としてはどうあるべきか?、を理解しているでしょうか?。マシン語が、どう言う並びで、出てくるべきか?。
A=B+C 以外に D=A✖️B などをやっていないかを、見極める事が、出来るでしょうか?。
ある種のデータを降順や昇順に並べ変える場合、ソート(並べ替え)の処理のアルゴリズムを理解していて、生成物がどの種類の並べ替え処理を行っているか判断出来るでしょうか?。
情報処理試験の入門あたりで、いくつかの並べ替え処理について理解している事を求められますが、ソースコードレベルで、間違い探しをするのと、マシン語にまでなった後のバイナリコードから、それが並べ替え処理をしている事を突き止める事では、作業量に雲泥の差があります。
マシン語になったコードから、逆にソースコードに直すのを、手作業でこなすのは困難です。何らかの逆変換ツールが必要になります。
今度は、その様な逆変換ツールが正しく動作している事を、どうやって確認するかと言う課題が生まれます。まさか、ある種のバックドアに繋がるコードは見なかった事にしていたり、それらしい他の何かに誤魔化していないか?、をどうやって確認すればいいでしょうか?。
さて、多くのソフトウェア製品については、その設計書やソースコードやコンパイル環境を含めた全てについて、開示してもらうことができるでしょうか?。
答えは企業秘密の中の秘密のトップシークレットで、「開示して貰えない」と言う事が多いと思います。
さらに、ソフトウェア製品の多くは、利用許諾で、逆解析する事を禁止していると思います。
※オープンソースコード形式を取っているソフトウェア製品の場合は、ある程度の開示がされています。しかし、読みこなせないなら、開示されていても私には無意味に近い事になってしまいます。
読みこなせる人が読んで、問題発見の声を上げるまでは安心していようか?。読みこなせる人がいない場合アウト、問題発見の声が上がらないなら、やはり私は安心したままなのでアウト。
※当初「クレーム」と記述しましたが、「問題発見の声を上げる」に変更させて頂きました。
さて、全ての資料が揃っていたら、そのソフトウェアの機能を漏れなくリストアップ出来るのか?と言えばそうとも言えないのです。
ソフトウェアは、プログラムミスがゼロにはならないのです。どこのソフトウェア会社でもこれは同じです。
大体どこの会社でも、「全ての資料が揃っている、自社ソフト」のデバッグに苦慮しています。天才的な優れた人材を求めています。
つまり、部外者が、手元に資料もなしで、取説には載らない秘密の機能や隠しコマンド、更にはバックドアやスパイ機能の有無を見つけられるなら、その能力は素晴らしい事です。あらゆるソフトウェア会社が抱えている「自社製品のプログラムミスの検出」ができる事になります。
物凄く生産性が上がる事になります。
巨大企業の生産性を劇的に向上させるなら、素晴らしいサラリーが約束されるでしょう。
しかし、現実は厳しくて、「もうミスはないよね、頼むよー。」と聞かれて「多分…」と答えたあと、バグ報告が飛んでくるのは、ないことではないのです。
巨大なシステムでは、検証用のシステム群もリースの場合があります、延期は、リース代が膨らむ要因になります。
ソースコードを読むだけで、プログラムミスやそこに埋め込まれた機能を理解できるなら、莫大な検証設備のリースが不要になり良い事ですが、まず、それは不可能だと思います。
さて、
利用者として、パソコンを眺めれば、そこには各社のソフトがあり、利用者側で、自由にインストールしたソフトがあり、その全てのソフトウェアについて、設計書もソースコードも無しで、説明書に記載されない機能や隠しコマンドやバックドアの有無を確認するにはどうしたらいいのでしょう?。
個人の資金と時間では、設計書は、まず入手不可能、ソースコードも入手不可能。読解も困難。ソフトウェアメーカーの構築している検証設備を組み上げるのも困難。
仮に、あなたが何らかのソフトウェアを組んだ場合、たまたま、使ったコンパイラーやソフト開発環境が、何かに感染していたとしたら製造物にバックドアやマルウェアが仕込まれてしまうかもしれませんが、貴方には仕込んだ自覚はない。その為、貴方をいくら調べても悪意は検出されない。
そうすると、たまたま使ったコンパイラーやソフト開発環境を誰かが見てあげないといけない。
貴方の製品を誰かが見てあげないといけない。
でも、それをこなす能力のある人なら、もっと利益率の良さそうな、国際的大企業に職を求めるでしょうし。
だからと言って、素人がプログラムを組んだり配布する事を禁止されたら、エリートだけがITに精通し、部外者は、全く無知な状態に向かいかねませんし、ITは世界的に数社しか、たずさわらないと言う事態にも、なりかねません。