タグ

Cと罠に関するiwwのブックマーク (4)

  • POS03-C. volatile を同期用プリミティブとして使用しない

    POS03-C. volatile を同期用プリミティブとして使用しない volatile 修飾子がマルチスレッドプログラムに必要とされる以下の特性を備えている、というのは誤解である。 アトミック性: 分割不可能な 1 単位の処理としてメモリ操作を実行できる 可視性: あるスレッドで実行した書き込み操作の結果が別のスレッドから見える 逐次性: あるスレッドによる一連のメモリ操作は、他のスレッドでも同じ順番で見えることが保証される 残念ながら、これらのどの特性についても、volatile 修飾子によって実現されるという保証はまったくない。こうした特性は仕様に定義されておらず、各種プラットフォーム上でこうした特性を備えた実装方法が採用されているわけでもない。volatile の実装の詳細については、「DCL17-C. volatile 修飾された変数が間違ってコンパイルされることに注意」を参照

    POS03-C. volatile を同期用プリミティブとして使用しない
  • strncpy関数仕様のナゾ - yohhoyの日記

    C標準ライブラリが提供するstrncpy関数の仕様について。 有限長バッファへ文字列を切り詰めてコピーする処理では、strncpy関数が用いられるケースが多い。strncpy関数の仕様として「コピー元srcの文字列長が指定長BUFSIZE以上のとき、コピー先dest末尾にはNUL終端文字が設定されない」ため、下記★のようにコピー先バッファ末尾へのNUL終端文字代入が必須となる。この'\0'代入を忘れると正しいNUL終端文字列を構成しないケースが発生し、文字列としてdestを扱うタイミングでバッファオーバーランを引き起こす。 #define BUFSIZE 128 char dest[BUFSIZE]; void safe_store(const char* src) { strncpy(dest, src, BUFSIZE); dest[BUFSIZE - 1] = '\0'; // ★

    strncpy関数仕様のナゾ - yohhoyの日記
    iww
    iww 2017/08/09
    strncpyの0終端してくれない罠はほんとにひどい
  • 今更volatile(なポインタ)ではまるなんて - ctrl-shift-moccos

    AVR Studio上で、割り込みベクタで処理されるリングバッファの状態(ポインタの指す先)をループ条件にしたコードを書いたんですよ。以下のようなイメージ。 while (ポインタ同士の比較) { } これが一向にループを抜けてこない。ビルド時に生成される、アセンブリ言語が混ぜ込まれたファイル(*.lss)を見ると、条件判定の前まで戻ってくるループになっていませんでした。最初に条件判定して、するりと抜けられなければ無限ループに飛びます。 (略:このへんにポインタ比較するコードがある) 39a: 14 f1 brlt .+68 ; 0x3e0 (中略) 3e0: ff cf rjmp .-2 ; 0x3e0 :飛び先 volatile unsigned char *hoge のような宣言をしているポインタです。いきなりAVR StudioのCコンパイラを疑ってしまいましたが、同様のコードをC

    今更volatile(なポインタ)ではまるなんて - ctrl-shift-moccos
    iww
    iww 2016/08/18
    『volatile int * hoge1; // ポインタの参照先がvolatile』
  • Mitzyuki's Blog :: C 中級者が意外と陥りやすいワナ

    C 中級者が意外と陥りやすいワナ ある程度プログラミングにも慣れてきて 言語仕様もそこそこ理解した中級者にとって 意外と陥りやすくセキュリティホールの温床になりがちなワナ。 勿論オンラインマニュアルにも仕様として明記してあるのだが、 直感とは反する仕様のなので特に中級者にこれらのミスが多い気がする。 strncpy(3) は ``\0'' 終端してくれない場合がある strcpy(3) はバッファオーバーフローの危険性があるから strncpy(3) を利用する様によく言われるが、 ここにワナが潜んでいる。 strncpy(dst, src, len); とした時に 文字列 src の長さが len バイト未満の場合は dst は ``\0'' で終端される。 終端どころか dst の残り領域は何故か 全て ``\0'' が詰められるという 無駄とも思われる謎仕様。 ところが文字列 src

  • 1