K.Maebashi's BBS

ご自由に書き込んでください。雑談も可。
テスト書き込みの類はテスト用掲示板にどうぞ

[日付順表示] [日付順インデックス] [スレッド順インデックス]


新規投稿 | 開設者ホームページへ戻る | ヘルプ


[2327] Re:入力時のバリデーションについて
返信


投稿者:mhash
2022/11/03 14:18:41

Link:
返信が大変遅れまして申し訳ありません。
丁寧にご回答頂きましてありがとうございます。

>まず、「入力時のサニタイズ」と「入力時のバリデーション」は違う話ですよね。
>リンク先の記事を書いている大垣さんも、「入力時のサニタイズ」は擁護していないと
>思います。
そうですよね。勝手に改変したものをそのまま後に渡しているのは。

>「入力時のバリデーション」は、変な入力は入力の時点でエラーにして後ろに流さない
>わけですが、これは別段セキュリティ関係なく、ユーザの入力ミスに備えてやるべき
>ことですし、その要件はアプリケーションの仕様に依存します。
>もちろん、電話番号欄にシングルクォートとか入力されたらエラーにすればよいですし、
>そうすることが結果的にセキュリティに資することもあると思います。
入力時のバリデーションはあくまでも「仕様の問題」ということですね。

>入力時バリデーションは、
>・そもそも要件としてバリデーションできないケースが(かなり)ある。
>・入力から、DBとか、再度画面に表示されるところまでには、プログラム的に
> 長い経路があり、「セキュリティのために」狙ってバリデーションするのは
> 実際には困難。
>
>という問題があります。そこで、入力時バリデーションはセキュリティ対策としては
>「あてにできる」ものではない、と私は思います。
入力時バリデーションがセキュリティに有効なこともあるのはあくまで結果論ということですね。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2326] Re:入力時のバリデーションについて
返信


投稿者:(ぱ)こと管理人
2022/10/30 15:38:35

Link:
>kmaebashiさんが『「サニタイズ言うなキャンペーン」について、私の解釈』や、
>著書でも述べられている、「SQLやHTML等で特別な意味を持つ文字列のエスケープは、
>入力時ではなくそれが外部に出力される直前に行うべき」という主張は納得できる
>ものだと私も思います。
>ただ、以下リンク先のページを見ると、CWE-20等の国際的なセキュリティ標準でも
>入力時のチェックを奨励しているように思えまして、ちょっと混乱しています。
>https://gihyo.jp/dev/serial/01/php-security/0045
>「ユーザーからの入力はどんな文字列でも扱えるべきだが、システム内の各階層では、
>メソッドの引数チェックなりをしっかりやるように」との意味合いなのでしょうか?

まず、「入力時のサニタイズ」と「入力時のバリデーション」は違う話ですよね。
入力時にサニタイズ(無害化)するということは、無害化したその入力を後ろに
流してしまうわけです。実際、当時のPHPのmagic quoteはそんな仕組みでした。
これはどう考えてもおかしいわけで、今はPHPのmagic quoteは廃止されましたし、
リンク先の記事を書いている大垣さんも、「入力時のサニタイズ」は擁護していないと
思います。
「入力時のバリデーション」は、変な入力は入力の時点でエラーにして後ろに流さない
わけですが、これは別段セキュリティ関係なく、ユーザの入力ミスに備えてやるべき
ことですし、その要件はアプリケーションの仕様に依存します。たとえばこの掲示板の
本文は、シングルクォートだろうがHTMLタグだろうが通さなければいけないでしょう。
もちろん、電話番号欄にシングルクォートとか入力されたらエラーにすればよいですし、
そうすることが結果的にセキュリティに資することもあると思います。

入力時バリデーションは、
・そもそも要件としてバリデーションできないケースが(かなり)ある。
・入力から、DBとか、再度画面に表示されるところまでには、プログラム的に
 長い経路があり、「セキュリティのために」狙ってバリデーションするのは
 実際には困難。

という問題があります。そこで、入力時バリデーションはセキュリティ対策としては
「あてにできる」ものではない、と私は思います。

