タグ

ブックマーク / yohhoy.hatenadiary.jp (63)

  • パスワードと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++トランザクショナルメモリ拡張まとめ(N3718) - yohhoyの日記

    プログラミング言語C++のトランザクショナルメモリ(TM; Transactional Memory)拡張に関するドラフト仕様v1.1(→id:yohhoy:20120414)からの差分メモ。 記事の内容は、2013年8月付けの(PDF)N3718 Transactional Memory Support for C++に基づく。 2020-05-22追記:2015年9月に ISO/IEC TS 19841:2015*1が正式発行されたが、ユーザ経験の少なさからC++17仕様への統合は見送られた*2。2019年には処理系の実装負担が少ない「軽量トランザクショナルメモリ」が提案され*3、2020年5月現在もR2066で議論が続いている。 新キーワードと属性 トランザクションを表すキーワード群から、先頭アンダースコア2つ(__)が取り除かれた。さらにキャンセル構文__transaction_

    C++トランザクショナルメモリ拡張まとめ(N3718) - yohhoyの日記
  • OpenMP 2.0とメモリモデルの闇 - yohhoyの日記

    OpenMPが提供するロック獲得/解放omp_set_lock/omp_unset_lock関数と、OpenMPメモリモデルおよびflush指示文に関するメモ。 一見問題がなさそうな下記コードは、OpenMP 2.0以前の仕様に従って厳密に解釈するとプログラマの期待通り動作する保証がない。この仕様上の欠陥はOpenMP 2.5にて修正されている。 #include <assert.h> #include <omp.h> int main() { int count = 0; omp_lock_t lockvar; omp_init_lock(&lockvar); #pragma omp parallel thread_num(10) { //... omp_set_lock(&lockvar); count++; omp_unset_lock(&lockvar); //... } asse

    OpenMP 2.0とメモリモデルの闇 - yohhoyの日記
  • Cスタイルキャスト利用を警告 - yohhoyの日記

    gcc(g++)において、古いCスタイルキャストが使われた場合に警告するオプション。 -Wold-style-cast (C++ and Objective-C++ only) Warn if an old-style (C-style) cast to a non-void type is used within a C++ program. The new-style casts ('dynamic_cast', 'static_cast', 'reinterpret_cast', and 'const_cast') are less vulnerable to unintended effects and much easier to search for. Using the GNU Compiler Collection (GCC) - 3.5 C++ Dialect Optio

    Cスタイルキャスト利用を警告 - yohhoyの日記
  • OpenMPとC++例外の危険な関係 - yohhoyの日記

    OpenMP並列化領域内からC++例外を送出する場合、例外を送出したスレッドと同一スレッド上で例外catchを行う必要がある。すなわちOpenMPスレッドをまたぐC++例外伝搬は行われず、またOpenMP並列化領域の中から外へC++例外が送出されてはならない。このルールに反する場合、実行時クラッシュなどを引き起こす可能性がある。 #pragma omp parallel for for (int i = 0; i < 100; i++) { //... throw i; // NG: parallel領域を超えてC++例外が送出される } #include <memory> #include <new> #pragma omp parallel thread_num(2) { try { //... auto = std::make_shared<T>(/*...*/); // ::new

    OpenMPとC++例外の危険な関係 - yohhoyの日記
  • OpenMP 4.0仕様リリース - yohhoyの日記

    2013年7月 OpenMP 4.0仕様リリース記事 OpenMP 4.0 Specifications Released より抄訳。 OpenMP 4.0 APIの新機能は下記を含みます: アクセラレータのサポート。さまざまな種類の計算デバイスをサポートするため、OpenMP 4.0 API仕様の取り組みにおいては全ての大手ベンダが参画しました。OpenMP APIでは、別の計算デバイスへ移動すべきデータや計算処理コードの範囲を記述する仕組みを提供します。アクセラレータ提案に対するプロトタイプが既にいくつか実装されています。 並列化ループおよび逐次処理をベクトル化するSIMDコンストラクト。今日では主要なプロセッサチップにSIMD演算ユニットが搭載されており、これらへアクセスするポータブルなサポートが不可欠です。OpenMP 4.0 APIでは、SIMD命令によってループ中の複数反復処理

    OpenMP 4.0仕様リリース - yohhoyの日記
  • エルビス演算子(Elvis operator) - yohhoyの日記

    プログラミング言語Javaに対して、Project Coinで提案されていた エルビス演算子(Elvis operator)?:についてメモ*1。Groovy 1.5では同演算子が採用されており、GroovyからJavaへのフィードバック提案となっている。 二項演算子の一種。左オペランドが非nullならば左オペランドの値を、左オペランドがnullならば右オペランドを評価して返す(短絡評価)。機能的にはC#のnull合体演算子(null-coalescing operator)??や、gccでのGNU C拡張 “条件演算子 ?: で第2項を省略” と等価。 FEATURE SUMMARY: The ?: binary "Elvis" operator results in the value of the left-hand-side if it is not null, avoiding

    エルビス演算子(Elvis operator) - yohhoyの日記
    USAGI-WRP
    USAGI-WRP 2013/05/12
    [?:] 近年このオペレーターが採用される言語をちらほら見たけど、名前をエルビス演算子と言ったとは。
  • C++のフェンス is 何 - yohhoyの日記

    C++メモリモデルにおける フェンス(fence) とatomic変数/非atomic変数の関係についてメモ。 まとめ: C++11標準ライブラリが提供するstd::atomic_thread_fence関数*1は、atomic変数アクセスに対してのみ意味をもつ。通常の非atomic変数には直接的な影響を与えない(間接的には影響を与えうる)。 C++の文脈における「フェンス(fence)」は、言語仕様を記述する仮想機械(abstract machine)上の同期プリミティブにすぎない。フェンス同士またはフェンス+atomic変数操作間で「happens before関係」が定義され、直接的にはそれ以上の効果を持たない*2。 上記より、具体的なアーキテクチャ/コンパイラが提供するメモリバリア(memory barrier)*3とは解釈が異なる(ことが一般的なはず)。例:gcc/x86アーキテ

    C++のフェンス is 何 - yohhoyの日記
  • atomic変数間のatomicなコピー - yohhoyの日記

    プログラミング言語C/C++が提供するatomic変数*1とそのコピー操作に関するメモ。 2個のatomic変数間における “atomicなコピー操作” は提供されない。通常は “atomic変数からの読込(load)”+“atomic変数への格納(store)” で代用すればよい。ただし、下記コードのような2つのコピー操作が並行実行された場合、load/store操作のインターリーブが起こりうることに留意。*2 // C++11 #include <atomic> using namespace std; // C11 #include <stdatomic.h> atomic_int x = ATOMIC_VAR_INIT(0); // x = 0 atomic_int y = ATOMIC_VAR_INIT(1); // y = 1 void thread1() { atomic_s

    atomic変数間のatomicなコピー - yohhoyの日記
  • OpenMPのC++言語統合提案 - yohhoyの日記

    C++1y(C++14)に向けた並列プログラミングモデルについてメモ。(PDF)N3530 Leveraging OpenMP infrastructure for language level parallelisationにて、OpenMP実装インフラをC++言語機能として統合する提案がなされている。初期提案のため骨子のみ。 OpenMPは主要な処理系にてサポート済みの機能であり、既にあるこの実装インフラを利用することで、新しい言語機能への対応が容易になる点を推している。従来の#pragma ompを利用したOpenMP指示文の代替として、新しいC++キーワード/関数を幾つか導入する。 OpenMP N3530 parallel for指示文 parallelforキーワード parallel task指示文 paralleltaskキーワード taskwait指示文 taskwait

    OpenMPのC++言語統合提案 - yohhoyの日記
  • 文字列を含む構造体のP/Invoke - yohhoyの日記

    P/Invokeにおいて “メンバ変数として文字列データを含む構造体” をマネージドコード(C#)からアンマネージド(native)関数へ渡す方法メモ。 注意:記事中のC#コードでは例外安全を考慮しておらず、確保したメモリブロックのリークが発生しうる。 メモ:アンマネージド側はマルチバイト文字セット(MBCS)を仮定している。また記事中ではメモリブロック管理にCoTaskMem系メソッドを利用しているが、確保/解放共にマネージドコード(C#)から行うため、正しく対になってさえいればHGlobal系メソッドで代替可能。(マネージド/アンマネージド境界を越えてメモリ確保/解放を行う場合のみ留意する) 前提補足 記事に示すアンマネージド関数であれば、自前のマーシャリング処理を記述する必要は無く、externメソッドのパラメータとして直接 “C#構造体への参照” または “C#クラス” を渡

    文字列を含む構造体のP/Invoke - yohhoyの日記
    USAGI-WRP
    USAGI-WRP 2012/11/18
    [P/Invoke][tips][2012][yohhoy]
  • Javaのconstキーワード - yohhoyの日記

    プログラミング言語Javaでは const をキーワードとして予約しているが、Java SE 7現在でも何ら特定の機能を持たない*1。(恐らく将来に渡って現状のままと予測される) 1999年時点でJDK 1.2.0に対する機能拡張要求 BugID:4211070 Java should support const parameters (like C++) for code maintainence が挙がったが、この要望は 対応意向なし(Won't Fix) としてクローズされた。 It's possible, but I would rather hold the line on creaping featurism. One can design around this (using interfaces, wrappers etc.). There are no current p

    Javaのconstキーワード - yohhoyの日記
  • condition_variable_any+recursive_mutexの注意点 - yohhoyの日記

    C++11標準ライブラリやBoost.Threadライブラリで提供されるcondition_variable_anyとrecursive_mutexの組み合わせについてメモ。 まとめ:condition_variable_anyとrecursive_mutexの組み合わせ利用は避けること。*1 *2 条件変数condition_variable_anyのwaitメンバ関数仕様では、指定されたロックオブジェクトに対して1度だけunlock操作を行う。同関数に対して2回以上lock操作されている(ロックカウント > 1)再帰ロックオブジェクトを指定した場合、該当ロックは解放されない(ロックカウント != 0)まま関数を呼び出したスレッドAはブロック状態に遷移する。この状況では別スレッドBでのロック獲得要求もブロックされるため、プログラム全体としてはデッドロックに陥る。 condition_va

    condition_variable_any+recursive_mutexの注意点 - yohhoyの日記
  • 古のK&R C in 2012 - yohhoyの日記

    2012年現在のC言語コンパイラでもK&R Cソースコードを扱えるか試したのでメモ。*1 結論:gccとMSVCはK&R Cソースコードでもコンパイル可能。 /* K&R style C */ int printf(); int add(); main(argc, argv) int argc; char** argv; { printf("1+2=%d\n", add(1, 2)); return 0; } add(x, y) { return x + y; } gcc系 gcc 4.7.1, 4.6.3にて正常にコンパイル&実行可能なことを確認*2。 $ gcc input.c -fno-builtin$ gcc input.c -fno-builtin -Wall -W -Wextra input.c:5:1: warning: return type defaults to 'in

    古のK&R C in 2012 - yohhoyの日記
  • 浮動小数点数比較マクロ - yohhoyの日記

    C99で追加された浮動小数点数比較マクロについてメモ。同機能はC++11においても提供される。 比較マクロとそれに対応する比較演算の一覧。組込みの比較演算子では浮動小数点数例外(floating-point exception)が発生する可能性があるが、比較マクロでは決して浮動小数点数例外が発生しない。 マクロ 比較演算 isgreater(x,y) x > y isgreaterequal(x,y) x >= y isless(x,y) x < y islessequal(x,y) x <= y islessgreater(x,y) x < y || x > y isunordered(x,y) 少なくとも一方がNaN C99 JTC1/SC22/WG14 N1256 7.12.14より引用(下線部は強調)。 The relational and equality operators s

    浮動小数点数比較マクロ - yohhoyの日記
  • 標準入出力のリダイレクション - yohhoyの日記

    標準入出力ストリーム(cin, cout等)の入出力先を一時的に変更するヘルパクラス。 std::ifstream("input.txt"); ioredirector rd0(std::cin, ifs); std::string s; while (std::getline(std::cin, s)) /* input.txtから1行読込 */; // coutへ出力... 標準出力へ // cerrへ出力... 標準エラー出力へ { std::ofstream ofs("log.txt"); ioredirector rd1(std::cout, ofs), rd2(std::cerr, ofs); // cout/cerrへ出力... "log.txt"へ } // cout/cerrの出力先は元通り 実装: #include <ios> template <class E, cl

    標準入出力のリダイレクション - yohhoyの日記
  • 和積演算(FMA) - yohhoyの日記

    C99標準ライブラリではデジタル信号処理の定番、和積演算(FMA; fused multiply-add)fma関数が追加されている。同関数はC++11標準ライブラリ<cmath>ヘッダでも提供される。 fma関数では和積演算を単一の演算子として浮動小数点数の丸めを行う。すなわち通常の 乗算→丸め→加算 とは異なる結果となる。 double a, x, y, z; a = fma(x, y, z); // x×y+z JTC1/SC22/WG14 N1256 7.12.13.1より引用。 #include <math.h> double fma(double x, double y, double z); float fmaf(float x, float y, float z); long double fmal(long double x, long double y, long do

    和積演算(FMA) - yohhoyの日記
  • nullptrを所有するshared_ptr - yohhoyの日記

    C++11標準ライブラリのstd::shared_ptrでは、ヌルポインタを所有することが可能となっている。 デフォルトコンストラクトされたshared_ptrオブジェクトは空(empty)となる。一方、明示的にnullptrを与えてコンストラクトしたshared_ptrオブジェクトは “ヌルポインタを所有(own)する” *1。この場合はshared_ptrオブジェクト破棄時にカスタムデリータが呼ばれる。 #include <memory> #include <iostream> int main() { auto custom_deleter = [](void* p){ assert(p == nullptr); std::cout << "deleter called" << std::endl; }; std::shared_ptr<void> sp(nullptr, custo

    nullptrを所有するshared_ptr - yohhoyの日記
    USAGI-WRP
    USAGI-WRP 2012/06/23
    [std::shared_ptr][nullptr][tips][2012][yohhoy]
  • mutexのconstexprコンストラクタ - yohhoyの日記

    C++11標準ライブラリのミューテックスクラス群においてstd::mutexのみがconstexprデフォルトコンストラクタをもつ。 N3337 30.4.1.2.1, 30.4.1.2.2, 30.4.1.3.1, 30.4.1.3.2よりコンストラクタ宣言のみ引用。 30.4.1.2.1 Class mutex class mutex { constexpr mutex() noexcept; 30.4.1.2.2 Class recursive_mutex class recursive_mutex { recursive_mutex(); 30.4.1.3.1 Class timed_mutex class timed_mutex { timed_mutex(); 30.4.1.3.2 Class recursive_timed_mutex class recursive_time

    mutexのconstexprコンストラクタ - yohhoyの日記
    USAGI-WRP
    USAGI-WRP 2012/06/23
    [std::mutex][tips][2012][yohhoy]
  • C11/C++11/POSIXスレッドAPI比較 - yohhoyの日記

    C11標準ライブラリ、C++11標準ライブラリ、POSIXスレッドのスレッドライブラリ(Pthreads) API比較。 各スレッドライブラリAPIを、“スレッド”、“CallOnce”、“排他制御(mutex)”、“条件変数(condition variable)”、“TLS(Thread Local Storage)”、その他機能に分類して比較する。表記簡略化のためC++11標準ライブラリは名前空間stdを省略している。 概略: C11はISO/IEC JTC1/SC22/WG14 N1570、C++11はISO/IEC JTC1/SC22/WG21 N3337、POSIXはIEEE Std 1003.1-2008に基づく。 C11標準ライブラリとPOSIXスレッドライブラリのAPI体系はほぼ同一。*1 C++11標準ライブラリはC11標準ライブラリ提供のスレッドサポート機能を包含し、

    C11/C++11/POSIXスレッドAPI比較 - yohhoyの日記