The Underhanded C Contest 結果発表 58
ストーリー by yoosee
良いコードそうに見えたのにねぇ... 部門より
良いコードそうに見えたのにねぇ... 部門より
tamo 曰く、 "善意を装う C コンテスト
として /.J でも記事になった、「読みやすくて安全に見えるけどこっそり悪いことをする」プログラミングコンテスト、
The Underhanded C Contest
の
結果
が出ました。
受賞者は力作の
M Joonas Pihlaja and Paul V-Khuong 組と
エレガントな小品の Natori Shin 氏に決定したそうです。
今年のお題は「画像処理に識別情報埋め込みを混入」でした。
Natori 氏の作品は、単に減色するだけです。
どういう罠が組み込まれているのか、皆さんは見付けられますか?"
ぱっと見 (スコア:0)
Re:ぱっと見 (スコア:3, 参考になる)
四角い部屋を丸く拭くなという教訓のようです。
Re:ぱっと見 (スコア:2, 参考になる)
| matrixは条件付きで初期化を拒否してるようですね。
| 四角い部屋を丸く拭くなという教訓のようです。
このコメントでやっとわかりました。
こんな短い&定数の少ないコードで良くやるなあ!(感嘆
で、もっと詳しい説明が natori.zip 中の、
decoder-and-spoiler/README.txt ですね。
| The output fluctuation is caused by the uninitialized convolution
| matrix. Most elements of the matrix are newly assigned, but some of the
| outer elements are not assigned. The unassigned part contains most of
| the return values from stat(WORKFILE) call. Since the WORKFILE is
| newly generated for each run, the return from the stat call differs
| for each run (differs in last access time, last modified time, i-node
| number, etc.). This causes some subtle changes in the output images.
なるほど。これなら、毎回実行して、毎回違う値を埋め込めそう。
画像処理やノイズ除去の仕組みは無知でわからないのですが、
私にはこれだけでも十分に目からウロコでした。
Re:ぱっと見 (スコア:0)
○四角い部屋を丸く掃く
C言語で書かれてもさっぱりわからん (スコア:0, 興味深い)
と思ったのは僕だけ?
Re:C言語で書かれてもさっぱりわからん (スコア:3, おもしろおかしい)
Re:C言語で書かれてもさっぱりわからん (スコア:0)
#多分そういう問題じゃないと思う
もしかしたら (スコア:0)
i,x,yとかの一文字引数が気に入らないって人もいるからなぁ。
#どっちにしても言語レベルの問題じゃないと思うけど
Re:C言語で書かれてもさっぱりわからん (スコア:0)
#その気になればいくらでも汚く書けるのは置いといて。
Re:C言語で書かれてもさっぱりわからん (スコア:0)
Re:C言語で書かれてもさっぱりわからん (スコア:0)
フリーフォーマットな言語だからなおさらに。
Re:C言語で書かれてもさっぱりわからん (スコア:0)
タレコミにリンクされているコードはANSI C記述に見えるんだけど、それ以外の場所でK&R Cのコードが置いてありましたか?
それともC++以降からプログラム始めた奴がK&Rを知らないだけで、ただのC言語を初代とか言ってるだけの事?
Re:C言語で書かれてもさっぱりわからん (スコア:2, 興味深い)
でも今ではK&Rの第1版って逆になかなか目にすることもできませんし買おうにも手に入りにくい状況です。しかも今さら勉強してもまさに「参考文献」にしかならないので、わざわざ取り寄せるまでもないと思われます。その意味では知らないままに間違えても仕方ないかも。(文中に「?」も付いてますから本人もはっきりとは分かっていない事を認識した上で書かれてますし。)
でも汚いコードって事はないと思うのだけどな。ブランクの空け方とか「好みの問題」で気になる点はありましたけど、非常に簡潔できれいなソースに見えました。TAB4で見ると変になりますが。
#うちはK&R第1版の翻訳版「プログラミング言語C第1版」を買ってるのだけど、仕事場で行方不明!これだけは失いたくない~!
ときに昔は... (スコア:0, オフトピック)
Q:世の中で最もよく使われているプログラミング言語は何でしょう?
A:COBOL (事務処理、特に金融系のシステムがこれで組まれているので)
というのがあったけど、いまでもやっぱりCOBOLなの?
Re:ときに昔は... (スコア:0)
他システムに移行してるのもありますが、未だにCOBOLが改修されてたり
フロントエンドではJavaを使ってるけどコア部分はCOBOLだったりという場所も
ある所を見ると、答えは変わらない気もしますね。
別解(適当解答な
Re:ときに昔は... (スコア:1)
案件数か、ステップ数か、ファイル容量か、印刷したコードの重量か、キングファイルの冊数か・・・(おぃ
Re:ときに昔は... (スコア:0)
仕事で使うプログラマの数です。人海戦術を使う職場で使う言語が多くなるようです。推移はCOBOL→VB→Javaまでは把握してるけど、いまはわかりません。
Re:ときに昔は... (スコア:0)
Re:ときに昔は... (スコア:0)
ハードウェア記述言語
Re:ときに昔は... (スコア:1)
Re:ときに昔は... (スコア:0)
#上ACは記述言語だからプログラム言語とは違うよと言いたかったんだと思いたいです
Re:ときに昔は... (スコア:0)
もちろんそういう意味で書いたのだが、
最近は行間を読めないやつが多い。
Re:ときに昔は... (スコア:1)
Re:ときに昔は... (スコア:0)
Re:ときに昔は... (スコア:0)
でもそういうのを言いたくば「手抜きせんと、もうちっと補足しとけ」とは思う。
ぽつんと「モノ」だけ置かれても意味の取り方は千差万別だあな。
#常識といっても多様化しているのが現代。ましてやネット。
Re:ときに昔は... (スコア:0)
/* やっぱプログラマと言う人種は、
* コメントがないと何も理解しようとしない人種なんだね。
*/
Re:ときに昔は... (スコア:0)
書き手が期待する理解と同一かどうか、分からないでしょ。
同意した気分になりたいだけなら、それでもいいけど。
Re:ときに昔は... (スコア:1)
どうかは判断できないぞ。
Re:ときに昔は... (スコア:1)
逆に、VHDLでもハードウェアだけでなくシミュレーション記述も(ハードウェアとして実装しない物も含めて)書けます。
プログラミング言語とHDLの区別に何の意味が有るのでしょうか。
Re:ときに昔は... (スコア:0)
Re:ときに昔は... (スコア:0)
Re:ときに昔は... (スコア:0)
#ネタで間違えたわけじゃないのだろうな
Re:ときに昔は... (スコア:0)
どこに"N" が?
# 無粋なのでAC
Re:ときに昔は... (スコア:0)
ネタだったとわ・・・
#Aがどこにいったのか必死で探してたのでAC
Re:C言語で書かれてもさっぱりわからん (スコア:0)
onebyteの方は、
関数の型のあと改行が入っていること
natoriの方は、
tabが8文字
になっていることが個人的に気に入らない点だけど、汚いどころか
美しい部類かと。
タブとインデント (スコア:1, 参考になる)
> tabが8文字
\tに期待している挙動は8桁タブで、ソースは4桁インデントで
書かれていますが、この両者が一致していないのは個人的に気に入らない。
DOS/Windows系では、「.c」という拡張子を持つファイル内では\tの挙動は
4桁タブであることを期待する文化があるように思います。たとえば、
MiFESやVz(やその流れを受けたWZなど)はそのような挙動です。一方、
UNIX系では、どんな場合でも\tは8桁タブという意識があるように思います。
その両者をソースが行き来するとき、\tに期待する挙動にかかわらず、
インデントは\tひとつで書かれてあると、Windows/DOS上でもUNIX上でも
一応の見栄えは保てます。まあ、インデントをすべて複数個の\x20で表現
しても、見栄えは保てますが、入力が面倒なので。(Emacsを使えば楽に
入力できますが、考え事をしながら入力しているときの削除が面倒)。
# もしかして、タブとインデントの話題って、Emacs vs Vi や Linux vs BSD
# のような、典型的なフレームの元でしたっけ?
Re:タブとインデント (スコア:0)
> 書かれていますが、この両者が一致していないのは個人的に気に入らない。
同じく。
職場も仕事もviをtabstop=4でいつも使ってるんだけど
なんかインデント
Re:C言語で書かれてもさっぱりわからん (スコア:0)
どの辺が汚いコードだったのかを (スコア:0)
他の人達も書いてるけど、綺麗な分類に入ると思いますコレ。
っていうかコレを汚いと思った人の開発歴とかを知りたい。マヂで。
職場で若手や新人の視点の考察材料にしたいから。
Re:どの辺が汚いコードだったのかを (スコア:2, おもしろおかしい)
Re:どの辺が汚いコードだったのかを (スコア:0)
snprintf(buf, sizeof(buf), "convert %s %s", fromfile, tofile);
system(buf);
とかやるな とかですかね?
まぁ汚い”コード”ではないし,コンテストの趣旨からして
本質じゃないと思いますけど.
(Cともあんま関係ないし.)
読みにくくしておかないとすぐバレル (スコア:0)
これが難読化手法といって解析を防ぐテクニックなのですよ
#本気だか冗談だかよくわからんな
Re:どの辺が汚いコードだったのかを (スコア:0)
"convert %s %s" の長さが sizeof(buf) 以上だった場合に終端に \0 がつかないとか?
そんなことないか。
convert が絶対パス指定でないところとか?
これは致命的っぽい。
シェルがどんな解釈をするかもわからない system() よりも、
確実に対象を実行する exec 系関数を使った方がいいとか?
これは神経質になりすぎ
Re:どの辺が汚いコードだったのかを (スコア:0)
> そんなことないか。
snprintf()なんて初めて見たんですが、strncpy()とかの仕様を考えると
確かに\0が無いとかを疑っちゃいますね。
Re:どの辺が汚いコードだったのかを (スコア:0)
Re:どの辺が汚いコードだったのかを (スコア:0)
思いっきり main() で convertTo(argv[1], WORKFILE) なんてやってますね。
(fromfileとtofileはconvertToの仮引数)
でも、argv をいじれる人は、もともと任意のコマンドの実行権限を持ってるんじゃないの?
これがCGIとか、setuidされてるとかなら問題になるんだろうけど。
Re:どの辺が汚いコードだったのかを (スコア:0)
配列名の頭に"@"がついてない
関数名の頭に"&"がついてない
こんなの読めたもんじゃない。
(ぇ
Re:C言語で書かれてもさっぱりわからん (スコア:0)
Re:C言語で書かれてもさっぱりわからん (スコア:0)
スペースとタブとの使い分けにやや疑問を感じるけど、
普通に PHP とか知らない人の各コードより
ずっっときれい。
Re:C言語で書かれてもさっぱりわからん (スコア:0)
MSX時代にBASICとマシン語を使っていただけですが、行番号はないし、メモリアドレスの表記もない。
汚いコードですよね。:p