徳丸浩さんの記事:
もう入力値検証はセキュリティ対策として *あてにしない* ようにしよう
https://tumblr.tokumaru.org/post/55393403591/%E3%82%82%E3%81%86%E5%85%A5%E5%8A%9B%E5%80%A4%E6%A4%9C%E8%A8%BC%E3%81%AF%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E5%AF%BE%E7%AD%96%E3%81%A8%E3%81%97%E3%81%A6-%E3%81%82%E3%81%A6%E3%81%AB%E3%81%97%E3%81%AA%E3%81%84-%E3%82%88%E3%81%86%E3%81%AB%E3%81%97%E3%82%88%E3%81%86

半面、入力バリデーション(と静的な型付け)で実際の攻撃を防げるケースもかなり
あるとも言われてはいて、たとえばOWASPの
Application Security Verification Standard 4.0には以下の記述があります。

https://owasp.org/www-pdf-archive/OWASP_Application_Security_Verification_Standard_4.0-en.pdf
> Properly implemented input validation controls, using positive whitelisting
> and strong data typing, can eliminate more than 90% of all injection attacks.
> Length and range checks can reduce this further.

ホワイトリストと静的型付けによる適切な入力バリデーションでインジェクション攻撃の
90%以上が防げるとあります。

大垣さんと徳丸さんとのこの手の議論は長くて、嫌気がさすほどですが(最終的に、
徳丸さんの方が、(おそらくは呆れ果てて)議論を放棄している)、

https://ockeghem.hatenablog.jp/entry/20111226/p1
https://tumblr.tokumaru.org/post/55587596019/%E5%8B%9D%E6%89%8B%E3%81%AB%E8%A7%A3%E8%AA%AC%E5%A4%A7%E5%9E%A3%E6%B5%81%E3%83%90%E3%83%AA%E3%83%87%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E5%85%A5%E9%96%80

入力時バリデーションが結果的にセキュリティ対策になることは徳丸さんは
一切否定していないので、どうもこの「議論」は食い違っているように私には見えます。
そもそも徳丸さんは、OWASP Japanアドバイザリーボードという立場の方なので、
OWASP含め、「国際的なセキュリティ標準」が何を言っているのか知らないわけはないですし。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2325] 無題
返信


投稿者:mhash
2022/10/30 08:34:03

Link:
kmaebashiさんが『「サニタイズ言うなキャンペーン」について、私の解釈』や、著書でも述べられている、「SQLやHTML等で特別な意味を持つ文字列のエスケープは、入力時ではなくそれが外部に出力される直前に行うべき」という主張は納得できるものだと私も思います。
ただ、以下リンク先のページを見ると、CWE-20等の国際的なセキュリティ標準でも入力時のチェックを奨励しているように思えまして、ちょっと混乱しています。
https://gihyo.jp/dev/serial/01/php-security/0045
「ユーザーからの入力はどんな文字列でも扱えるべきだが、システム内の各階層では、メソッドの引数チェックなりをしっかりやるように」との意味合いなのでしょうか?
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2324] Re:【雑談】JavaScriptの「オブジェクト指向」はやわかり
返信


投稿者:rike1019
2022/10/15 11:42:19

Link:https://github.com/rike1019
書いてあったんですね。失礼しました。m(_ _)m
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2323] Re:【雑談】JavaScriptの「オブジェクト指向」はやわかり
返信


投稿者:(ぱ)こと管理人
2022/10/15 11:34:06

Link:
>読みました。

読んでいただきありがとうございます。

>この参照値という言葉は初出な気がするのですが、

以下のページで出ています。
http://kmaebashi.com/programmer/beginner/javascriptintro.html
http://kmaebashi.com/programmer/beginner/array.html

検索経由とかでこのページから読み始める人もいるかもしれませんが、

>JavaScriptでは、オブジェクトは参照経由でアクセスします。
>関数もオブジェクトですから、参照で扱います。ここでは、alertとmyAlertは、
>どちらも同じ関数オブジェクトを「指して」います。
>つまり、alertやmyAlertが保持しているのは関数そのものに対する参照値です。

と書いていて、図も入れてあって「オブジェクトは参照経由でアクセスします」の
ところはリンクにもしてありますから、よっぽど大丈夫なんじゃないかと思っています。
ご意見ありがとうございました。
(参照周りは、「参照渡し」とかでググると絶望するほどに誤解の多いところでは
あるので、くどいぐらいに書いておいた方がよいのかもしれませんが)
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2322] 【雑談】JavaScriptの「オブジェクト指向」はやわかり
返信


