質問

お願いします、 理由を説明 そして、あなたが知っている限り、どの言語に(誤った)機能が実装されているかをリストします。

あなたが嫌い​​なものではなく、有害だと思う機能を投稿してください。

役に立ちましたか?

解決 2

デフォルトで Null を許可します。これは「兆」* ドルの間違いです。ごめんなさい、トニー・ホア。地球上で利用できるほぼすべての言語。

トニー・ホアが説明する

*最近の実際の損失を反映するために、Tony Hoare が作った表現を調整しました :-)

他のヒント

PHP でグローバルを登録する

情報 : http://php.net/manual/en/security.globals.php

これは、読みやすさとセキュリティ上の理由から、これまで実装された中で最悪の機能です。基本的に、受け取ったすべての GET パラメータは変数に変換されます。

たとえば、次の URL を使用します。/index.php?value=foobar

次のことができます。

<?php
echo $value; // return foobar
?>

コードを読んでいるとき、変数がどこから来たのかを知るのは非常に混乱します。

また、この機能を悪用すると、セキュリティホールが発生する可能性があります。以下は、悪用される可能性があることを示す php.net のコード例です。

<?php
// define $authorized = true only if user is authenticated
if (authenticated_user()) {
    $authorized = true;
}

// Because we didn't first initialize $authorized as false, this might be
// defined through register_globals, like from GET auth.php?authorized=1
// So, anyone can be seen as authenticated!
if ($authorized) {
    include "/highly/sensitive/data.php";
}
?>

C および C++ マクロ。誰かがマクロに標準関数名を選択してコードを台無しにしたために、別のコンパイラ エラーが表示されたら、私は悲鳴を上げるでしょう。最後の問題を見てみましょう:

#define vector(int) new VARIANT[int];

ああ!私の STL ベクトルに何をしたのですか?

C および C++ switch ステートメントではデフォルトでフォールスルー。

変換される型に明らかな関係がない場合の暗黙的な型変換。たとえば、ランダムな非数値を変換する場合、 stringint, 、PHP のように。

後藤:まれに問題ありませんが、悪用されることが多く、プログラムが読みにくくなります。

なし

機能が頻繁に誤用されるからといって、それが有害になるわけではありません。

私の意見では、「有害であると考えられている」ということは、 ヒトラームへの還元 プログラミング言語のディスカッションの様子。

すべてではないにしても、「有害な」機能のほとんどは、非常に有効な使用例を持っているか、もともと持っていたか、そもそも単なる便利な方法です。長所と短所を理解し、それに応じてコードを作成するのは開発者次第です。

あなたの質問が「どの言語機能によくある落とし穴や残念な副作用があるか」というようなものであれば、私の答えは違ったものになるでしょう。

[編集] 明確にするために:非推奨のメソッドを継続的に使用するという意味ではありません。開発者が機能を廃止または削除する場合は、代替機能を使用する必要があります。私が言及しているのは、言語の現在の部分が有害であると考えられているという概念です。その理由は、言語が奨励しているものや、多くの人が議論している言語の使用に伴うトレードオフを好まない人がいるからです。

Autovivification (または他のバインド変数オン (割り当て|使用) 機能) は、私が最も多くのバグを引き起こすことがわかった機能です。

PLEASE インターカルで。十分に使用しないでください、と文句を言います。使いすぎると文句を言います。

この男や彼の言うことには反対する人もいるが、ダグラス・クロックフォードの多くの意見は JavaScript:良い部分 基本的にこの質問は JS に適用されます。クロックフォード氏の苦情には次のようなものがある。

  • デフォルトですべてのグローバル スコープ (DC は、名前空間として関数/オブジェクトを使用し、これを制御するスコープ区切り文字を使用する方法を示しています)。

  • のようなステートメント with, 、その失敗動作は、グローバル名前空間で物事を定義することです。(ガー!JS のモットーは「失敗したら終わり」のようなものです。 できるだけ失敗する!)

  • での予期しない動作 == 演算子。基本的には常に を使用する必要があります。 === オペレーター。

  • セミコロンの挿入。

実際、JS の多くは有害であると考えられるべきであり、おそらく言語全体が有害であると考えるべきですが、良い部分は非常に優れているため、それを補ってくれます (少なくとも私にとっては)。

Flash Player のデフォルトの動作として「サイレントに失敗する」

言語自体の機能ではありませんが、それでもかなり密接に関連しています。

突然、Flash/Flex アプリケーションが動作を停止し、何が起こったのか誰も知ることができなくなります。エラーメッセージもスタックトレースも何もありません。それは、突然画面遷移が発生しなくなる (または完全に間違った方法で遷移する) か、ボタンをクリックしても反応しなくなるか、コンボボックスにいくつかのエントリが入力されずに空になるだけです。

その「機能」だけでいくつかの原因が生じます。 肩をすくめるレポート そして白髪も増えてきました。-.- ユーザーの目の前に不可解なメッセージがポップアップ表示されることも望ましくありませんが、少なくとも開発者が問題を解決するのに役立ちます。

しかし、Flash Player では、ユーザーの説明に依存して、暗闇の中で刺し続けることになります (問題は実際には、ユーザーが行っていたこととは何の関係もない、コード内のまったく別の場所から発生している可能性もあります)。Debug Player を使用する場合のみ、実際にエラー メッセージとスタックトレースを含むポップアップ ウィンドウが表示されます。

ただし、特定のニュース サイトで Flash 埋め込みムービーを視聴し、使用されている埋め込みプレーヤー SWF からの Null 参照に関するメッセージを繰り返し受け取るのは非常に興味深い場合があります。:D

