多くのプログラムは、次のような機能を使用して、動的に割り当てられたメモリーに依存しています。
malloc、valloc、alloca (C/C++)
new (C++)
スタック局所変数 (Fortran)
MALLOC、MALLOC64 (Fortran)
メモリー割り当てメソッドが初期値を設定するときに明示的に記述される場合を除いて、動的に割り当てられたメモリーの初期の内容にプログラムが依存しないように注意する必要があります。たとえば、malloc(3C) のマニュアルページにある calloc と malloc の説明を比較してみます。
動的に割り当てられるメモリーを使用するプログラムを単独で実行すると、正常に機能しているように見えることがありますが、パフォーマンスデータの収集を有効にした状態で実行すると、問題が起きることがあります。この場合、浮動小数点演算の予期しない動作、セグメント例外、アプリケーション固有のエラーメッセージなどが発生する可能性があります。
こうした症状は、アプリケーションが単独で実行されたときには、初期化されていないメモリーの値が動作に影響ないものであっても、パフォーマンスデータの収集ツールとの組み合わせで実行されたときに別の値が設定されることによって、発生する場合があります。この場合は、パフォーマンスツールの問題ではありません。動的に割り当てられるメモリーの内容に依存するアプリケーションにはすべて、潜在的なバグがあります。オペレーティングシステムにより動的に割り当てられるメモリーの内容は、ドキュメントに明確に記載されている場合を除いて、どのような値をとる可能性もあります。現在のオペレーティングシステムが動的に割り当てられるメモリーに必ず特定の値を設定するようになっていたとしても、将来オペレーティングシステムのリリースが変わったとき、あるいはプログラムを別のオペレーティングシステムに移植した場合には、こうした潜在的な問題によって、予期しない動作が発生する可能性があります。
次のツールが、こうした潜在的な問題の発見に役立ちます。
コードアナライザ。コンパイラやその他のツールと使用したときに次の項目を表示できる Oracle Solaris Studio ツールです。
コードアナライザは、Oracle Solaris Studio の C または C++ コンパイラでアプリケーションをコンパイルし、–xanalyze=code オプションを指定した場合に実行される静的コード検査の結果を表示できます。
コードアナライザは、discover で –a オプションを使用してバイナリに計測機構を組み込んだあと、その計測機構が組み込まれたバイナリを実行してデータを生成するときに実行される動的メモリーアクセス検査の結果を表示できます。
詳細は、Oracle Solaris Studio 12.4: コードアナライザユーザーズガイド を参照してください。
f95 -xcheck=init_local
詳細は、Oracle Solaris Studio 12.4: Fortran ユーザーズガイド および f95(1) のマニュアルページを参照してください。
lint ユーティリティー
詳細は、Oracle Solaris Studio 12.4: C ユーザーガイド および lint(1) のマニュアルページを参照してください。
dbx 下での実行時チェック
詳細は、Oracle Solaris Studio 12.4: dbx コマンドによるデバッグ マニュアルまたは dbx(1) のマニュアルページを参照してください。