投稿者:rike1019
2022/10/14 10:06:40

Link:https://github.com/rike1019
読みました。

> そして、JavaScriptの関数がオブジェクトであるということは、
> 通常のオブジェクトと同じように、
> その参照値を変数に代入したり、関数の引数にしたり、
> 関数から戻り値として返したりできるということです

この参照値という言葉は初出な気がするのですが、
私はJavaを少しかじったのでプリミティブ型と参照型があるんだなー
となんとなくわかるのですが、
はじめてのプログラミングの方は「参照って何?」と思うかもしれません。
他のページで解説されている箇所があったらすみません。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2321] Re:無題
返信


投稿者:(ぱ)こと管理人
2022/09/30 01:04:31

Link:
>コンパイルエラーは警告ではなくエラーなので修正したほうがいいと思います。

ご指摘ありがとうございます。上の行をコピペしてそのままにしてしまいました。
修正しました。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2320] 無題
返信


投稿者:rike1019
2022/09/29 05:57:04

Link:https://github.com/rike1019
「Webサーバを作りながら学ぶ 基礎からのWebアプリケーション開発入門」ダウンロード
http://kmaebashi.com/webserver/download.html

このページの

> 2022/09/23追記:現状のソースだと、Tomcat10以降は警告が出ます。補足を参照してください。

コンパイルエラーは警告ではなくエラーなので修正したほうがいいと思います。

細かいことですがよろしくお願いいたします。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2319] 無題
返信


投稿者:吉野刹那
2022/09/27 18:35:59

Link:
>>2311
変な書き込みをしてしまいすみません。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2318] Re:衝突判定と爆発のナビゲーションリンクについて
返信


投稿者:(ぱ)こと管理人
2022/09/27 01:35:22

Link:
ご指摘ありがとうございます。

>* 10進数の20は16進数で14で文字はDC4
>* 10進数の32は16進数で20で文字はSP 

> 前のページ | 前のページ | ひとつ上のページに戻る | トップページに戻る

上記2点とも修正しました。
また何かありましたらよろしくお願いいたします。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2317] 衝突判定と爆発のナビゲーションリンクについて
返信


投稿者:rike1019
2022/09/26 09:46:26

Link:https://github.com/rike1019
(出先でChromebookで書いているのでリモートホストが変わっていますが)
rike1019は同一人物です。

衝突判定と爆発――完全初心者のためのプログラミング入門
http://kmaebashi.com/programmer/beginner/collision.html

このページの最下部のナビゲーションの「次のページ」のリンクが
コピペでミスしたのか「前のページ」になっていて次のページに飛べません。

> 前のページ | 前のページ | ひとつ上のページに戻る | トップページに戻る

修正したほうがよろしいかと思います。いかがでしょうか?
よろしくお願いいたします。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2316] 「文字コード」とは何か?ASCIIコードの説明について
返信


投稿者:rike1019
2022/09/26 01:39:47

Link:https://github.com/rike1019
表1: ASCIIコード表を見ながら文章を読んでいましたが混乱したところがあります。

>今ではほとんど使われないものが大多数ですが、
>9のHTはHorizontal Tabulation――水平タブ、
>要するにTABキーを押すと挿入されるタブのことですし、
>10と13のLF, CRは改行コードとして使われています。
>また、20のSPは、空白を意味しています。

この9と10と13は10進数の数値の欄を指していますが、20のSPは16進数の数値の欄を指しています。混乱します。どちらかに統一したほうがいいと思います。

* 10進数の20は16進数で14で文字はDC4
* 10進数の32は16進数で20で文字はSP

修正したほうがよろしいかと思いますがいかがでしょうか。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2315] Re:UFOを飛ばそうの部分についての質問
返信


投稿者:(ぱ)こと管理人
2022/09/25 23:15:45

Link:
>リスト9: lesson04_5.html(UFOを動かすことに成功)
>の20行目で、mainLoop();を呼んでいますが、まだ関数を定義する前の行です。
>なぜ、JavaScriptでこれはエラーにならないのでしょうか?

これは、JavaScriptの「巻き上げ」(hoisting)と呼ばれる機能のおかげです。
https://developer.mozilla.org/ja/docs/Glossary/Hoisting

