おい何が恥ずかしいんだコレ

このエントリーをはてなブックマークに追加
1ニュー速代表
ケータイWatchの記事によりますと、auのW42CAおよびW42Hに特定の文字列を入力・表示すると
強制再起動してしまうバグが発見されたとのこと(写真はタフ携帯G'zOneことW42CA)。
問題が発生するのはメールの入力または受信メールの表示時。
肝心の「特定の文字列」とは「%n」および「%S」……
と書いただけで原因を推測できる人にとってはキーボードや枕に顔を埋めて脚をじたばたさせたくなるほど
恥ずかしい悶絶もののバグですが、KDDIとしては「発生する条件が限定的であるため」修正はせず、
ユーザへの告知もおこなわないとのこと。
(なぜこれがものすごく恥ずかしい(と推測される)のか分からない人はプログラミング知識のある人に聞いてみましょう)。

%nと%Sそのものだけでなく%とnのあいだに0〜255の数字や+ , -がある場合も発動するとあり、メールで
ありふれたURLを送ったり受信するだけで飛ばせます。
この件についてW42CA / W42Hのユーザにメールしただけで再起動。
「気になるユーザに対しては」店頭預かり修理、今後販売されるものについては順次回収という対応を
採るようですが、ここまで恥ずかしいといっそ隠すより告知だけはしておいたほうがダメージは少ないのでは
ないでしょうか。
ソース
ttp://japanese.engadget.com/2006/08/04/au-w42ca-w42h/


このスレで頭を悩ます子羊達に教えてやってくれ
http://news20.2ch.net/test/read.cgi/news/1154694656/
2デフォルトの名無しさん:2006/08/04(金) 21:48:57
それよりも >>1 がすごくはずかしいな
3デフォルトの名無しさん:2006/08/04(金) 22:03:11
だからリテラルを直接渡さずに
"%s",str
にしろとあれほど
4デフォルトの名無しさん:2006/08/04(金) 22:30:49 BE:59908043-2BP(200)
レビューやってないか、会社全体のレベルが低いのか。
5デフォルトの名無しさん:2006/08/05(土) 02:05:00
大手の携帯ってったって、機能の中には零細企業が細々と下請けして
書いてるところもあるからね。
6デフォルトの名無しさん:2006/08/05(土) 03:22:47
まじで、いるんだよ。
printf("hogehoge\n") ;
なんていうコードを平気な顔して書く香具師が。

恐ろしいことに、初級者向けのC言語の教科書にも、
そういうのが平然と書かれている。もうね、アホかと。
7デフォルトの名無しさん:2006/08/05(土) 03:48:02
>>6
お前がアホ
8デフォルトの名無しさん:2006/08/05(土) 04:16:29
馬鹿にも分かるように説明してくれ
9デフォルトの名無しさん:2006/08/05(土) 04:42:04
printf("%s");
何が出るかな〜何が出るかな〜
10デフォルトの名無しさん:2006/08/05(土) 05:15:24
>>6
別におかしく無いじゃん
11デフォルトの名無しさん:2006/08/05(土) 05:30:35
>>9
>>1が読めないアホ

アホ隔離スレ
12デフォルトの名無しさん:2006/08/05(土) 05:41:00
>>8
char buf[] = "foo%sbar";
printf(buf);
13デフォルトの名無しさん:2006/08/05(土) 10:09:19
メールの文を書式文字列として扱ったってことか。
どんな糞プログラムなのか、ソースを見てみたいw
14デフォルトの名無しさん:2006/08/05(土) 10:14:33
何が恥ずかしいって、かなりの初心者でも何が原因なのか特定できてしまうことだな
15デフォルトの名無しさん:2006/08/05(土) 10:28:51
>11のような恥ずかしさだな
16デフォルトの名無しさん:2006/08/05(土) 13:33:19
>>15
>>9がなぜ恥ずかしいかわかってないみたいだな。
ちなみに今回は"%s"は問題なかった。
17デフォルトの名無しさん:2006/08/05(土) 14:24:30
>>16
%sと%Sの違いを解って言ってる?
18デフォルトの名無しさん:2006/08/05(土) 14:52:34
>>17 が話題を逸らそうとしている件
19デフォルトの名無しさん:2006/08/05(土) 14:55:28
わかってないならいい。
20デフォルトの名無しさん:2006/08/05(土) 15:20:46
>>17
わかってるよ。
"%S"と"%n"に問題があったから「ああ、あれか」と"%s"を持ち出すようなアホということだ。
21デフォルトの名無しさん:2006/08/05(土) 15:32:03
つまり、字面だけみてうっかり煽っちゃったって事だな。
ごくろうさん。
22デフォルトの名無しさん:2006/08/05(土) 15:33:15
>>4
レビューの問題じゃなくて、テストの問題だろ。
レビューでバグが100%なくなるとでも思ってるのか?
23デフォルトの名無しさん:2006/08/05(土) 15:50:10
>>1にある元のスレッドで真面目に解説してる人がいる。
興味があったらどぞ。
24デフォルトの名無しさん:2006/08/05(土) 16:03:24
なぜスラドを勧めないのか
25デフォルトの名無しさん:2006/08/05(土) 16:07:52
printf の %n てどういう時使うの?
26デフォルトの名無しさん:2006/08/05(土) 16:53:44
メモリへの不正アクセスがあると天国へ上る仕様なのかな。
printfじゃ破壊は起こらないし。いや、カキコみ先のバッファがあふれたのか?
27デフォルトの名無しさん:2006/08/05(土) 16:55:38
ほい
http://slashdot.jp/mobile/06/08/04/068204.shtml
ある程度わかってる人向け。

情報はいろいろ出てるけど、デバッグ出力を消し忘れた
程度の恥ずかしいバグの可能性は否定されてないように思う。

まあ、一番恥ずかしいのはもとの記事を書いたやつだな。
28デフォルトの名無しさん:2006/08/05(土) 17:01:32
>>26 %nは書き込みが起こるよ。
29デフォルトの名無しさん:2006/08/05(土) 17:30:16
>>25
それJava特有の記法
30デフォルトの名無しさん:2006/08/05(土) 17:59:05
>>22
あほか。
テストで全部の問題を洗い出せると思ってるのか。
31デフォルトの名無しさん:2006/08/05(土) 18:46:14
>>30
否定だけして代案を出さないやつのことってどう思う?
32デフォルトの名無しさん:2006/08/05(土) 18:49:40
知的障害者
33デフォルトの名無しさん:2006/08/05(土) 18:53:03
テストで全部の問題を洗い出せるわけではないが、おおよそ想像のつく問題
は洗い出せる。
で、これは、テストで洗い出せる類の問題ではある。でなければテスト仕様
を書いたやつか、テストしたやつの怠慢。
34デフォルトの名無しさん:2006/08/05(土) 19:03:35
レビューが好きな奴は、無限の時間を使って、机上でレビューし続ければいいと思うよ
35デフォルトの名無しさん:2006/08/05(土) 19:15:03
>>30
レビューで全ての問題を洗い出せるなら、テスト工程はいらないんじゃないかな。
36デフォルトの名無しさん:2006/08/05(土) 19:17:30
>>1が一番恥ずかしいな
37デフォルトの名無しさん:2006/08/05(土) 20:05:43
こんな有名な落とし穴は、レビューの段階で発見されてるべきだろ。
テスト段階で初めて発見されるって、まともなレビュアーがいない証拠。
38デフォルトの名無しさん:2006/08/05(土) 20:14:44
いいからさっさと理由教えろよ。
39デフォルトの名無しさん:2006/08/05(土) 20:36:10
>>38
なんの理由だよ。
40デフォルトの名無しさん:2006/08/05(土) 21:08:59
自分以外の、いるかどうかもわからないどこかの馬鹿をたたき続けるキチガイうぜえ
41デフォルトの名無しさん:2006/08/05(土) 21:14:58
なんだか、世の中のソフトウェアの大部分がセキュアで高品質なものだと
勘違いしてる奴がいるな。
42デフォルトの名無しさん:2006/08/05(土) 21:40:23
>>6
がおかしい理由
43デフォルトの名無しさん:2006/08/05(土) 22:07:08
>>42
>>6 に聞けよ。
44デフォルトの名無しさん:2006/08/05(土) 22:42:15
>>22
テストで100%バグを発見できるとでも思ってるのか?

まずはレビューして、アホなプログラマを矯正するのが先。
放置しておくと、腐ったコードを大量生産しやがるから。
456:2006/08/05(土) 23:01:29
なぜダメなのか、わからない人が多いようなので説明しますよ。

printf("hogehoge\n") ;
なんてのを日常的に書いていると、
printf("100%search done.\n") ;

printf(strSomeThing) ;
なんていうのをうっかり書いてしまうから。

あくまでもprintfの第一引数は書式文字列だということを忘れないために、
printf("hogehoge\n") ;
といったprintfの使い方は禁じ手としておくべきなんです。

最初にコードを書いた人間が気をつけていてミスしていなくても、
アホな誰かが文字列だけ書き換えてダメにしてしまう恐れもあるしね。
46デフォルトの名無しさん:2006/08/05(土) 23:03:40
>>45
printf("\n");もダメと言いたいのかな?
47デフォルトの名無しさん:2006/08/05(土) 23:12:08
ifは if(p == 0)じゃなく、if(0 == p)と書かないとダメなんです。


なぜダメなのか、わからない人が多いようなので説明しますよ。

if(p == 0)
なんてのを日常的に書いていると、
if(p = 0)
なんていうのをうっかり書いてしまうから。

あくまでもifの基本は条件式だということを忘れないために、
if(p == 0)
といったifの使い方は禁じ手としておくべきなんです。

最初にコードを書いた人間が気をつけていてミスしていなくても、
アホな誰かが文字列だけ書き換えてダメにしてしまう恐れもあるしね。
48デフォルトの名無しさん:2006/08/05(土) 23:13:45
>>46
矛盾点がありまくる時点でネタ決定。
面白くないネタにマジレスはイクナイ。
49デフォルトの名無しさん:2006/08/05(土) 23:13:46
まじで、いるんだよ。
if(p == 0) ;
なんていうコードを平気な顔して書く香具師が。

恐ろしいことに、初級者向けのC言語の教科書にも、
そういうのが平然と書かれている。もうね、アホかと。
50デフォルトの名無しさん:2006/08/05(土) 23:17:36
引数なし main は int main() じゃなく、int main(void)と書かないとダメなんです。


なぜダメなのか、わからない人が多いようなので説明しますよ。

int main()
なんてのを日常的に書いていると、
int mail()
なんていうのをうっかり書いてしまうから。

あくまでもmainの引数なしはvoidだということを忘れないために、
int main( /* void */ )
といったmailの使い方は禁じ手としておくべきなんです。

最初にコードを書いた人間が気をつけていてtypoしていなくても、
アホな誰かが文字列だけ書き換えてダメにしてしまう恐れもあるしね。

51デフォルトの名無しさん:2006/08/05(土) 23:21:28
まじで、いるんだよ。
mail()
なんていうtypoを平気な顔して書く香具師が。

恐ろしいことに、初級者向けのC言語の教科書にも、
そういう誤植が平然と書かれている。でもね、typoはしょうがないよ。
52デフォルトの名無しさん:2006/08/05(土) 23:25:31
なぜダメなのか、わからない人が多いようなので説明しますよ。

a[0]=++n;
なんてのを日常的に書いていると、
a[n]=++n;

a+++n=n ;
なんていうのをうっかり書いてしまうから。

あくまでも副作用完了点までの間に値を変更する回数は一度だけってことを忘れないために、
++n
といった演算子の使い方は禁じ手としておくべきなんです。

書き込む前に既に反省している。
53デフォルトの名無しさん:2006/08/05(土) 23:33:00
反省してるように見えません。
もう一度お願いします。
お題はcharで。
54デフォルトの名無しさん:2006/08/05(土) 23:46:28
charポインタは char* p じゃなく、char *pと書かないとダメなんです。


なぜダメなのか、わからない人が多いようなので説明しますよ。

char* p
なんてのを日常的に書いていると、
const char* p
なんていうのをうっかり書いてしまうから。

あくまでもcharポインタからのデータ破壊をさせないことを忘れないために、
char* p
といった変数宣言の使い方は禁じ手としておくべきなんです。

アホな誰かが文字列を書き換ようとしてダメにしてしまう恐れもあるしね。

55デフォルトの名無しさん:2006/08/05(土) 23:49:57
char* p, pp;
なんていうのもありがちだしな。
56デフォルトの名無しさん:2006/08/05(土) 23:55:43
>>55
意識したことなんだが、これってpだけポインタ?
57デフォルトの名無しさん:2006/08/05(土) 23:56:35
そう、ppもポインタにしたければ
char *p, *pp;
58デフォルトの名無しさん:2006/08/05(土) 23:57:22
>>50
違う。
C言語の規格で、main()の引数は void もしくは int, char** って決まってる。
そして、C言語で関数の引数宣言を省略したとき、その関数は「void」(引数無し)ではなく
「...」(可変長引数)となる。
59デフォルトの名無しさん:2006/08/06(日) 00:00:36
>>47はコンパイラのWarning見なかったり、普段から条件式に副作用のある式を入れる人?
(0 == p) よりも (p == 0) の方が、左から右に、ストレートに読めるじゃん。
「0がpの時」って書きたいんじゃなくて、「pが0の時」って書きたい場合、(p == 0) の方が
綺麗な書き方。
60デフォルトの名無しさん:2006/08/06(日) 00:05:48
C#でSystem.Console.WriteLine(str) を WriteLine("{0}", str) 
と書かないとバグを生むと力説してた人がいたのを思い出した。
61デフォルトの名無しさん:2006/08/06(日) 00:11:38
>>59
もちろん(0==p)とするメリットをわかってる上で言ってるよな?
62デフォルトの名無しさん:2006/08/06(日) 00:13:57
>>6はうまいこと自分の勘違いをスタイルの問題とか泥沼な話題にそらしたな
63デフォルトの名無しさん:2006/08/06(日) 00:16:00
>>58
ネタはいいけど嘘はいかんよ。
64デフォルトの名無しさん:2006/08/06(日) 00:20:19
いやでも実際>>6で言ってるような奴が
今回のような間抜けなバグを仕込んでるんじゃないの?w
65デフォルトの名無しさん:2006/08/06(日) 00:24:37
>>64
printf 使うのがそんなにおかしいか?

まあこの場合は puts だろうが、
改行なしの文字列の出力の場合はどうするんだ?
66デフォルトの名無しさん:2006/08/06(日) 00:29:42
>>65
君に便利な標準関数を教えてあげよう。

fputs
67デフォルトの名無しさん:2006/08/06(日) 00:34:38
>>66
ああ、そうだ…その手があった。
標準出力にfputs使うなんて考えもしなかった。

結構だめだな。おれ。
68デフォルトの名無しさん:2006/08/06(日) 00:37:38
>>65
いや単純に>>6みたいな書き方がおかしいってことじゃなくて、
void hoge( const char* user_input ) {
  printf( user_input );
}
みたいな書き方を普通にしてそうだってこと。
んで>>1のバグもそういう奴が仕込んだのでは、と。
69デフォルトの名無しさん:2006/08/06(日) 00:40:24
それは既に>>1の記事で明らかなことじゃまいか
無理矢理>>6に関連付けるとかどうよ?
70デフォルトの名無しさん:2006/08/06(日) 00:45:30
>>69
安易にバグを決め付けるような示唆をしてる
>>1の記事書いたやつは素人だよ。
s,f,printf かどうかもわからないのに。
71デフォルトの名無しさん:2006/08/06(日) 00:50:06
いや別に無理矢理なつもりはなかったんだが・・・
ただ漏れは>>1のようなバグコードは
どういう奴が書きそうかってことを言いたかっただけね。
72デフォルトの名無しさん:2006/08/06(日) 00:52:58
>>59 >>61
とりあえずこれ置いときます
http://www.kouno.jp/home/c_faq/c17.html#4
73デフォルトの名無しさん:2006/08/06(日) 00:57:17
>>61
副作用の意味がわかってない人

>>72
C Prog FAQ 読んでその気になってる人
74デフォルトの名無しさん:2006/08/06(日) 01:00:45
>>72
んなもん拾ってくるより自分で説明した方が早いだろ?
75デフォルトの名無しさん:2006/08/06(日) 01:08:22
早いけど、特に2chでは適当なソースを貼った方がいい
76デフォルトの名無しさん:2006/08/06(日) 01:18:34
>>59
アホ。明らかに皮肉って書いてるだろがボケが。
全体を読んでレスれよ。断片的に読んで噛み付いてくんなカス。
77デフォルトの名無しさん:2006/08/06(日) 01:21:56
>>45
> printf("100%search done.\n") ;
これはデフォルトで警告を出したり、警告レベルを上げておくと警告
してくれるコンパイラがほとんどですね。

> printf(strSomeThing) ;
> なんていうのをうっかり書いてしまうから。
飛躍しすぎでしょう。
78デフォルトの名無しさん:2006/08/06(日) 01:22:12
アホにマジギレ乙
79デフォルトの名無しさん:2006/08/06(日) 01:27:18
マジレスにはマジギレが基本だろ
8061:2006/08/06(日) 01:34:07
>>73
何で俺は「副作用の意味がわかってない人」なんだ?そのこと自体がマジメにわからん
今後のためにもよかったら教えてくれ
81デフォルトの名無しさん:2006/08/06(日) 01:35:03
いや、アホはスルーが基本
82デフォルトの名無しさん:2006/08/06(日) 01:37:26
>>80
じゃあ聞くが、>>61 は何の意図で書いたんだ?
83デフォルトの名無しさん:2006/08/06(日) 01:41:36
質問に質問で返したよコイツ。
国語の成績1だな
84デフォルトの名無しさん:2006/08/06(日) 01:42:59
>>80
普段からコンパイラのWarningを見ない人か、条件式に副作用のある式を書く人じゃなければ、
0==pとは書かないだろうと>>59が言ったのに対して、
>もちろん(0==p)とするメリットをわかってる上で言ってるよな?
と、見当違いなレスを返しているため。
85デフォルトの名無しさん:2006/08/06(日) 01:43:38
マジで言ってるのか?

おれが見る限り、>>59の前提を取り入れると
>>61の確認は意味がないって言ってるんだが。

それともコンパイル時に警告吐かせないようにしてるのか?
8685:2006/08/06(日) 01:44:39
>>61=80=83に対してです。
87デフォルトの名無しさん:2006/08/06(日) 01:50:57
マジで言ってるのか?

おれが見る限り、質問に質問で返したら
国語の成績は意味がないって言ってるんだが。

それとも学生時にテスト受けないようにしてるのか?


>>83!=80=87に大尉してです。
88デフォルトの名無しさん:2006/08/06(日) 01:52:43
基地外はスルーで。
89デフォルトの名無しさん:2006/08/06(日) 01:53:42
>>87
ワロタ。
まあ、間違ったからってそう必死になるな。
これ以上は何も書き込まないほうがいいぞ。
90デフォルトの名無しさん:2006/08/06(日) 01:54:09
またアホが1人来た。
このスレでキチガイをスルーするくらいなら、
そもそもこのスレに来る必要が無いことくらい理解しとけ。
91デフォルトの名無しさん:2006/08/06(日) 01:55:01
>>89
はぁ?理解出来なかったのか?
国語の成績マジで1だなぁ。
92デフォルトの名無しさん:2006/08/06(日) 01:56:02
>>90
専門卒乙
93デフォルトの名無しさん:2006/08/06(日) 01:56:10
元々 p==0 派だったけど、0==p 派に改宗した俺からすれば
0==p 派が言ってるのは「言い訳」レベルで「正当な理由」足り得ない。
Warningだって常にコンパイラが出してくれる保証なんてどこにもない
(複雑な構文になってる場合や特定の条件が揃うとWarningとして扱われ
ないなんてことも十分考えられる)し、「普段から条件式に副作用の
ある式を入れる人?」ってのはそもそも論点がずれてる。
94デフォルトの名無しさん:2006/08/06(日) 01:58:33
>>92
学歴コンプレックスをお持ちとは、
なかなかいい趣味をしてますな。

どうです?専門板で一緒に憂さ晴らしでも?
95デフォルトの名無しさん:2006/08/06(日) 01:59:18
つ おい何が恥ずかしいんだコノスレ
96デフォルトの名無しさん:2006/08/06(日) 02:00:21
このスレに居ることが恥ずかしいんだよボク
9793:2006/08/06(日) 02:01:32
×0==p 派が言ってるのは「言い訳」レベルで「正当な理由」足り得ない。
○p==0 派が言ってるのは「言い訳」レベルで「正当な理由」足り得ない。

間違えたああ orz
98デフォルトの名無しさん:2006/08/06(日) 02:02:51
>>93
ずれてないよ。
9961:2006/08/06(日) 02:03:19
流れに乗り遅れてしまったorz

>>82
安直にレスしてしまったなあと後悔してる

けど>>84の言う
「条件式に副作用のある式を書く人じゃなければ、0==pとは書かないだろう」
の意味が素直にわからない


ちなみに>>83=>>87は俺じゃない
100デフォルトの名無しさん:2006/08/06(日) 02:04:29
>>93
まあ、君みたいに閉じ括弧を書き忘れるような注意力散漫な子は、
0==pと書いておけばいいんじゃね?
101デフォルトの名無しさん:2006/08/06(日) 02:05:55
>>93
勝手に解釈するが、二個目の 0==p は p==0 だよな?
意味不明な主観を前提を持ち出すならば、その前提に反論する。

構文解析の木を作る段階でコンディションの中に代入が含まれてる時点で
警告出すコンパイラのほうが多いだろ。自分でその実装を考えてみろ。
102デフォルトの名無しさん:2006/08/06(日) 02:07:15
>>99
普段、条件式に副作用のある式を書く人は、p=0にコンパイラが警告を出さないか、
出したとしても無視する癖がついてるだろうから。
103デフォルトの名無しさん:2006/08/06(日) 02:08:30
つまり、普段コンパイラのWarningを見る人か、条件式に副作用のある式を書かない人は、
0==pと書く必要がない。
104デフォルトの名無しさん:2006/08/06(日) 02:09:11
>>99
例出すよ。

if( fp = fopen(ほげ) )
副作用: fp に fopen が代入される

その後、isTrue(fp) として条件分岐
105デフォルトの名無しさん:2006/08/06(日) 02:10:29
副作用のある式とか言ってるからだろ。
関数にだって副作用があるが、書いても警告は出ない。
ちゃんと代入式を書く人は、と言えアホ
106デフォルトの名無しさん:2006/08/06(日) 02:10:55
>>104
なにそのくそこーど
10761:2006/08/06(日) 02:13:02
>>104がくそこーどに見えない俺はどうみても経験不足です
アホな学生につきあっていただきありがとうございました
108104:2006/08/06(日) 02:14:58
orz

s/fopen /fopen()の結果/

それと擬似コードでうざくてすまん。

他にも代入の副作用なら関数内の引数とかもある。
109デフォルトの名無しさん:2006/08/06(日) 02:16:00
>>105
それなんて言い訳?
110デフォルトの名無しさん:2006/08/06(日) 02:17:11
そのレスは、副作用のある式とか書いちゃったアホの言い訳?

111デフォルトの名無しさん:2006/08/06(日) 02:20:39
>>110
これだけ「副作用」でわかってるやつが多いってのに、
いちいち「適切でない」なんて否定してたら現実社会やってけねーぞ。
112デフォルトの名無しさん:2006/08/06(日) 02:21:52
適切な書き方も出来ない奴が

「副作用の意味がわかってない人」

とかレスしてたんでからかってるだけw
113デフォルトの名無しさん:2006/08/06(日) 02:22:05
間違いは素直にみとめましょう
114デフォルトの名無しさん:2006/08/06(日) 02:22:44
>>107
普通は
if ((fp = fopen()) == NULL) {}
と書く。なぜならそう書けば、コンパイラが警告を出さないから。
115デフォルトの名無しさん:2006/08/06(日) 02:24:12
>>112
いちいちお前定義の「副作用」をここでお披露目してなんの意味があるんだ?
空気嫁。
116デフォルトの名無しさん:2006/08/06(日) 02:25:10
>条件式に副作用のある式を書かない人

だからそれは関係ねぇだろ、== が typo で = となった時の問題なんだから。
117104:2006/08/06(日) 02:25:20
>>114
あー、そういえばそうですね。
118デフォルトの名無しさん:2006/08/06(日) 02:25:24
普通は

if(File* fp = fopen())

と書く。
119デフォルトの名無しさん:2006/08/06(日) 02:26:12
お前らこっち逝け。

ぱっと見て「ヘタだなぁ」と思うコード その4
http://pc8.2ch.net/test/read.cgi/tech/1153312202/
12061:2006/08/06(日) 02:26:22
>>107
ああ、そういう意味ですか
てっきり副作用のある条件式ってなだけでくそこーどなのかと思った


まあ今までは「副作用のある条件式を使うのは常識」と考えてたので、
>>61=>>80=>>99=>>107はこのスレの流れに若干混乱気味だったとお思いください
121デフォルトの名無しさん:2006/08/06(日) 02:26:33
>>115
適切な書き方も出来ないから国語が1なんだよ。
教科書嫁
122デフォルトの名無しさん:2006/08/06(日) 02:26:58
>>118
コンパイルとおりません…。
123デフォルトの名無しさん:2006/08/06(日) 02:27:30
Cにbool型を導入してintとの暗黙の型変換を禁止してしまわないとこの論争は永遠に続きそう。

>>1の話に戻すが、%S %n 以外の %s %d などは問題ないようにも読めるけどどういうケースが考えられるのかな。
124デフォルトの名無しさん:2006/08/06(日) 02:27:46
>>116
普段条件式に副作用のある式を書かない人は、そのtypoをコンパイラが警告してくれるので、
すぐに間違いに気づく。
125デフォルトの名無しさん:2006/08/06(日) 02:28:08
>>101
C++の場合、構文上代入に見えてもそれが本当に代入を意味するかどうかが
コンパイル中にはわかるとは限らないんだけど。
126デフォルトの名無しさん:2006/08/06(日) 02:28:16
>>122
気合で通せ。さもなきゃ市ね。
127デフォルトの名無しさん:2006/08/06(日) 02:30:10
>>126
少なくとも昔のCなら通らんだろ。C99なら通るんだっけ?
128デフォルトの名無しさん:2006/08/06(日) 02:30:12
句点つけたりつけなかったりの奴が国語がどうたら言ってはいけない。
129デフォルトの名無しさん:2006/08/06(日) 02:30:51
>>123
>>>1の話に戻すが、%S %n 以外の %s %d などは問題ないようにも読めるけどどういうケースが考えられるのかな。

実際に問題がなかった。
事前に文字列をパースして変換する処理はしてたんだけど、
マイナーな%S, %nが抜けたのではないかという見方がある。
130デフォルトの名無しさん:2006/08/06(日) 02:34:01
>>128
句点無いと理解に支障がでるのか?
だから国語が1なんだよ。
131デフォルトの名無しさん:2006/08/06(日) 02:34:21
>>121
何でおれがお前定義の言語で構成された報告書を出さねばならんのだ。

日本語はプログラムじゃないぞ?
解釈する人は多数いるんだから「適切」という言葉自体がどういう意味にでもなる。

それと国語のテストは解釈の問題の方が多くないか?
言葉の定義を書けなんて問題は聞いた事ないな。
132デフォルトの名無しさん:2006/08/06(日) 02:35:51
>>131
副作用の意味がわかってなかった癖に〜
133デフォルトの名無しさん:2006/08/06(日) 02:36:10
どっちかがやめるまでこの争いは終わらんかもわからんね
134デフォルトの名無しさん:2006/08/06(日) 02:37:34
>>130
おk、今度は入れたねw
つーか俺小学生のときに作文で句点入れ忘れて
減点されたことあんのよ。
135デフォルトの名無しさん:2006/08/06(日) 02:37:55
この争いは、このスレの副作用なのでしょうがない。
136デフォルトの名無しさん:2006/08/06(日) 02:39:07
関数型スレッドにしよう
137デフォルトの名無しさん:2006/08/06(日) 02:39:11
>>47は単なるネタかと思ったが、本気でそう主張したかったとは思いもよらなかった。
最近自分で見つけたテクニックで、人に言わずにいられなかったんだろうか。
138デフォルトの名無しさん:2006/08/06(日) 02:40:31
>>134
はいはい、もともと成績1なんだから、減点されても1だろうが
139デフォルトの名無しさん:2006/08/06(日) 02:40:48
>>129
http://plusd.itmedia.co.jp/mobile/articles/0608/03/news081.html
>具体的には、メールの本文に「%n」「%S」と入力すると、
>端末が再起動するというもの。
>%とn、%とSの間に0から255ケタまでの半角数字や
>+、-、 #、.などの記号、半角スペースが入る場合にも
>端末が再起動する。

>なお、両端末で受信したメールの本文に
>上記の文字列が入っている場合にも再起動するため、
>メールを送信する側も注意が必要だ。


'%' をエスケープさせるなら '%' -> '%%' の変換処理を前もってすればいいだけでそ?

変換処理がないなら、"%s" でも再現性あるはずだから報告あるはずだし、
%n と %S に独自の実装があったんでない?
140デフォルトの名無しさん:2006/08/06(日) 02:41:18
14161:2006/08/06(日) 02:42:04
>>137
いや、ネタなんだろうけど全ては61の勘違いでこの流れに・・・
142デフォルトの名無しさん:2006/08/06(日) 02:47:48
なんだかよくわからん展開になって参りました
143デフォルトの名無しさん:2006/08/06(日) 02:49:56
ま、今日一番勢いがあるスレになって
最終的にはよかったんじゃないかな?
144デフォルトの名無しさん:2006/08/06(日) 02:53:38
わざわざ不毛な議論を展開したこのスレに乾杯。
145デフォルトの名無しさん:2006/08/06(日) 02:58:14
const char *p;
char const *p;
char * const p;
const char const *p;
const char * const p;
146デフォルトの名無しさん:2006/08/06(日) 02:59:11
>>77
そういうコードを見たことがあるから飛躍しすぎとも言えない。
まぁその人はうっかりって言うより
printf関数とかの引数の意味を理解してなかっただけなんだけども。
入門書で扱うのは行き過ぎな気もするが、
こういう問題が出てる以上はきちんと説明した方がいいのかもしれない。
147デフォルトの名無しさん:2006/08/06(日) 03:04:24
>>145
>char * const p;
>const char * const p;
これいけるの?

>>146
結論:新米には一度 printf を作らせる
148デフォルトの名無しさん:2006/08/06(日) 03:08:18
>>146
printf(変数)と書くと問題がある場合があるから、printf(文字列リテラル)も禁止するというのはやりすぎでは?
149デフォルトの名無しさん:2006/08/06(日) 03:10:05
こーいうこと言うヤシに限って、コンパイラのwarningは英語で読めないとかのたまうから困る
150デフォルトの名無しさん:2006/08/06(日) 03:11:00
>>148
いや禁止にするとかじゃなくて
危険性を理解させること。
151デフォルトの名無しさん:2006/08/06(日) 03:12:23
ん、>>45に賛同する人じゃなかったのか?
152デフォルトの名無しさん:2006/08/06(日) 03:14:21
153デフォルトの名無しさん:2006/08/06(日) 03:14:53
overloadが使えるとして、printf(const char *str) と printf(const char *fmt, ...) に別の処理をふったら解決なんだろうけどね。
154デフォルトの名無しさん:2006/08/06(日) 03:16:24
諸悪の根源は puts が勝手に改行するという謎仕様。
この改行があるがために、単なる文字列リテラルを標準出力するのにprintfを使ってしまうという事実。
155デフォルトの名無しさん:2006/08/06(日) 03:16:28
まあ、いちいち解析処理のある関数使うよりは
そのまま stdout に出力したほうがいいだろう。
156デフォルトの名無しさん:2006/08/06(日) 03:17:27
>>151
自分は賛同しない方。
printf(文字列リテラル)は普通に使うし。
157デフォルトの名無しさん:2006/08/06(日) 03:18:30
#define print(x) fputs(stdout,(x))
158デフォルトの名無しさん:2006/08/06(日) 03:21:11
まぁでもいい機会だから、これを機にfputsを使うようにしようっと。
159デフォルトの名無しさん:2006/08/06(日) 03:22:30
>>157
可変個引数は使用禁止ですかそうですか
160デフォルトの名無しさん:2006/08/06(日) 03:25:03
>>159
ってか、文字列リテラルで可変にしたいなら
print( "Line 1\n" "Line 2" )

ってやりゃよくね?
161デフォルトの名無しさん:2006/08/06(日) 03:30:26
C言語がクソってことだね♪
162デフォルトの名無しさん:2006/08/06(日) 03:31:32
>>161 が盛り上げようとしてくれてます
163デフォルトの名無しさん:2006/08/06(日) 03:33:50
>>160
そりゃそうだけど、
>>157を定義したらprintfの本来の使い方ができないでしょw
164163:2006/08/06(日) 03:34:54
ごめん
#define printf
と見間違えてた。吊ってくる。
165デフォルトの名無しさん:2006/08/06(日) 03:45:56
>>161
つまりlisp最強ってことですね♪
166デフォルトの名無しさん:2006/08/06(日) 06:59:48
>>145
typedefしないDQNは死ね。
167デフォルトの名無しさん:2006/08/06(日) 07:01:55
>>146
printfの注意事項を書かずとも、せめて「お手本」のコードを、なんとかしろ、と。
168デフォルトの名無しさん:2006/08/06(日) 07:03:34
>>148
> printf(文字列リテラル) ;
これはvsprintfの処理が入るだけ無駄だろ。
169デフォルトの名無しさん:2006/08/06(日) 07:07:43
>>156
そしてバグると。

>>157
fputs((x), stdout)
だと思う。

170157:2006/08/06(日) 11:48:06
>>169
その通りでした
int fputs(const char *s, FILE *stream);
171デフォルトの名無しさん:2006/08/06(日) 13:25:43
いいから早く>>1のどこが恥ずかしいのか教えろよ。
気になって昼飯も喉を通らないだろ
172デフォルトの名無しさん:2006/08/06(日) 13:53:21
夏バテじゃないかな

そもそも出力用の関数のくせにメモリに書き込む機能があるのが
173デフォルトの名無しさん:2006/08/06(日) 18:35:57
あのさぁ、printfに文字列リテラル書くのって別に危なくないだろ?
リテラルは内容がわかって書いているんだから、それで>>1のようなアグだすのはよっぽどアホ。
危険なのははリテラルではなく、「文字列変数」を突っ込む場合だろ?
174デフォルトの名無しさん:2006/08/06(日) 18:37:00
×アグ
○バグ
175デフォルトの名無しさん:2006/08/06(日) 18:48:09
そうだよね。
printf("100%search done.\n");
とか全然問題ないよね。
176デフォルトの名無しさん:2006/08/06(日) 18:53:27
警告レベル上げとけばいいじゃない
177デフォルトの名無しさん:2006/08/06(日) 19:43:23
羹に懲りて膾を吹く
178デフォルトの名無しさん:2006/08/06(日) 19:44:47
コンパイラが警告だすべきだよな
179デフォルトの名無しさん:2006/08/06(日) 19:51:00
出すよ。
180デフォルトの名無しさん:2006/08/06(日) 22:49:13
stdio なんてつかっているやつはばかです
181デフォルトの名無しさん:2006/08/06(日) 23:19:29
そうです
gcc以外を使ってるやつはばかです
182デフォルトの名無しさん:2006/08/07(月) 03:22:44
>>176
printf("%s") ;
に警告を出すのはLINTなどの仕事であって、コンパイラの仕事じゃないだろ。

void OutputMessage(const char* pStrMessage) {
printf(pStrMessage) ;
}

OutputMessage("something contains %s") ;

それに、こういうのに対処できないよね。
183デフォルトの名無しさん:2006/08/07(月) 04:31:40
>>182
仕事云々については「じゃあlint動かせばいいじゃない」ってだけの話
OutputMessageは、その関数の作成者がprintfの第一引数は書式指定文字列で
あることを失念してるからバグってるのであって、printfに文字列リテラルを渡して
うっかり%sなりなんなり混じってしまったという話とは関係がない
おまいさん流に言えば、馬鹿なコード書くヤシの面倒を見るのはコンパイラやlintの仕事じゃない
184デフォルトの名無しさん:2006/08/07(月) 05:52:58
普段から
printf("Hello, world!");
なんて書いていると、忘れるんですよ。
185デフォルトの名無しさん:2006/08/07(月) 10:07:29
printf("Hello, world!"); の検索結果 約 625,000 件中 1 - 10 件目 (0.16 秒)
puts("Hello, world!"); の検索結果 約 424,000 件中 1 - 10 件目 (0.17 秒)
186デフォルトの名無しさん:2006/08/07(月) 10:10:48
>>182
お前さぁ、流れにそってレスしろよボケ!
>>173
>>175
>>176
187デフォルトの名無しさん:2006/08/07(月) 10:24:45
>>184
いいえ、忘れません。
188デフォルトの名無しさん:2006/08/07(月) 12:42:23
Hello Worldにはputsを使うべき。
189デフォルトの名無しさん:2006/08/07(月) 13:09:35
>>188に烈しく同意。
190デフォルトの名無しさん:2006/08/07(月) 17:47:49
バカか。関数 hello_world() を作るべきだろ。
191デフォルトの名無しさん:2006/08/07(月) 18:30:57
○○に○○しく同意、というレスは、自演の代名詞。
192デフォルトの名無しさん:2006/08/07(月) 18:39:26
>>191に著しく同意
193デフォルトの名無しさん:2006/08/07(月) 18:45:18
>>191に悔しく同意
194デフォルトの名無しさん:2006/08/07(月) 19:41:18
hello world ! に最適な言語といえばこれか
http://ja.wikipedia.org/wiki/HQ9+
195デフォルトの名無しさん:2006/08/08(火) 03:14:13
$ echo Hello, world!
196デフォルトの名無しさん:2006/08/08(火) 11:19:13
C言語なんてもう使ってんなよ、おっさん乙
197デフォルトの名無しさん:2006/08/08(火) 13:06:48
>>196 は、Cが難しくて挫折した組の人だそうです。
198デフォルトの名無しさん:2006/08/08(火) 16:44:01
>>196
そんなことよりおちんちんしゃぶれ!
199デフォルトの名無しさん:2006/08/20(日) 16:30:40
>>198
しゃぶれだぁ?てめえがしゃぶれよ!
200デフォルトの名無しさん:2006/08/20(日) 21:34:41
>>197
オブジェクト指向が理解できなくてCに固執した組の人だそうです
201デフォルトの名無しさん:2006/08/20(日) 21:53:09
携帯のアプリって、
C言語でsprintfとか使って作ってるってことか?
202デフォルトの名無しさん:2006/08/20(日) 22:37:26
SymbianOS だと,C/C++ 標準関数やクラスは一切使わない。用意されてない。
でもやっぱり %s みたいな書式指定は便利だから,踏襲してる。

au 携帯の OS は何使ってるか知らないけど
まあ正確には,*printf みたいな標準関数を使ってのバグというよりは
そういう書式指定をする,独自の関数を使って起きたバグなんじゃまいか。
203デフォルトの名無しさん:2006/08/21(月) 18:44:23
独自の関数であってもなんにしても、
書式化出力関数に文字列を直接渡しちゃうのはかなりお粗末。
しかもユーザーが任意の文字列を送れるし…
204デフォルトの名無しさん:2006/08/26(土) 15:06:47
>>45
> printf(strSomeThing) ;
> なんていうのをうっかり書いてしまうから。

ちゃんと書くなら、
printf(strSomething):
ってこと?
205デフォルトの名無しさん:2006/08/27(日) 14:18:02
皮肉なのかアホなのかわからんが
printf("%s",strSomeThing);
206デフォルトの名無しさん:2006/08/27(日) 18:30:38
書式化処理をしない
print
があればいいのにな。

fputs使えばいい、というのは、どうかと思うのです。
207デフォルトの名無しさん:2006/08/27(日) 18:52:56
#define print(str) fputs((str),stdout)
208デフォルトの名無しさん:2006/08/27(日) 19:44:38
>>207
それは、「fputs使えばいい」そのもの。

標準Cライブラリにprintがあるべき。
そして入門書のサンプルコードでは、
print("計算結果\n") ;
printf("合計は %d です。\n", hoge) ;
のようにすればいい。

それだったら
printf("計算結果\n合計は %d です。\n", hoge) ;
でいいだろ、という話もあるが、自分が見た本は、すべからく複数回printfを呼んでいた。
209デフォルトの名無しさん:2006/08/27(日) 20:38:20
.NET FrameworkのConsole.Writeのようなのを期待してるのかな
210デフォルトの名無しさん:2006/08/28(月) 14:04:29
puts()とfputs()の仕様が微妙に違うのが問題だよな。
#つーか、末尾に改行を補うなんて余計なことを……
211デフォルトの名無しさん:2006/08/28(月) 14:08:22
>>210
古い言語は「一行出力関数」があったから、その名残。
212デフォルトの名無しさん:2006/08/28(月) 16:57:38
ごめん、まったくこれっぽっちもスレに関係ないんだが
>208
>すべからく複数回printfを呼んでいた。
気になってしょうがない。
213デフォルトの名無しさん
ことごとく、かな。