ViVi SPR System build 0025 project:
Mail: Pass:
[ 新規アカウント作成 | パスワード忘れ ]
[ 新規SPR | SPR一覧 | コメント一覧 | statistics | 最新ビルド:3.08.042 | crash履歴 | SPR DB 一覧 | ユーザ一覧 | 使い方 | レポートの書き方 ] [ ViVi Home ]
一覧表示: [ New | Pend | Open | Reopen | Fixed | NPTF | 問題優先順 | 問題vote順 | 優先順 | vote順 | 重要度順 | Ref,ToDo | Help不備 | 対処順 ]
[ 前のSPR | 次のSPR ]
SPR#0013 0 point voted
状態:Pend結果: 優先度:C重要度:B
報告日:10/09/16build:3.07.001OS:Win7by:suigun1000
概要:多数の UTF-8 ファイルを ViVi にドラッグアンドドロップでフリーズ
詳細:■ 操作前状態:

vi モード有効の状態でファイルを開かない状態で待機

■ 具体的操作:

多数の UTF-8 ファイルを ViVi にドラッグアンドドロップする
(後述のソースコードをビルドし、ファイルを 1,000 個、生成すること)

■ 操作後状態:

ViVi がフリーズ

■ 期待する状態:

フリーズせず、ファイルオープン処理を完了し、操作継続可能であること

■ 補足・再現条件:

本件は、多数の HTML ファイルを開こうとして生じた問題です

---

// 試験用ファイル生成用プログラムのソースコード
// UTF-8 ファイルが 1,000 個、生成されます

#pragma warning(disable : 4996)

#include <windows.h>
#include <string>
#include <cstdio>

bool conv_wide2mb(std::string& to, const std::wstring& from);

int _tmain(int argc, _TCHAR* argv[])
{

    std::string to;
    std::wstring from = L"あいうえお";

    (void)conv_wide2mb(to, from);

    for (int i = 0; 1000 > i; ++i){

        char fname[_MAX_PATH];
        sprintf(fname, "test-file_%03d.txt", i);

        FILE* fp = fopen(fname, "w");
        if (fp){

            fprintf(fp, "%s", to.c_str());
            fclose(fp);
            fp = NULL;
        }
    }

    return 0;
}

bool conv_wide2mb(std::string& to, const std::wstring& from)
{

    UINT code_page = CP_UTF8;

    int length = static_cast<int>(from.length());
    int num = ::WideCharToMultiByte(
        code_page,        // コードページ
        0,                // 処理速度とマッピング方法を決定するフラグ
        from.c_str(),    // ワイド文字列のアドレス
        length,            // ワイド文字列の文字数
        NULL,            // 新しい文字列を受け取るバッファのアドレス
        0,                // 新しい文字列を受け取るバッファのサイズ
        NULL,            // マップできない文字の既定値のアドレス
        NULL            // 既定の文字を使ったときにセットするフラグのアドレス
    );
    if (0 == num){

        return false;
    }

    ++num;
    char* p = reinterpret_cast<char*>(calloc(num, sizeof(char)));
    if (NULL == p){

        return false;
    }

    if (0 == ::WideCharToMultiByte(
        code_page,        // コードページ
        0,                // 処理速度とマッピング方法を決定するフラグ
        from.c_str(),    // ワイド文字列のアドレス
        length,            // ワイド文字列の文字数
        p,                // 新しい文字列を受け取るバッファのアドレス
        num,            // 新しい文字列を受け取るバッファのサイズ
        NULL,            // マップできない文字の既定値のアドレス
        NULL            // 既定の文字を使ったときにセットするフラグのアドレス
    )){

        free(p);
        p = NULL;

        return false;
    }

    to = p;

    free(p);
    p = NULL;

    return true;
}
添付画像:
point:0対処日: build: close日: 
#1 つだ (10/09/16 13:13:57)
3.07 は現在内部バッファを改造中ですので、本件のバリデーションはそれが済んでからにします。
[ 新規SPR | SPR一覧 | コメント一覧 | statistics | 最新ビルド:3.08.042 | crash履歴 | SPR DB 一覧 | ユーザ一覧 | 使い方 | レポートの書き方 ] [ ViVi Home ]
一覧表示: [ New | Pend | Open | Reopen | Fixed | NPTF | 問題優先順 | 問題vote順 | 優先順 | vote順 | 重要度順 | Ref,ToDo | Help不備 | 対処順 ]


優先度:重要度(Severity):
 A:最優先で対処  A:通常操作でのクラッシュ・無限ループ
 B:必ず対処  B:特殊な条件、環境でのクラッシュ・無限ループ、非常に重要な動作不良
 C:原則対処  C:機能が動作しないなどの普通の動作不良
 D:簡単であれば対処 D:些細な動作不良で、簡単な代替手段があるもの
 E:NPTF候補 E:ミススペルや誤った文章など、機能そのものの動作に影響を与えない、さほど重要ではないもの
  H:ヘルプの不備
  M:メモリリーク
  P:パフォーマンス問題
  R:リファクタリング
  T:機能強化要望(Enhancement)、ToDo
  X:XT(eXtreme Toolkit)に由来する問題