ほとんどのプログラマーは、他の人のコードをデバッグ/修正した経験があります。その「他人のコード」は非常に難読化されているため、それが何をしているのかを理解しようとしても十分に悪い場合があります。
デバッグ/修正しなければならなかった最悪の (最も難読化された) コードは何ですか?
それを捨てて最初から書き直さなかったのなら、なぜそうしなかったのですか?
ほとんどのプログラマーは、他の人のコードをデバッグ/修正した経験があります。その「他人のコード」は非常に難読化されているため、それが何をしているのかを理解しようとしても十分に悪い場合があります。
デバッグ/修正しなければならなかった最悪の (最も難読化された) コードは何ですか?
それを捨てて最初から書き直さなかったのなら、なぜそうしなかったのですか?
ネストされた if、while、like:
if (...) {
for (...) {
if (...) {
if (...) {
while (...) {
if (...) {
カットアンドペースト指向のプログラミング
私は捨てて再コーディングしたくなりました...しかし、3日間のハードデバッグの後、私は魔法を追加しました:-)
デフォルトでは、プログラマーは他人のコードが難読化されていると考えています。
おそらく私がしなければならなかったのは、どの変数 i1、i2 j、k、t が単純なメソッドにあり、それらが「for」ループのカウンターではないかを解釈することでした。
他のすべての状況では、問題の領域が難しく、コードが難しく見えたと思います。
スパゲッティ コード PHP CMS システム。
今日、私たちのコードベースで次の行を見つけました。これは、卑劣な難読化の良い例だと思いました。
if (MULTICLICK_ENABLED.equals(propService.getProperty(PropertyNames.MULTICLICK_ENABLED))) {} else {
return false;
}
行全体を読んでいることを確認するだけです。スキムリーディングなし。
完全なコードを思い出すことはできませんが、理解しようとして何時間も費やしたものとして、その一部が記憶に焼き付いたままです。
do{
$tmp = shift unless shift;
$tmp;
}while($tmp);
最初は理解できませんでした。役に立たないように見えたので、引数のリスト、一連の交互のブール名と関数名の @_ を出力しました。コードは、動作を変更するライブラリ検出モジュールと組み合わせて使用されました。関数は壊れていましたが、コードは非常によく文書化されておらず、完全なコードを完全に理解していなければ意味をなさないようなもので構成されていたため、あきらめてすべてを書き直しました。
DVK からの更新:
そして、コーダーが優れたソフトウェア開発者ではなくゴルフの達人であるのとは対照的に、Perl が判読できないためであると誰かが主張しないように、少し難読化されていない形式の同じコードを次に示します (本当に正しいコードは、サブネームとブール値を交互にすることすらありません)。そもそも:)
# This subroutine take a list of alternating true/false flags
# and subroutine names; and executes the named subroutines for which flag is true.
# I am also weird, otherwise I'd have simply have passed list of subroutines to execute :)
my @flags_and_sub_names_list = @_;
while ( @flags_and_sub_names_list ) {
my $flag = shift @flags_and_sub_names_list;
my $subName = shift @flags_and_sub_names_list;
next unless $flag && $subName;
&{ $subName }; # Call the named subroutine
}
Perl ステートメント:
select((select(s),$|=1)[0])
これは、元の作者 (Randal Schwartz 自身が嫌いだと言ったが、当時は他に何も利用できなかった) の提案で、もう少しわかりやすいものに置き換えられました。
IO::Handle->autoflush
そのワンライナーを超えて、IBMのJava JDBCライブラリの一部は難読化されており、すべての変数と関数は文字「l」と「1」の組み合わせ、または単一/二重文字のいずれかです-それらを取得するまで何かを追跡することは非常に困難です.すべて改名。IBM の JRE では正常に機能したが、Sun の JRE では正常に機能しなかった理由を突き止めるために、これを行う必要がありました。
意図的に難読化された時限爆弾を見つけたことがあります。
私が最終的に何をしているのかを解読したとき、時限爆弾について知っていたが、それは非常に効果がなく、他のコードと織り込まれていたため、そのままにしていたとマネージャーに話しました.
時限爆弾は(おそらく)特定の日付の後に爆発するはずだった.
代わりに、12 月 31 日の昼食後に誰かが働いている場合にのみアクティブになるバグがありました。
時限爆弾を書いた男が会社を辞めてから、そのような状況が発生するまでに3年かかりました.
HLL コードについて話している場合、中国人によって書かれたプロジェクトを更新していて、すべてのコメントが中国語 (ansii に保存されている) であり、低レベル コードについて話している場合、いくつかのコードの断片を理解するのは恐ろしいことでした。それらの多く(難読化、変異、vm-ed ...)。