パスワードを忘れた? アカウント作成
この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。

「脆弱性の多いプログラミング言語」ランキング、C言語が大差で1位に」記事へのコメント

  • by Anonymous Coward

    C言語は標準設定で、ポインタ・配列の境界チェックをしたり、
    セキュアな代替関数がある命令(snprintfとか)は、非セキュアなオリジナル命令を無効にするとか
    すればいいとおもう

    もちろん、コンパイルオプションや、コード内で明示的に指定することでそれらを無効にして、
    高速なコードを書きたい人は書けるようにして

    OSやlibc等速度が必要なコードはチェックを無効にしてビルド、
    一般アプリはチェックを有効にしてビルドとか

    • Re:標準設定の問題? (スコア:4, すばらしい洞察)

      by Anonymous Coward on 2019年03月29日 16時17分 (#3589915)

      多分、真面目に考え出すと別の言語を新たに作った方が楽と言うぐらいの変更になるので、JavaとかC#とかSwiftとかRustとかが出来たんだと思う。

      配列の境界チェックぐらいまでなら、トリッキーな書き方は全面禁止、ポインタは指している先の有効なメモリの範囲も覚えておく、とかでなんとか実現出来そうだけど。
      他にも、オブジェクトの寿命の管理が厄介で、ポインタが指している先がまだ存在するかどうかがC言語ではあやふやになってしまう。プログラマの注意に委ねられてる。

      GCの付いてる言語は、ポインタが指している限りは指されているオブジェクトは開放されないという方針で寿命の問題を解決してる。
      Rustだと、あらゆる変数の寿命を自明な場合を除いて明示することになっていて、それによって、指している対象よりも寿命の長いポインタの類を禁止していて、ポインタが指している先が存在しなくなっている、というトラブルを排除している。

      C言語のコンパイラに似たようなチェックを行うオプションを付けるアイデアもあり得そうだけど、多分無理。「危なそうなコードは却下するよう安全寄りに倒して、ちょっとでも駄目そうな可能性のあるプログラムはエラー。あるルールに従った明らかに安全なコードだけが許されるから、既存のコードもちゃんとルール通りに書き直せ」という感じにできれば良いんだけど。Rustがそんな感じのノリの言語なんだけど、プログラマがしばしば、寿命チェッカが厳しすぎる、あちこちに非自明な寿命の定義を書き加えないとコンパイルが通らない、と嬉し涙を流している。ので、言語仕様上その手の事を書けないC言語のコンパイラにやらせようとすると、ごく限られた書き方だけを使った効率の悪いプログラムしかコンパイル出来ないような、残念なコンパイラになってしまう。

      親コメント

ソースを見ろ -- ある4桁UID

処理中...