JavaScriptがなぜこうしたのかといえば、単純に「その方が便利だと思ったから」
なのだと思います。たとえばJavaではメソッドの宣言順は動作に影響せず、
宣言前のメソッドも呼び出せます。もっと古い言語であるCでは、巻数は事前に
定義されていなければ呼び出せず、関数funcAがfuncBを呼び出し、
funcBがfuncAを呼び出すような相互呼び出しをやりたいときには、どちらか片方を
事前に「プロトタイプ宣言」しておく必要がありました(不便です)。
Cで不便だと思われていて、Javaでは改善されたわけですから、Javaに似せた言語である
JavaScriptでは、それはJavaに合わせるでしょう。
もっとも、さすがは変態言語というか、JavaScriptでは「巻き上げ」が
関数だけでなく変数に対しても、しかも関数内の変数に対しても適用されるので、
いろいろ混乱の元になっています。

https://analogic.jp/hoisting/

>私は「完全」初心者ではないのですが、python3では、
>mainloop()
>def mainloop():
>    print("Hello, world!")
>と書くと「NameError: name 'mainloop' is not defined」とエラーが出ます。

pythonではなぜ関数を先に定義しておく必要があるかといえば、pythonでは
関数定義のdefは通常の実行文であり、それが実行されて初めて関数が定義されるからです
(逆に言うと、JavaScriptやJavaやCでは、関数定義は実行文ではありません)。
pythonのdefは単なる文なので、たとえばif文の中でdefができます。

a = 10;
if a == 10:
  def func():
    print("hoge")
else:
  def func():
    print("piyo")

func()

このコードは、最初にaに代入する値によって、funcの定義が変わります。
CやJavaのような言語では、こういうことはできません。CやJavaでは、関数定義は、
コンパイルの時点で決まります。
JavaScriptはJavaに似せた言語なので、これを引き継いだのだと思います。

ではJavaScriptではif文の中にfunctionは書けないのか、といえば、これがどうも
書けるようで、でも「結果は実装によって一貫性がない」そうです。さすがは変態言語。

https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Statements/function
| 関数は条件付きで宣言できます。つまり、関数文を if 文の中に入れ子にすることができますが、
| 結果は実装によって一貫性がないので、このパターンを本番コードでは使用すべきではありません。
| 条件付きの関数の作成には、代わりに関数式を使用してください。

私自身、CやJavaのプログラマなので、自分で言語を作ったときには、
型なし言語のcrowbarも、静的型付け言語のDiksamも、関数定義を実行文にはしませんでした。

http://kmaebashi.com/programmer/devlang/index.html

なので、JavaScriptの関数定義については、このようにした気持ちはわかります。
変数定義まで(それもローカル変数まで)同じように巻き上げられるようにしたのは、
正直、理解不能ですが。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2314] UFOを飛ばそうの部分についての質問
返信


投稿者:rike1019
2022/09/25 20:01:07

Link:https://github.com/rike1019
リスト9: lesson04_5.html(UFOを動かすことに成功)
の20行目で、mainLoop();を呼んでいますが、まだ関数を定義する前の行です。
なぜ、JavaScriptでこれはエラーにならないのでしょうか?

私は「完全」初心者ではないのですが、python3では、
mainloop()
def mainloop():
    print("Hello, world!")
と書くと「NameError: name 'mainloop' is not defined」とエラーが出ます。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2313] Re:【雑談】完全初心者のためのプログラミング入門の対象読者について
返信


投稿者:(ぱ)こと管理人
2022/09/25 14:41:37

Link:
>「完全初心者のためのプログラミング入門」を楽しく読まさせていただきました。

読んでいただきありがとうございます。

>Windows前提なのが、まず今の子供達持ってるのかな?と思いました。

確かにそれは私も不安に思っているところです。

>GIGAスクール構想で配られてるのがiPadだったりChromebookだったりして
>Windows搭載のPCを配ってても開発ツールとか入れられないように
>セキュリティガチガチにしてるっぽいですし
>まず個人で自由に使えるパソコンを持ってる子供が
>少ないんじゃないかな?と思いました。

