T.Ishii's Software Library

HTML5 レトロ風ゲーム館

無料ブログはココログ

« TiExtenderの更新を開始 | トップページ | 本題に入った »

deprecated対応は終了

今はTiExtenderの更新開発フェーズで、まず、Xcodeを最新版に更新して現行版のソースをビルドすると山の様にdeprecated関連のワーニングが出た。その対応は、一応、終わらせたので、ここからが本番だ。

出ていたdeprecated関連のワーニングの多くは、昨日書いた様に、単に、書き方の問題! みたいな話だった。

例えば、従来は、「NSLeftMouseDownMask」と記述していた定数はdeprecatedになったので、「NSEventMaskLeftMouseDown」と、記述しなければならなくなった。

変更作業には手間暇がかかるのに、そんな馬鹿みたいな変更なんてする訳ないだろう! と、思う人もいるかもしれないので、Appleの当該ページへのリンクを以下に載せておく。

NSEventMask | Apple Developer Documentation

と、言う事で、作者的には、Appleのエンジニアが「新しい記述の方が分かりやすいでしょ? どやああああ!」みたいな感じで、ドヤ顔しているのが目に浮かぶ訳なのだが、macOS向けにソフト開発している人なら、既に経験済みだと思われるのだが、上記の様な変更は、多岐にわたる訳だ。

つまり、従来の定数名は短すぎたので、どのグループに関連する定数なのか分からないので、定数名の中にグループ名を入れる事にした!! みたいな変更が行われた感じなので、実際の所、上記の様な変更は一つや二つではない。

なので、次バージョンのTiExtenderでは、機能的に変更がない箇所についても、膨大な変更を行う事になったので、何の問題もなかった機能が、何故か動作しなくなっている可能性も否定できない。

しかしまあ、上記は、ある意味、Appleの方針なので、動作しなくなった機能があったら、これもMacを使っているんだから仕方ないか、と、思ってもらいたい今日この頃だ。

ちなみに、上記以外の変更で多かったのは、sprintfというC言語の関数だ。

sprintfという関数は、巷では、まだまだ現役で、当然、Windows向けソフトでも使っているのだが、何故か、最新のXcodeでは使っているとワーニングが出る様になった。

つまり、Apple的には、巷で普通に使えているsprintfという関数についても、macOS向けソフトでは不推奨にした訳なのだが、それでは、代わりにどんな関数なら使えるのか、というと、Windowsなんかだと、sprintf_sというのがあるのだが、macOSでは、それも使えない感じで、ワーニングが出ずに使えた代替関数は、snprintf、という事になる。

この関数では、出力バッファのサイズを指定しなければならないので、普通に鑑みれば、その指定が必要ないsprintfよりは安全、と、考えるかもしれないのだが、普通、sprintfの様な関数を使う人は、バッファオーバーフローを常に意識している訳だ。

つまり、sprintf用の出力バッファのサイズは、必要なサイズで定義してある訳なのだが、snprintfを使う為には、そのバッファサイズを指定しなければならないので、変更するにあたって、過去に定義して忘れてしまっているバッファサイズを調べて、再度、明示的に入力しなければならなくなる。

なので、そのサイズ入力を間違うと、今まで問題なく出力できていた文字列が、短くなったり、逆に、作者的には面倒なので調べていないのだが、実装によっては、存在しないバッファに対する初期化等が行われ、指定したバッファサイズが実際よりも大きいと、存在しないメモリへの書き込みが発生して動作が不安定になり、たまにクラッシュしたりする! なんて現象が出る可能性もある。

似た様な話として、Javaでプログラムを書いていた時に、Javaにはnewはあってもdeleteはないから、変数のdelete忘れがなくなって安全! なんて事は全くない! という事を書いた事もあった筈だ。

つまり、CやC++の場合、一箇所でdeleteを行えば、確実にメモリ領域を解放できるのだが、Javaの場合、その領域を使っている全ての変数にNULLを代入しない限り、メモリ領域は解放されないので、どちらの方がメモリリークの危険性が高いか、といえば、Javaの方だ! みたいな事も書いた事があった。

と、言う事で、今更、sprintfをsnprintfに書き換えると、上記の様な問題が多発する可能性もあるので、作者的には、やりたくはなかったのだが、作者製ソフトでは、かなりの数のsprintfを使っているので、放置していると、ワーニングが多くなりすぎて、より危険性が高いワーニングを見落としてしまう可能性が高くなる。

なので、sprintfについても、致し方なく、snprintfに変更したので、次バージョンでは、文字列が表示される筈のタイミングでクラッシュする! みたいな不具合が出てきても可笑しくないかもしれない。

上記以外の大物としては、OpenGL関係の関数が全てdeprecatedになっているのだが、Apple的にも、流石にそれは通らないと分かっているのか、OpenGL関係のdeprecatedに対しては、それらだけを警告表示しないオプションを用意してあったので、それを使ってワーニングを消した。

もっとも、上記のオプションを使っても消えないワーニングが幾つか残っているのだが、まあ、数個程度なら、大した問題ではないので、そのままにして、deprecated対応については、作業終了! という事にした今日この頃だ。

« TiExtenderの更新を開始 | トップページ | 本題に入った »

2026年10月
日 月 火 水 木 金 土
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

広告

プライバシーポリシー

  • 当サイトでは、第三者配信による広告(Google Adsense)サービスを利用しています。

    Google を含む第三者配信事業者は、Cookie を使用して、ユーザーのウェブサイトでの閲覧履歴に基づく広告を配信します。 Google 広告 Cookie を使用することにより、Google や Google のパートナーは当サイトや他のサイトへのアクセス情報に基づく広告をユーザーに表示できます。

    収集された情報がGoogleによってどの様に使用されるか、収集される情報をユーザーが管理する方法については、以下のリンクを参照下さい。

    ポリシーと規約 - Google