アカウント名:
パスワード:
より多くのコメントがこの議論にあるかもしれませんが、JavaScriptが有効ではない環境を使用している場合、クラシックなコメントシステム(D1)に設定を変更する必要があります。
クラックを法規制強化で止められると思ってる奴は頭がおかしい -- あるアレゲ人
何故TAB (スコア:3, 興味深い)
"output.c: html_print()" の設計方針がまったく理解できない。
\x01や\x02にも特殊な意味を割り当ててるようだし
web経由でやってくる汚れたデータを扱う場所で
なぜそのような独自メタ文字を定義するのかな。
手を抜くという目的のためなら手段を選ばない。誰だって犠牲にする。
大人って汚いね。
unhtml_buffer()なんて
条件によってはループが終るときi==BUFSIZEだけど
そのあとbuf[i]にカスを突っ込んでるから他所の土地に手を出してることになる
安全のためにstrncpyを多用してるみたいだけど
strncpyは溢れたとき自動で末尾に留め具NULを置いてくれないから
strncpyを呼んだ後に自分で置かなきゃならないのに放置しているところ沢山
ほんの数十秒眺めただけで気持ちの悪いコードが沢山見えた。
気持ち悪い原因は埋め込まれている沢山のHTMLタグが原因かもしれないけど。
探せばもっと出るんじゃない?
表に出てないだけで実はいくつもの脆弱性が裏では有名になってるのではないかと
思ってみるテストとか言ってみるテスト。
本気でセキュリティーを重視したければnamazu.cgiは選択の候補から外すことか。
Re:何故TAB (スコア:1)
こういうことがやりたいときにはこういう実装が一般的、みたいな
暗黙の了解っていうのはプロのプログラマー(変な表現!)の人たちは
何処で身につけられるのでしょうか?
学校、自分の経験から、会社の先輩から、他人のソースを読んで、
とにかくヒラメキ、そんなのがわからん天才以外プログラミングしてはいかん、etc・・・
勉強がてらの趣味プログラムしか経験していない私ですが
その課程で一番プログラミングに必要とされる知識は
結局そういう実装上の常識?みたいなもんなんじゃないかと痛感しました。
大きな意味でアルゴリズムだと思うんですが
教科書に載ってるような純数学的っぽいエッセンスのようなものではなくて
もっと軽い一般常識とかマナーとかの次元にあるようなルールみたいなものです(表現しづらい)。
自分の経験だと試行錯誤な経験と人のソースを読む
ってことで地道に身につけてくしかないかなぁ、道はスゲェながそうだ・・・
という結論に達したのですが皆さんはどう思われるでしょうか?
あとプログラマーの人たちの間ではこういう常識のあるなしで
こりゃすごいプログラマーだとかそいういうのを判断する材料にしてたりするんでしょうか。
それともとにかく動くプログラムを書く人が一番偉い人?
なんか曖昧な表現が多くてなおかつ野次馬根性全開な質問ですが
皆さんのご意見が伺えれば幸いです。
Javaなどの高級な言語を使いましょう (スコア:1, 参考になる)
ソフトウェアエンジニアリングとアルゴリズムだけに注力したいのなら、そのような些末にとらわれない言語を使うべきです。
# もちろん、Cを使わなければいけないときもありますが。
いったん「何をするべきか」「何をするべきではないか」が分かってしまえばいいんですけど。
> 自分の経験だと試行錯誤な経験と人のソースを読む
> ってことで地道に身につけてくしかないかなぁ、道はスゲェながそうだ・・・
> という結論に達したのですが皆さんはどう思われるでしょうか?
ある問題をCで書き表すとき、その方法にはいくつかありますよね。
私はそれらの選択肢を頭の中でアセンブリ言語に直し、もっとも単純で、できれば高速になるものを選びます。
高速化はこだわらない方がいいですね。機械的に出来る最適化はコンパイラがやってくれますし、数回しか
実行されないところを高速化してもしょうがない。
それよりはソースが単純なものになるように書きましょう。
そうすれば、あとで(自分を含む)誰かが読んだときに分かりやすいですし、変に凝った書き方をするよりも
高速かつ安全であることが多いです。この辺りはCに限りませんけどね。
変なソースを読むよりは、「意識してプログラムを書く」方がお勧めですね。
あとK&Rをきちんと読みましょう。
あの本には標準ライブラリ関数を実際に作る話がたくさん出てきます。自分でもやってみましょう。
処理系で実装は違えど、内部でどんな処理をしているかを知っていれば、取捨選択やコスト計算が出来るようになります。
あとやってはいけないこともね。ついでに関数ごとの細かい違いも頭に入りますし。
# fputs() と puts() の出力の違いとか。 :)
Re:Javaなどの高級な言語を使いましょう (スコア:2, 参考になる)
>(理解出来ない|まともに使えない)、Cの欠点です。
>ソフトウェアエンジニアリングとアルゴリズムだけに注力した
>いのなら、そのような些末にとらわれない言語を使うべきです。
C言語はもともとメモリ操作が容易にできることを想定して
作られているので、それは仕方ないのかなあ、とも思います
私がむしろ問題だと思うのは、
>あとやってはいけないこともね。ついでに関数ごとの細かい違いも頭に入りますし。
># fputs() と puts() の出力の違いとか。 :)
こちらでしょうか。コンパイラ実装の容易性を優先して、コーディングの容易性を犠牲
にしすぎているように思います
Re:Javaなどの高級な言語を使いましょう (スコア:0)
Re:何故TAB (スコア:1)
# パターンくらいはあるんだけど。代表的なのは文字列の終端。
# Cは言語もライブラリも境界にルーズだからね。
必要なのはコンピュータの動作を脳内でエミュレーションする事と、
とことん悲観的に、意地悪くなることかなぁ...
>そんなのがわからん天才以外プログラミングしてはいかん
そんな事はないし、最初から天才な奴もいない。試行錯誤が役に立つ
場合もあるし、アルゴリズム辞典牽いた方がいい場合もある。一般解
はないと思う。
Re:何故TAB (スコア:1)
サンデープログラマからすると、本に載っている内容を
少し変更して組み合わせたりするのをよくやります。
セキュリティーホールによるアップデートの報告のたび、
「俺がネットワークプログラミングしたら、こんなの連発
だろうなぁ」と思います。
-- gonta --
"May Macintosh be with you"
必ず逆を考える (スコア:1)
よく聞くのはすべての場合を考えろってことですかね。
何かをする場合、出来ないときはどうなるのか、しなくて良いとき、いけないときはどんな時かとか、ある変数を使う場合、正しい値の場合はどんな時か、正しくない値はどうするのか、等々と、それらをチェックしなくて良い理由と範囲を明確にする。そうでなければチェックする、そんな所でしょうか。
#で、それを見落としたり、勘違いしたりしてバグると。
Re:何故TAB (スコア:1)
恥を忍んで人に見てもらうってのが早道なのかもね、と言う提案でした。
Re:何故TAB (スコア:0)
結局見向きもされずに終わる可能性も多分にありますよ。
Re:何故TAB (スコア:0)
>"output.c: html_print()" の設計方針がまったく理解できない。
ソース見てないからはっきり言えないが
Unicodeの一バイト目ならそういう処理もあるんじゃね?
Re:何故TAB (スコア:0)
Re:何故TAB (スコア:0)
Unicodeって……たぶんUTF-8のことを指してるんだろうけど、その程度の理解なら普通にコーディングしてください。
Cの場合の"普通"とは、iconvやワイド文字処理関数を使い、直接触らないということです。
Re:何故TAB (スコア:0)
> "output.c: html_print()" の設計方針がまったく理解できない。
これは変だな。
> unhtml_buffer()なんて
namazu.cgi では unhtml_buffer() は呼び出されないが、何か?
> 条件によってはループが終るときi==BUFSIZEだけど
条件式には書かれているがi==BUFSIZEで終わる前に、*strでループが終わるだろう。
i==BUFSIZEで終わるときあるの?
> 安全のためにstrncpyを多用してるみたいだけど
> strncpyは溢れたとき自動で末尾に留め具NULを置いてくれないから
> strncpyを呼んだ後に自分で置
Re:何故TAB (スコア:0)
>
> 俺も気持ち悪いコードは多いと思うけど、ほんの数十秒眺めただけではコードを理解で
> きていないのではないか
「速読」という技を使う人に対する一般的な反応に似ている。
読む速さは訓練次第で数倍にも数十倍にもなる。
プログラミング言語で記述されたプログラムを読む場合、
自然言語で記述された文書より、多くがパターン化されているので、
速読を訓練することで自然言語に対する速読法以上に高速化できる。
沢山のパターンを読み慣れるための訓練を数十年ほど繰り返しておけば、
目に飛び込んできた