そのあたりの事情は私は詳しくないのですが、Windows PCを配っていて
セキュリティガチガチにされていたとしても、ローカルにHTMLを置いて
ダブルクリックしたらEdgeが立ち上がるんじゃないでしょうか。
それも禁止されているのでしょうか。
Chromebookも持ってないのですが、エディタでHTML書いてダブルクリックして
開く、ということはできるようなので、適宜読みかえていただければと思います
(子供にそれは難しいかもしれませんが、私が持ってない以上解説も書けませんし)。

>GIGAスクールで配られてるものってスペック低い上に、
>日本はハイエンドスマホのiPhoneの普及率が高いので

だからといってiOSアプリを作るとなるとハードルが極端に上がりますからね
(AndroidはともかくiOSとなると、私だって作れない。Macを買う気も
Appleにお金を払う気もないので)。

スマホはさておきパソコンでさえあれば、MacでもChromebookでも
HTMLは書けるでしょうから、「ファイルとフォルダ」、「Webページを作ろう」の章より
後ろのJavaScriptを書き始めたあたりからを参考にしてもらえれば、と思います。

[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2312] 【雑談】完全初心者のためのプログラミング入門の対象読者について
返信


投稿者:rike1019
2022/09/25 13:14:48

Link:https://github.com/rike1019
「完全初心者のためのプログラミング入門」を楽しく読まさせていただきました。

Windows前提なのが、まず今の子供達持ってるのかな?と思いました。

GIGAスクール構想で配られてるのがiPadだったりChromebookだったりして

Windows搭載のPCを配ってても開発ツールとか入れられないように

セキュリティガチガチにしてるっぽいですし

まず個人で自由に使えるパソコンを持ってる子供が

少ないんじゃないかな?と思いました。

西村博之(ひろゆき)がそれを危惧して

ゲームもできるパソコンを児童養護施設に配る企画やってましたけど。

GIGAスクールで配られてるものってスペック低い上に、

日本はハイエンドスマホのiPhoneの普及率が高いので

「パソコンってなんか遅いし持ち運ぶのにも重いしスマホ(iPhone)でいいや」

ってならないかと心配です。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2311] Re:初めまして
返信


投稿者:(ぱ)こと管理人
2022/09/22 00:08:09

Link:
>こんにちは。

こんにちは。
で、何の御用でしょうか?
テスト投稿ならテスト掲示板の方にお願いします。
http://kmaebashi.com/bbs/list.php?boardid=testbbs
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2310] 初めまして
返信


投稿者:吉野刹那
2022/09/21 15:31:47

Link:
こんにちは。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2309] Re:Tomcat 10のパッケージ名の変更について
返信


投稿者:(ぱ)こと管理人
2022/09/21 01:39:18

Link:
>https://qiita.com/nfujita55a/items/b335688ea2a696387deb
>
>このQiita記事に載っていたのですがTomcat10だと
>以前以下のように書いていたインポート元を
>
>import javax.servlet.*
>
>以下のように書き換えないとコンパイルエラーになるようです。

ご連絡いただきありがとうございます。これはなかなか大きな変更ですね。
週末あたりに、Webページに注記を入れようかと思います。
ありがとうございました。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2308] Tomcat 10のパッケージ名の変更について
返信


投稿者:rike1019
2022/09/19 15:29:17

Link:
https://qiita.com/nfujita55a/items/b335688ea2a696387deb

このQiita記事に載っていたのですがTomcat10だと
以前以下のように書いていたインポート元を

import javax.servlet.*

以下のように書き換えないとコンパイルエラーになるようです。

import jakarta.servlet.*

JavaとTomcatの環境構築でハマったので報告しておきます。
ウェブ上のほとんどのJava解説記事がjavax.servletと書いているので
何が悪いのかさっぱりわからず困りましたが単純な変更でした。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2307] Re:『Webサーバを作りながら学ぶ〜』のコンパイルについて
返信


投稿者:(ぱ)こと管理人
2022/08/28 00:25:52

Link:
>OpenJDK 18でコンパイルしたところ、以下のメッセージが表示されました。
>ソースコードが古いAPIを使っているようです。

ご連絡ありがとうございます。私の方でも再現しました。

C:\maebashi\temp\src_20181021\src\appendix\Henacat_0_4>javac -encoding SHIFT_JIS -Xlint:deprecation com\kmaebashi\henacat\webserver\Main.java
.\com\kmaebashi\henacat\servletimpl\ServletService.java:12: 警告:[deprecation] ClassのnewInstance()は推奨されません
        return (HttpServlet)clazz.newInstance();
                                 ^
  Tが型変数の場合:
    クラス Classで宣言されているT extends Object
