CS+のコード生成ツールが生成するポインタ変数でvolatile修飾子の記述位置がおかしいものがあるように思います

藤田様の別スレッドに便乗なのですが、CS+のRL78のコード生成ツールが生成するuart通信機能のポインタ変数でvolatile修飾子の記述位置がおかしいものがあるように思います。具体的な変数名で言うと、gp_uart0_tx_addressとgp_uart0_rx_addressです。(CS+ for CC V5.00.00のコード生成機能で確認しました。)

コード生成ツールが生成した変数宣言は以下の通りです。

volatile uint8_t * gp_uart0_tx_address;         /* uart0 send buffer address */

volatile uint8_t * gp_uart0_rx_address;         /* uart0 receive buffer address */

ところが、以下の画面コピーの赤枠の箇所の通り、割り込みルーチン内で変更されるのはgp_uart0_tx_addressやgp_uart0_rx_addressの変数自身ですので以下の変数宣言が正しい気がします。

uint8_t * volatile gp_uart0_tx_address;         /* uart0 send buffer address */

uint8_t * volatile gp_uart0_rx_address;         /* uart0 receive buffer address */

試しに型修飾子の作用の仕方がvolatileと同様なconst(型修飾子の作用自体(機能)としては対義語的になる)で試してみると、変数自身に作用したのは以下の画面コピーのように橙枠の方でしたので、volatileも変数自身に作用させる場合には同様である筈です。

Parents
  • >NULL は何のオブジェクトも指しませんが、逆に、何かのオブジェクトを指すポインタは NULL でないことは確定的です。前段の hogehoge の指す先をアクセスした以降では hogehoge の値は NULL ではないということで、無限ループとなります。

      NULL だったら関数を抜けると言う判断をどこかでしているのなら分かります。
     しかし、そんな事はしていないよね。
      NULL かどうか判断して、「NULLでした」と表示するプログラムは作れないと言うこと?
     NULLをどう使うかはプログラマーしだいだと思います。printfだと0x00の前まで送ると言う仕様だから、それに従うしか無い。
     しかし自分で作った関数で、文字列の先頭アドレスと転送バイト数を指定すれば0x00の所で止める必要も無いわけです。
     言いたいことは、「NULLだったらエラーにしなくてはならず、NULLを使ってはいけません」と言う規則がある訳でも無いだろうと言う事です。

     こういう所では、よくバトルになったりするけれど、攻撃している訳じゃないですよ。
     コンパイルの動作がおかしいんじゃないかと言う話です。
  • リカルドさん、こんにちは。藤田様、フォロー有難う御座います。

    リカルドさまwrote: said:
    >1 void hoge(void)
    2 {
    3 extern volatile int* hogehoge;
    4 while (*hogehoge) ;
    7 while (hogehoge) ;
    10 }

    hoge:
    movq .refptr.hogehoge(%rip), %rax
    movq (%rax), %rdx
    .L2: while (*hogehoge)に相当
    movl (%rdx), %eax
    testl %eax, %eax
    jne .L2
    .L3:              while (hogehoge)に相当
    jmp .L3       hogehoge がゼロでない事を何処で判断したの?
    .text
    リカルドさまwrote: said:
    >NULL は何のオブジェクトも指しませんが、逆に、何かのオブジェクトを指すポインタは NULL でないことは確定的です。前段の hogehoge の指す先をアクセスした以降では hogehoge の値は NULL ではないということで、無限ループとなります。

     NULL だったら関数を抜けると言う判断をどこかでしているのなら分かります。
     しかし、そんな事はしていないよね。
     NULL かどうか判断して、「NULLでした」と表示するプログラムは作れないと言うこと?
     ...略...
     コンパイルの動作がおかしいんじゃないかと言う話です。

    それは、このx86 Windows(あるいはLinux)用のGCCの最適化機能に関して私がリンクを書いたKMC(京都マイクロコンピュータ社)のスタッフさんが書かれたブログの以下の話に結びつくものではないかと思います。

    私は、これは GCC の問題というよりは、ポインタを NULL チェック無しでいきなり参照している Linux Kernel のコードの問題だと思います。しかし、Kernel などのセキュリティが重要なソフトウェアをビルドする際には、fno-delete-null-pointer-checks を付けておいた方が良さそうです。

    # あるいは、NULL チェックが行われていないポインタ参照全てにデフォルトのチェックコードを挿入するようなオプションがあれば良いのかもしれません。

    また、この最適化に関しては以下のリンク先のように、リカルドさんと同じく、いろいろ思うところのある人もいると思います。

    Qiita投稿(この人の投稿の真ん中あたり(余談の項より上で))
    qiita.com/AoiMoe/items/2554f78dc9c197d22109

Reply
  • リカルドさん、こんにちは。藤田様、フォロー有難う御座います。

    リカルドさまwrote: said:
    >1 void hoge(void)
    2 {
    3 extern volatile int* hogehoge;
    4 while (*hogehoge) ;
    7 while (hogehoge) ;
    10 }

    hoge:
    movq .refptr.hogehoge(%rip), %rax
    movq (%rax), %rdx
    .L2: while (*hogehoge)に相当
    movl (%rdx), %eax
    testl %eax, %eax
    jne .L2
    .L3:              while (hogehoge)に相当
    jmp .L3       hogehoge がゼロでない事を何処で判断したの?
    .text
    リカルドさまwrote: said:
    >NULL は何のオブジェクトも指しませんが、逆に、何かのオブジェクトを指すポインタは NULL でないことは確定的です。前段の hogehoge の指す先をアクセスした以降では hogehoge の値は NULL ではないということで、無限ループとなります。

     NULL だったら関数を抜けると言う判断をどこかでしているのなら分かります。
     しかし、そんな事はしていないよね。
     NULL かどうか判断して、「NULLでした」と表示するプログラムは作れないと言うこと?
     ...略...
     コンパイルの動作がおかしいんじゃないかと言う話です。

    それは、このx86 Windows(あるいはLinux)用のGCCの最適化機能に関して私がリンクを書いたKMC(京都マイクロコンピュータ社)のスタッフさんが書かれたブログの以下の話に結びつくものではないかと思います。

    私は、これは GCC の問題というよりは、ポインタを NULL チェック無しでいきなり参照している Linux Kernel のコードの問題だと思います。しかし、Kernel などのセキュリティが重要なソフトウェアをビルドする際には、fno-delete-null-pointer-checks を付けておいた方が良さそうです。

    # あるいは、NULL チェックが行われていないポインタ参照全てにデフォルトのチェックコードを挿入するようなオプションがあれば良いのかもしれません。

    また、この最適化に関しては以下のリンク先のように、リカルドさんと同じく、いろいろ思うところのある人もいると思います。

    Qiita投稿(この人の投稿の真ん中あたり(余談の項より上で))
    qiita.com/AoiMoe/items/2554f78dc9c197d22109

Children
No Data