web-dev-qa-db-ja.com

有害と見なされる言語機能はどれですか。

理由を説明してくださいと、(誤)機能が実装されている言語をリストアップしてください。

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

20
Maniero

デフォルトでNullを許可します。「兆」*ドルの間違いです。申し訳ありませんが、トニー・ホーア。地球上で利用できるほとんどすべての言語。

Tony Hoareが説明します

*最近の実際の損失を反映するように、Tony Hoareの造語を調整しました:-)

22
Maniero

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";
}
?>
37
HoLyVieR

CおよびC++マクロ。誰かが自分のコードを台無しにするマクロの標準関数名を選択したために別のコンパイラエラーが発生した場合は、悲鳴を上げます。最後の問題のあるものを見てみましょう:

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

ああ!私のSTLベクターで何をしましたか?

18
wheaties

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

14
Niall C.

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

13
Chinmay Kanchi

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

12
Brian R. Bondy

NONE

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

私見「有害であると見なされる」全体は、プログラミング言語の議論の Reductio ad Hitlerum です。

すべてではないにしても、ほとんどの「有害な」機能は、非常に有効なユースケースを持っているか、もともと持っていたか、そもそも単に便利な方法です。賛否両論を理解し、それに応じてコードを開発するのは開発者の責任です。

あなたの質問が「どの言語機能に共通の落とし穴や不幸な副作用があるか」という線に沿ったものである場合、私の答えは異なります。

[編集]明確にするために:私は非推奨のメソッドの継続的な使用を意味するのではありません。開発者が機能を減価/削除している場合は、代わりの機能を使用する必要があります。私が言及しているのは、言語の現在の部分は有害であると見なされているという概念です。

11
Bill

一部の人々は男性または彼が言うさまざまなことに反対しますが、多くのダグラス・クロックフォードのJavaScript:The Good Partsは基本的にこの質問がJSに適用されるものです。クロックフォードの不満の中で:

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

  • withのようなステートメント。その失敗動作は、グローバル名前空間での定義です。 (Gah!JSのモットーのように、失敗した場合はできるだけ失敗する!)

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

  • セミコロン挿入。

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

7
CodexArcanum

Autovivification(または他のbind-variable-on-(assign | use)機能)は、私が最も多くのバグを提供している機能です。

7
Paul Nathan

INTERCALのPLEASE。それを十分に使用しないでください、それは不平を言います。使いすぎると文句を言う。

7
Alan Pearce

C/C++の場合:その割り当ては、非常に類似した割り当て=および比較==演算子を使用した式COMBINEDでもあります。それ自体は有害な機能ではありませんが、誤って演算子を誤って入力することで、バグ(簡単な場合もある)を簡単に導入することができます。

int i = 10;

someCode();

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

Flash Playerのデフォルトの動作として「サイレントフェイル」

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

突然、Flash/Flexアプリケーションが動作を停止し、f *が何が起こったかをほんの少しヒントを与えることができなくなります。エラーメッセージ、スタックトレース、何もありません。それは突然、画面の遷移が起こらない(または完全に間違った方法で起きる)か、ボタンがクリックに反応しなくなったか、またはコンボボックスがいくつかのエントリで埋められる代わりに空になるだけです。

その「機能」だけでも、いくつかの 肩をすくめるレポート と、私が得ている白髪の束全体の原因です。 -.-ユーザーの顔に不可解なメッセージを表示することも望ましくありませんが、少なくとも開発者が問題を修正するのに役立ちます。

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

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

6
Baelnorn

警告なしにシェルで未定義の変数を空の文字列に置き換える:rm -rf $nosuchvar/*

5
duros

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

5
Hoa Long Tam

変数変数 PHP内

あなただけだから$canはあなたを意味しません$$should

4
Kendall Hopkins

LOGOで反時計回りに回転する機能。 Wtf、時計回りに回すだけ360 - x 度。

4
jjnguy

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

Javaおよび他の言語では、停止したスレッドが適切に終了するまでの時間を与えることなく、他のスレッドから任意にスレッドを停止できました。この機能は 非推奨 ですほぼすべての状況で発生する可能性のある膨大な量の問題を考慮します。

4
HoLyVieR

インデックスで始まるAWKの配列1

3
Oliver Weiler

DelphiのWithステートメントが頭に浮かびますが、便利な場合もあります。

3
Remko

Python 2.xの相対インポート構文。 xの他のさまざまなライブラリのサポートを追加するパッケージx.pluginsがあるとします。 x.pluginssqlalchemyモジュールがあるとすると、xにsqlalchemyサポートを追加できます。次の行をsqlalchemy.pyに追加するとどうなりますか?

import sqlalchemy

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

from . import sqlalchemy

...しかし、最初の構文が実際に取り除かれたのはPython 3までです(ただし、Python 2.6+ with from __future__ import absolute_import)。

2
Jason Baker

Perlでは、スカラーコンテキストとリストコンテキストは扱いにくい場合があります。特定の操作を便利にするいくつかの優れた点がありますが、演算子の意味を完全に変更する(潜在的に重要なものから)コード内の距離)。

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/のようなループで何かを言うことができます)。

2
user2348

Sun.misc.unsafe は、私のお気に入りです。 「物事を実装するためにこれが必要でしたが、実際には使用する必要はないと思います」のコレクション。

1
Dean J

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

FORTRANで割り当てられたgotoステートメント/ COBOL変更ステートメント。自己変更コード。危険、警告、飛行スパゲッティモンスター!!

1
Stephen C

_magic_quotes_(PHP)

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

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

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

両方のケースを処理するための非常に単純な方法もありません。get_magic_quotes_gpc()を使用して有効になっているかどうかを確認し、_$_*_配列のすべての値にstripslashes()を適用する必要があります。 _array_map_は再帰的ではなく、これにはカスタム関数が必要です。

1
ThiefMaster

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

1
Yttrill