警告1個

Java9からClass#newInstance()がdeprecatedになっているのですね
(執筆時はJava8だったので気付いていませんでした)。

https://qiita.com/deaf_tadashi/items/3c3118e660861fb43434

Webページに案内を入れる等、なんらかの形で対応いたします。ありがとうございました。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2306] 『Webサーバを作りながら学ぶ〜』のコンパイルについて
返信


投稿者:rike1019
2022/08/27 19:10:56

Link:
OpenJDK 18でコンパイルしたところ、以下のメッセージが表示されました。
ソースコードが古いAPIを使っているようです。

以下コマンドプロンプトからコピーしたものです。

F:\Programming\src\appendix\Henacat_0_4>javac -encoding SHIFT_JIS

F:\Programming\src\appendix\Henacat_0_4\com\kmaebashi\henacat\webserver\Main.java

ノート:.\com\kmaebashi\henacat\servletimpl\ServletService.javaは
推奨されないAPIを使用またはオーバーライドしています。
ノート:詳細は、-Xlint:deprecationオプションを指定して再コンパイルしてください。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2305] Re:offsetofの定義について
返信


投稿者:mhash
2022/07/10 19:13:03

Link:
>>https://www.wdic.org/w/TECH/offsetof
>>上記リンク先のページにあるように、Cのoffsetofマクロを
>>#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
>>という形式で実装している処理系は多いかと思います。そして、TYPE構造体の先頭部分の
>>アドレスを0番地とすれば、MEMBERへのオフセットが取得出来ることも理解できます。
>>しかし、『ポインタ完全制覇』でも触れられていた通り、0という定数は、ポインタ型とし
>>て扱われる文脈ではNULLになるはずです。このマクロはNULL参照を行ったとしてクラッシュ
>>を引き起こさないのでしょうか?
>
>ご質問は、ヌルポインタから->MEMBERの形で指す先を参照した時点で落ちるのでは、
>ということですよね。
>これについてはJIS X 3010:2003であれば「6.6 定数式」のところに、「アドレス定数」として
>以下の記述があります。
>
>| アドレス定数(address constant)は,空ポインタ,静的記憶域期間のオブジェクトを
>| 指し示す左辺値を指すポインタ又は関数指示子を指すポインタとする。
>| アドレス定数は,単項&演算子若しくは整数定数のポインタ型へのキャストによって
>| 明示的に生成されるか,又は配列型若しくは関数型の式の使用によって
>| 暗黙に生成されたものでなければならない。配列添字演算子[],メンバアクセス演算子.
>| 及び->,アドレス単項演算子&,間接単項演算子*,並びにポインタへのキャストは,
>| アドレス定数の生成に使用してもよいが,これらの演算子を使用することによって
>| オブジェクトの値をアクセスしてはならない。
>
>空ポインタから->とか&で「アドレス定数」を生成するのはよいが、その先を参照しては
>いけない、と書いてあるように読めます。
>このoffsetofの定義は、これに合致しているのではないでしょうか。
>

ご返信遅くなり申し訳ありません。
空ポインタからアドレス型の定数を生成するのは大丈夫だから、それを有効なアドレス空間内でポインタ演算して、その先を参照するのはOKということですよね?
ご回答ありがとうございました。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2304] Re:offsetofの定義について
返信


投稿者:(ぱ)こと管理人
2022/06/29 23:32:51

Link:
>https://www.wdic.org/w/TECH/offsetof
>上記リンク先のページにあるように、Cのoffsetofマクロを
>#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
>という形式で実装している処理系は多いかと思います。そして、TYPE構造体の先頭部分の
>アドレスを0番地とすれば、MEMBERへのオフセットが取得出来ることも理解できます。
>しかし、『ポインタ完全制覇』でも触れられていた通り、0という定数は、ポインタ型とし
>て扱われる文脈ではNULLになるはずです。このマクロはNULL参照を行ったとしてクラッシュ
>を引き起こさないのでしょうか?

ご質問は、ヌルポインタから->MEMBERの形で指す先を参照した時点で落ちるのでは、
ということですよね。
これについてはJIS X 3010:2003であれば「6.6 定数式」のところに、「アドレス定数」として
以下の記述があります。

