▼金華山の仙人さん:
>このバグって、「俺環」「Win環」で解決保留?(困難?)になってる、下記の「JMicron/E9表示問題」や「CDIセーブ画像問題」に関係しそうでしょうか?
こんばんは。
指摘のバグは、SMART値のスレッショルドテーブルを出力するか否か、本来であれば「編集」-「コピーオプション」-「SMART_READ_THRESHOLD」メニューのチェックON/OFF状態に従うべきところを、「SMART_READ_DATA」チェック状態のON/OFFで判定しているというものです。
そのため「SMART_READ_DATA」がOFFの状態で、「SMART_READ_THRESHOLD」のみONにしても、スレッショルドテーブルはファイル出力等されず、「SMART_READ_DATA」がONの状態なら、「SMART_READ_THRESHOLD」のON/OFFに関係なく、スレッショルドテーブルが出力されるという動きになります。
それ以外の挙動に対しては、関係はないと思います。
ただ、気になったのが、プログラムの中核的なデータである、ATA_SMART_INFO を構造体として宣言していますが、コンストラクタが定義されていません。(Cと違いC++ではclassとstructはメンバのデフォルトの扱いがpublicか否かでほぼ同じ。class同様コンストラクタやデストラクタも定義できます)
そのためATA_SMART_INFO型の変数を使う都度、明示的に初期化しない限り、構造体メンバ変数の初期値が不定になるため、それが廻り廻って再現性のないバグの原因になっている可能性はあります。
ATA_SMART_INFO が構造体のままでも、とりあえずコンストラクタを定義することは可能です。 再現性のないバグを排除する目的なら、全てのメンバを自動で初期化するため、早急にコンストラクタを定義することと、併せて代入演算子(operator =)や、複製を作るコピーコンストラクタを定義した方がよいと思います。
あと気になったのは、APIの呼び出し結果をチェックせずにその後の処理を行っているとかですね。
APIによっては、特定条件下で呼び出した場合、必ず失敗するとかありますから。