書籍で解説する技術について悩んでおるところでございます。
C++ の作法みたいな本を読むと「定数は const で作ろう」ってのがあるのですが、作っているサンプルコードでは #define を使っています。既存のコードを読むのに役立つかなぁ、という予想なのですが、こういうのをうまい具合に咀嚼してもらうための味付けがわかりません。
自分の座右の銘が温故知新なので、それを無理に押しつけてしまっていないかとか不安になります。メルマガでもそうだったし、良いかな…とは思うのですが。
ゲームプログラムというと汎用性の高い、かつ他人に読まれにくいプログラムを書くべきですよね すると… #defineの方が良いのではないでしょうか? コンパイラによりますが、文字列を適正な形に直してくれますし なにより、#ifdef~#endifが使えるのが良いでしょう。 私はこれを多用して、ソースコードのテストで有効活用しています。(定義されていない場合、コンパイルが通らないところをスルーしたり、等々) また、最近自分のプログラムのセキュリティ確認用として、逆アセンブルツールを使用して、文字列を表示してみたのですが constで暗号化のKeyを保管した場合、悲惨です(泣 簡単に「これかな?」な感じで取り出せてしまいました。 これに対策するために、char *pass = new char[10]; pass[2] = ‘t’; pass[7] = ‘e’; pass[1] = ’s; pass[5] = ‘t’; pass[8] = ‘_’; pass[3] = ‘p’; pass[0] = ‘a’; pass[6] = ’s’; pass[4] = ’s’; pass[9] = ”; printf(pass); delete[] pass; といった形で、逆アセンブルしたときに、ランダムに並んでいるので読みにくい そんな隠し方を考えました ですので… constにも利用価値はあって、Copyright…等はこの形でしっかりプログラムに刻まなければなりません、なので好みなんですよねぇ… どうやったら、隠せるか、隠さないほうがよいか そんなプログラムを#defineとconstから使い分けられるようにする、というのもいいのかもしれません ちなみに、QtだとQStringという型がすばらしく QString Path = QString(NAME) + “.” + “QString(EXT)”; などといった形で、一行で文字をあらわすことが可能です。 なので、ファイルパスなんかはディレクトリ名に分割して隠して、プログラム側で再構築というのもいいかもしれません。 まあ、それをstd::stringでやろうとすると std::string path = NAME; path += “.”; path += EXT; と、面倒なソースコードになりますが… でも、両方とも、逆アセンブルすると NAME “.” EXT でばらばらに表記されてます。 便利です。
> yomogi さん
本文をはるかに超える密度の濃いメントありがとうございます(^^ 毎回楽しみにさせてもらってます。
文字列ってちょっとした工夫で難読化できるんですね。 格納する順番をばらばらにする方法ですと、あえて最適化しない方が良かったりするのでしょうか。
プリプロセッサ自体は活躍の場がなくなりそうにないですよね。 自分だとほとんど縁がないのですが、クロスプラットフォームを実現する際にはソースコードの振り分けが必須です。
あー! string って二項演算できないんですか! ちょっと使いづらいですね(^^; 使おうと思ってたのに…
Comments
ゲームプログラムというと汎用性の高い、かつ他人に読まれにくいプログラムを書くべきですよね
すると…
#defineの方が良いのではないでしょうか?
コンパイラによりますが、文字列を適正な形に直してくれますし
なにより、#ifdef~#endifが使えるのが良いでしょう。
私はこれを多用して、ソースコードのテストで有効活用しています。(定義されていない場合、コンパイルが通らないところをスルーしたり、等々)
また、最近自分のプログラムのセキュリティ確認用として、逆アセンブルツールを使用して、文字列を表示してみたのですが
constで暗号化のKeyを保管した場合、悲惨です(泣
簡単に「これかな?」な感じで取り出せてしまいました。
これに対策するために、char *pass = new char[10];
pass[2] = ‘t’;
pass[7] = ‘e’;
pass[1] = ’s;
pass[5] = ‘t’;
pass[8] = ‘_’;
pass[3] = ‘p’;
pass[0] = ‘a’;
pass[6] = ’s’;
pass[4] = ’s’;
pass[9] = ”;
printf(pass);
delete[] pass;
といった形で、逆アセンブルしたときに、ランダムに並んでいるので読みにくい
そんな隠し方を考えました
ですので…
constにも利用価値はあって、Copyright…等はこの形でしっかりプログラムに刻まなければなりません、なので好みなんですよねぇ…
どうやったら、隠せるか、隠さないほうがよいか
そんなプログラムを#defineとconstから使い分けられるようにする、というのもいいのかもしれません
ちなみに、QtだとQStringという型がすばらしく
QString Path = QString(NAME) + “.” + “QString(EXT)”;
などといった形で、一行で文字をあらわすことが可能です。
なので、ファイルパスなんかはディレクトリ名に分割して隠して、プログラム側で再構築というのもいいかもしれません。
まあ、それをstd::stringでやろうとすると
std::string path = NAME;
path += “.”;
path += EXT;
と、面倒なソースコードになりますが…
でも、両方とも、逆アセンブルすると
NAME
“.”
EXT
でばらばらに表記されてます。
便利です。
> yomogi さん
本文をはるかに超える密度の濃いメントありがとうございます(^^
毎回楽しみにさせてもらってます。
文字列ってちょっとした工夫で難読化できるんですね。
格納する順番をばらばらにする方法ですと、あえて最適化しない方が良かったりするのでしょうか。
プリプロセッサ自体は活躍の場がなくなりそうにないですよね。
自分だとほとんど縁がないのですが、クロスプラットフォームを実現する際にはソースコードの振り分けが必須です。
あー! string って二項演算できないんですか!
ちょっと使いづらいですね(^^;
使おうと思ってたのに…
Contributions