| アドレス定数(address constant)は,空ポインタ,静的記憶域期間のオブジェクトを
| 指し示す左辺値を指すポインタ又は関数指示子を指すポインタとする。
| アドレス定数は,単項&演算子若しくは整数定数のポインタ型へのキャストによって
| 明示的に生成されるか,又は配列型若しくは関数型の式の使用によって
| 暗黙に生成されたものでなければならない。配列添字演算子[],メンバアクセス演算子.
| 及び->,アドレス単項演算子&,間接単項演算子*,並びにポインタへのキャストは,
| アドレス定数の生成に使用してもよいが,これらの演算子を使用することによって
| オブジェクトの値をアクセスしてはならない。

空ポインタから->とか&で「アドレス定数」を生成するのはよいが、その先を参照しては
いけない、と書いてあるように読めます。
このoffsetofの定義は、これに合致しているのではないでしょうか。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2303] 無題
返信


投稿者:mhash
2022/06/29 21:11:14

Link:
連投申し訳ありません。Cの標準ライブラリのoffsetofマクロについて質問させてください。

https://www.wdic.org/w/TECH/offsetof
上記リンク先のページにあるように、Cのoffsetofマクロを
#define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)
という形式で実装している処理系は多いかと思います。そして、TYPE構造体の先頭部分のアドレスを0番地とすれば、MEMBERへのオフセットが取得出来ることも理解できます。
しかし、『ポインタ完全制覇』でも触れられていた通り、0という定数は、ポインタ型として扱われる文脈ではNULLになるはずです。このマクロはNULL参照を行ったとしてクラッシュを引き起こさないのでしょうか?
それとも、offsetofをこのように実装している処理系では何らかの特別な処理を入れているのでしょうか。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2302] Re:無題
返信


投稿者:mhash
2022/06/29 11:34:51

Link:
>>すみません、以前から気になっていたのですが、
>>トップページの「Contents」のサブコンテンツの「プログラマなページ」の項目一覧に
>>「プログラミング言語samplan」が記載されていません。
>
>うーん、ここには「プログラマなページ」以下にあるものすべてを載せている
>わけではないので、
>
>http://kmaebashi.com/programmer/index.html
>
>samplanのようなちょろっと書いたようなプログラムは記載しなくていいんじゃないかな、
>という判断でこうしています。
>

ご回答ありがとうございます。
確かに「プログラマなページ」以下の項目すべてを目次に載せているわけではなかったですね。失礼いたしました。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2301] Re:C言語とRustの関係について
返信


投稿者:(ぱ)こと管理人
2022/06/28 23:48:08

Link:
>今後はRustを勉強していくべきだと思いますか?

WebAssemblyはともかくとして、今後のシステム記述言語がRustに置き換わっていくというのは
十分ありそうな話だと思います。さすがにC/C++は危ないので。
なので私もRustを勉強しようと思いつつ、ほぼ手が出せていない状態です……
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2300] C言語とRustの関係について
返信


投稿者:rike1019
2022/06/27 17:20:33

Link:
リーナスはLinuxカーネルの3000万行あるCコードを
Rustで書き直す気はないと言っていますが
第2言語としてRustを採用するらしいです。
今後はRustを勉強していくべきだと思いますか?
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2299] Re:無題
返信


投稿者:(ぱ)こと管理人
2022/06/19 13:08:39

Link:
>すみません、以前から気になっていたのですが、
>トップページの「Contents」のサブコンテンツの「プログラマなページ」の項目一覧に
>「プログラミング言語samplan」が記載されていません。

うーん、ここには「プログラマなページ」以下にあるものすべてを載せている
わけではないので、

http://kmaebashi.com/programmer/index.html

samplanのようなちょろっと書いたようなプログラムは記載しなくていいんじゃないかな、
という判断でこうしています。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[2298] 無題
返信


投稿者:mhash
2022/06/18 21:36:30

Link:
すみません、以前から気になっていたのですが、
トップページの「Contents」のサブコンテンツの「プログラマなページ」の項目一覧に「プログラミング言語samplan」が記載されていません。
[ この投稿を含むスレッドを表示] [ この投稿を削除]



[ より古い投稿]