• ベストアンサー

「%n」や「%S」は何故恥ずかしいのですか?

auのW42CAとW42Hに「%n」や「%S」とメールなどで打つと強制再起動してしまうバグが発見されましたよね。これがまた恥ずかしいバグらしいのですがいったい何故なのでしょうか? http://japanese.engadget.com/2006/08/04/au-w42ca-w42h/

質問者が選んだベストアンサー

  • ベストアンサー
  • a-saitoh
  • ベストアンサー率30% (524/1722)
回答No.6

%nや%Sで異常になるということからして、printfのたぐいの何かの使い方を間違ったと想像されます。 printf系の関数は printf(書式指定、データ、データ、・・・)という使い方をします。 文字列を1つだけ出力する場合、さぼって、printf(文字列)としてもだいたい動きますが、文字列の中に書式指定用の特殊文字が入っていると異常動作を起します。というわけで、携帯の異常動作は、printf(メールのデータ)としちゃったせいだと容易に想像できるわけです。 で、この手の間違いを避けるというのは初歩の初歩で、プロのプログラマどころか、Cの勉強をしている学生でも、やっちゃうと恥ずかしいバグです。 うっかりミスだと言い訳できるレベルではありません。先日起きたプール事故での、「カナヅチの人をプールの監視員に雇ってた」てのと似た、会社側のずさんな人事体制が透けて見えます。

Ipe
質問者

お礼

なるほど、メール本文がメールのデータとして扱われしまうので今回は再起動してしまう事になったのですね。 分かりやすい回答ありがとうございました。

その他の回答 (6)

noname#19175
noname#19175
回答No.7

プログラムの内部的な話は皆さんが仰るとおりでしょうけど、 特定の文字(または文章)を送信(投稿)すると、送信や投稿処理以外の何らかの処理が行われ、セキュリティーホールとなる というのは、特にBBSではごく一般的で、初歩中の初歩としてどんな資料にも書かれています。 それを作ってしまった、ということでもあるんじゃないでしょうか。 また、自動操作・遠隔操作ソフトの場合でいうと、 命令文として使われているコードをメールで送信すると、 (本来は操作ソフトを通じなければ動かないはずなのに、メールを送信するだけで)相手側の機器を乗っ取ることが出来てしまった というパターンだったら最悪ですね。 (むしろ、メールを使って遠隔操作するテストコードが残ってたとかだったら、、、) 今回は関係ありませんが、 長い文章を送信すると、バッファオーバーフローという現象によりクライアントやサーバーがクラッシュしたり、任意のコード(アプリケーション)が実行される というセキュリティーホールは有名ですね。

Ipe
質問者

お礼

ちょっとしたミスで最悪の可能性もありえるのですね。 回答ありがとうございました。

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.5

# ごめんなさい、間違ってた…orz %nは標準規格に入ってます。 実装による定義と位置づけられるのは%Sの方。

  • MrBan
  • ベストアンサー率53% (331/615)
回答No.4

# 前の回答に対する補足となってしまいますが。 > でも、よく考えたら "%n" と "%S" はどっちも特殊文字ではない……。 標準C/C++のprintfとしては特殊文字ではないのですが、 それを特殊文字として実装している環境などもあります…。 >Microsoft %n:整数へのポインタ %S:printf用のワイド文字列(wchar_t*) 内情はわかりませんが、テストケースをきった担当にこういう知識がなかった?

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

#2さんのに補足 > でも、よく考えたら "%n" と "%S" はどっちも特殊文字ではない……。 そんなことはありません(%Sのほうはobsoleteだったりしますが)。 %n → これまでに出力された文字数を int * (または類似の型) のポインタ引き数が指す整数に保存する。 %S → ワイド文字指定 です。

参考URL:
http://www.linux.or.jp/JM/html/LDP_man-pages/man3/printf.3.html
noname#25358
noname#25358
回答No.2

 えとですね。  C言語を使うプログラマーには有名な話なのですが、"%" で始まる一部の文字は特殊な意味を持つのです。  "%d" "%s" "%x" などは、「ここに文字を埋め込め」という命令を示します。  ユーザーがこのような仕様を意識しないで済むよう、処理を施すことはプログラマーとしては基本中の基本であり、「風呂に入るのにパンツを脱ぐのを忘れていた」というくらい恥ずかしいことなのです。  でも、よく考えたら "%n" と "%S" はどっちも特殊文字ではない……。  記事に書いてあるほどには恥ずかしいバグじゃないですね。これ。  なんでこんなバグが……???

Ipe
質問者

お礼

分かりやすい喩えと答えをありがとうございました。

回答No.1

たいていの組み込み型プログラムはC言語で書かれてあり、その中で基本的に文字を表示するのに使われる文法に、printf というのがあって。 その中で %とその後の文字は特殊な意味が、、、 後はリンクを見て。 でも、何故チェックから漏れたのかな、、基本過ぎて漏れたのか? いやいや、私も気をつけよう!

参考URL:
http://www.isc.meiji.ac.jp/~deptec/cmanchp2.html
Ipe
質問者

お礼

なるほど、基本中の基本のプログラムミスだったのですね。 回答ありがとうございました。

関連するQ&A