タグ

TipsとCに関するAmaiSaetaのブックマーク (12)

  • C言語で可変長引数をとる関数を、型安全に書く方法

    C言語の可変長引数は、型安全でない(まちがった型の引数を渡してもコンパイルエラーにならない)とされています。これは言語仕様の理解としては正しいのですが、特定の型の引数を任意の個数とる関数に限っては、マクロを使うことで型安全性を確保することができます。 任意の個数のdoubleを引数にとり、その和を返す関数「sumf」を例にあげて説明します。 C言語の可変長引数機構を使ってsumfを定義すると、以下のようになります。 #include <math.h> #include <stdarg.h> #include <stdio.h> static double sumf(double nfirst, ...) { double r = 0, n; va_list args; va_start(args, nfirst); for (n = nfirst; ! isnan(n); n = va_a

  • パスワードとmemset関数 - yohhoyの日記

    C言語プログラム上で高機密性情報(パスワード文字列など)を消去するケースで、memset関数の単純利用では機密情報がメモリ上に残存してしまい、セキュリティ上の脆弱性につながる可能性がある。 void secure_operation() { // パスワード文字列を取得 char passwd[128]; get_password(passwd, sizeof(passwd)); //... // メモリ上の高機密データを消去... memset(passwd, 0, sizeof(passwd)); // ?? } 上記コードではパスワード文字列が格納された変数passwdを使用後にゼロクリアしているが、コンパイル時の最適化によりmemset関数呼び出しが削除される可能性がある。この(プログラマの意図に反する)最適化は、C言語の言語仕様上も許容されるコンパイラの振る舞いとなっている。*1

    パスワードとmemset関数 - yohhoyの日記
  • C++ で環境変数の値を取得する - C++でゲームプログラミング

    そういえば今まで使ったことがないなぁー、ということで調べてみました。 getenv 関数で取得できるみたいです。 [ソース] #include <cstdlib> #include <iostream> int main(){ std::cout << std::getenv("HOME") << std::endl; std::cout << std::getenv("BOOST_ROOT") << std::endl; return 0; } [出力] D:/home D:/cpp/boost/boost_1_52_0 [参照] http://en.cppreference.com/w/cpp/utility/program/getenv

    C++ で環境変数の値を取得する - C++でゲームプログラミング
  • C/C++ 迷信集 | 株式会社きじねこ

    C/C++ を使うプログラマは大勢います。しかし、その多くは OJT を通して言語を学んだのではないでしょうか? 実はそこに大きな落とし穴があります。 コンピュータや工学のことをよく知らない人たちは、時代の先端を歩むプログラマには「迷信」など無関係だと信じて疑わないかも知れません。しかし、迷信や誤解はどんな世界にも常に存在しています。 というわけで、ここでは C/C++ にまつわる迷信、誤解、よくある間違いを採り上げていきます。非常に後ろ向きな企画ですが、暇つぶし気分転換に読んでみてください。もしかすると、ご自身が迷信にとらわれていたことに気付くかもしれません。 追記(2009/03/15) このコーナーでは、C/C++ にまつわる迷信、誤解、よくある間違いを扱っています。決して「迷信」だけではないのですが、タイトルにはすべて[迷信]を付けています。 これは、主に検索エンジンでタイトルを見

    AmaiSaeta
    AmaiSaeta 2012/06/07
    こういう細かいネタは面白い。 | (あれ、ブクマしてなかったか。とうの昔にブクマしてたと思ってたのに。)
  • [迷信] 文字列から整数への変換には atoi | 株式会社きじねこ

    ごく普通のナル終端文字列 "123" を整数値の 123 に変換するとき、あなたはどんな方法を用いるでしょうか? 学校の課題でもないかぎり、1文字ずつ取り出して数字かどうかを判別し、数字なら取り出した文字から '0' を引いた値を元の値に 10 倍したものに加えていく...といった処理をわざわざ書くことはないでしょう(組込み用途のフリースタンディング処理系やライブラリ自体の開発の場合は別ですが)。 上記のような変換を行う場合、atoi 関数を使っていることが少なくないと思います。しかし、当にそれでよいのでしょうか? atoi というのは、元の文字列が正しい書式で、しかもオーバーフローが起きない場合にのみ正しく動作します。そうでない場合、エラー検出を行うことがまったくできません。特に、オーバーフロー発生時には未定義の動作を引き起こします。こんな危険な関数を使ってよいはずがありません。 この

  • Account Suspended

    Account Suspended This Account Has Been Suspended

    AmaiSaeta
    AmaiSaeta 2009/10/17
    C/C++のプログラムの最後には空行が必要。
  • [迷信] とりあえず memset で初期化 | 株式会社きじねこ

    よく見かけるコードですが、上のコードは、必ずしも期待した結果になるとは限りません。なぜなら、double 型やポインタ型は、これらを構成する全ビットが 0 になったとしても、オブジェクトの値が 0 になるかどうかは分からないからです。 確かに、ほとんどの処理系では上記のコードでも問題なく、そして期待通りに動作します。しかし、それはあくまでも"たまたま"動いているに過ぎません。そうした不安定な要素をなくすために行った初期化が、かえってコードを怪しくしてしまっているのです。 単に、集成体の全要素をゼロクリアしたいだけであれば、 とすれば十分です。こう書くと、おそらく次のような反論が返ってくることでしょう。「その方法では、構造体の詰め物がゼロクリアされない」と。しかし、構造体の詰め物にアクセスして、言語仕様上保証される結果を期待することには無理があります。 構造体の詰め物をゼロクリアしたい理由は

    AmaiSaeta
    AmaiSaeta 2009/10/17
    知ってるけど、これやっちゃってる人多いんだよねぇ。
  • Account Suspended

    Account Suspended This Account Has Been Suspended

    AmaiSaeta
    AmaiSaeta 2009/10/17
    知らなかった。へぇー。
  • www.textfile.org - Super Technique 講座〜longjmpと例外

    http://www.nurs.or.jp/~sug/soft/super/longjmp.htm だから、コメントのかたちで /* NOTREACHED */ と書いてやると、コンパイラはこのコメントを認識し、このコメントには制御が移らないことを理解する。 ... ちなみにこのようにコンパイラが認識する特殊なコメントとしては、switch 文の FALLTHROUGH を「判って書いている」ことを伝える /* FALLTHROUGH */ があることはご存知かな? へえ当!? 知らなかった。 via http://d.hatena.ne.jp/higepon/20061114/1163517868 追記: http://www.linux.or.jp/JM/html/GNU_gcc/man1/cpp.1.html -lint コメント中に埋め込まれた、プログラムチェッカ lint のコ

    www.textfile.org - Super Technique 講座〜longjmpと例外
    AmaiSaeta
    AmaiSaeta 2006/11/19
    "/* NOTREACHED */と書いたらそのコメント以下に制御が移らないと表明できるそうな。あと /* FALLTHROUGH */
  • TIPS集

    トップ C言語TIPS集 個別のプログラム([編集][全て選択]→[編集][コピー]、C言語ファイルとして[貼り付け]) C言語/C++言語で2次元配列を動的に確保&解放するプログラム C言語/C++言語で3次元配列を動的に確保&解放するプログラム C言語/C++言語で OleLoadPicture を使って画像を表示する C言語/C++言語でプログラムのメモリ使用量を得る yが偶数のときrが0になり、yが奇数のときにrが定数Aになる式 乱数 Xorshift のSSE2を使った高速化(整数版) 乱数 Xorshift のSSE2を使った高速化(浮動小数点数版) 乱数 Xorshift のSSE2を使わない高速化 Ubuntu 8.04 GTK+ でウィジェットのフォントを変更する例(和文等幅フォント) Ubuntu14.04+Wineでウィンドウの位置が下にずれるのを防ぐ エクセルVBA

  • VC++ / MFC TIPS

    VC++ / MFC 覚書 去年(2000年)あたりから、仕事の上で、どうしても Windows プログラミングを せざるをえなくなってしまった。やり始めてみると、 意外に面白いということが分かったのだが、いかんせん、 Windows プログラミングの頻度はそれほど高くない。 しばらくすると、やり方をすっかり忘れてしまったりする。 そこで、備忘録として、MSDN ライブラリや書籍類から得た情報を、 少しずつまとめていこうと思う。 VC++ 定義済みマクロ (2001-03-13) プリコンパイル済みヘッダー (2001-12-13) VC++ の困った癖 (2001-12-13) ドキュメント型 (2001-03-14) VC++ マクロシンボル MSDN ライブラリでは、「組み込みマクロ」、 「/U、/u (定義済みマクロ シンボルの無効化)」あるいは、 「Using the SDK H

  • C++ とのつきあい方

    いきなりでなんですが、このページは、 C++の入門記事ではありません。 C++ってのもいろいろと不自由なところのある言語でして、それをささやかながら改善しようという試みです。 もくじ C++のソースファイルの拡張子って、いろいろですねえ なんで同じことを2回ずつ書かなくちゃいけないの インライン函数の存在意義 仕様文書を抽出する 仕様文書を抽出する(承前) コンパイラーの検査をかいくぐる コンパイラーの検査をかいくぐる(承前) 実行時のクラス判定 「メンバー」か「メンバ」か、それとも「面罵」か 名前が埋もれていく 開発量マイナス7000行 トレースで動作を探る 贅肉を落としてスリムに Cの構造体をC++のクラスにみたてる 続・実行時のクラス判定 STLを使おう HTMLで書くヘルプ 読み手のための翻訳とは エラー対応は難しい 関連情報 C++のコーディング基準の提案。 すべて賛成できるとい

  • 1