C/C++ の場合:この代入は、よく似た代入 = 演算子と比較 == 演算子を組み合わせた式でもあります。それ自体は有害な機能ではありませんが、誤って演算子を打ち間違えることにより、(場合によっては微妙な) バグが簡単に導入されてしまいます。

int i = 10;

someCode();

if(i = 5)
{
    /* We don't want this block to be executed, but it is */
    moreCode();
}

パッケージのプライベート言語のデフォルトとプライベート プログラミング規約のデフォルトを使用して、Java の修飾子にアクセスします。

警告を表示せずに、シェルで未定義の変数を空の文字列に置き換えます。 rm -rf $nosuchvar/*.

ロゴで反時計回りに回転する機能。なんと、時計回りに回してみましょう 360 - x 度。

他のスレッドからのスレッドの停止

Java やその他の言語では、停止したスレッドが適切に終了するまでの時間を与えずに、他のスレッドから任意にスレッドを停止できます。この能力は、 廃止された ほぼすべての状況で膨大な量の問題を引き起こす可能性があることを考慮してください。

変数 変数 PHPで

ただあなただから $can あなたのことを意味するわけではありません $$should

With Delphi のステートメントが思い浮かびますが、それが役立つ場合もあります。

インデックスから始まる AWK の配列 1!

パールでは、 スカラーコンテキスト vs.リストコンテキスト 難しいかもしれません。特定の操作を便利にする良い点もいくつかありますが、場合によっては、次のようなひどい問題に遭遇することがあります。 演算子の意味を完全に変える (コード内でかなり離れたところからの可能性があります)。

sub foo { (1..5) }
my @list = foo();           # (1,2,3,4,5)
my $length = scalar @list;  # 5. the length of the list.
my $length2 = scalar foo(); # '' (the empty string. because it's false)

それは正しくありません。

(これは、通常の範囲演算子のような動作をするものを作ろうとすることから生じたもので、ループ内で次のように言うことができます。 next if /start_regex/ .. /end_regex/).

Python 2.x の相対インポート構文。荷物があるとします x.plugins 他のさまざまなライブラリのサポートを追加します。 x. 。そして、私が持っているとします sqlalchemy モジュール内 x.plugins sqlalchemy サポートを追加できるようにする x. 。sqlalchemy.py に次の行を追加するとどうなると思いますか?

import sqlalchemy

答えは、モジュールがそれ自体をインポートしようとすることです。この構文が行うことは、本質的に、実際のグローバル sqlalchemy パッケージのインポートを不可能にすることです。Python 2.5 では、これが相対インポートであることを指定する方法が追加されました。

from . import sqlalchemy

...しかし、最初の構文が実際に削除されたのは Python 3 になってからです (ただし、Python 2.6 以降では次のように無効にすることができます) from __future__ import absolute_import).

太陽、その他、危険 私の一番のお気に入りです。「何かを実装するためにこれが必要でしたが、実際には使用すべきではないと思います。」のコレクション。

FORTRAN 共通ブロック。単純な間違いを犯した場合、アプリケーションの一部が別の部分のグローバルを破壊する可能性があります。

FORTRAN には goto 文/COBOL の alter 文が割り当てられました。自己変更コード。危険、警告、空飛ぶスパゲッティモンスター!!

オブジェクト指向 (すべての静的型付け言語から)。この機能にはコストがかかりますし、今後もコストがかかるでしょう 大いに null ポインタ以上のもの。オブジェクト指向は動的環境でのみ有効です メッセージパッシング 言語。したがって、Python のような動的言語からも削除する必要があります (メッセージ パッシングではなく従来のサブルーチン呼び出しを使用するため)。

magic_quotes PHPで.

経験の浅い開発者は、これが有効であることに依存して SQL クエリで使用するためにすべてのユーザー入力がエスケープされると想定するか、無効であることに依存して常に入力をエスケープするかのどちらかです。

これが有効になっていると仮定して、有効になっていないシステムでコードを実行すると、大きな SQL インジェクション ホールが開いてしまいます。

無効になっていると仮定し、実際には無効になっていないと、実際にはバックスラッシュが DB に保存され、醜い/不正な文字列が発生します。

また、両方のケースを処理する非常に簡単な方法はありません。次を使用して有効になっているかどうかを確認する必要があります。 get_magic_quotes_gpc() そして申請してください stripslashes() 内のすべての値に対して $_* 配列 - 以来 array_map は再帰的ではないため、これにはカスタム関数が必要です。

プログラマーがコメントのないコードまたは無意味なコメントのコードを作成できるようにする言語機能。

ここでは少し無理をします - 関数を無効にします。関数は常に何かを実行するため、結果または成功または失敗に関するその他の情報を返す必要があります。

BASICでPOKE...

ガベージコレクションと言わざるを得ません。メモリ管理について考える必要がなくなるわけではありませんが、 感知 メモリ管理について考える必要があるため、実際に考える必要がなくなり、リソースが膨大に消費され、その理由がわかりません。の場合は特に 最新の世代別 GC の動作は、誇張せずに「設計による 1 つの大きなメモリ リーク」として説明できます。

C、そして間違いなく C++:ポインタ演算。整数をメモリアドレスに変換できるようにすると、トラブルが発生します。

そしておそらく、ポインタへの完全な生アクセスさえも可能でしょうか?

C++ では、ポインタをほぼ完全に不要にする参照があります。残りのケースでは、スマート ポインターは必須であると考えるべきです。

Java は、次のことも証明します。 できる ポインタ値自体へのアクセスを許可せずにポインタを使用するプログラミング言語を作成します。

とは別に null ...しかしそれは別の話です。

ライセンス: CC-BY-SA帰属
所属していません softwareengineering.stackexchange
scroll top