◀Unicode版開発トップへ
  • 2079 名前を付けて保存でエラーになることがある
    • 2080 Re: 名前を付けて保存でエラーになることがある
      • 2081 Re2: 名前を付けて保存でエラーになることがある
      • 2082 Re2: 名前を付けて保存でエラーになることがある
        • 2083 Re3: 名前を付けて保存でエラーになることがある
  • [2079] 名前を付けて保存でエラーになることがある syat 2013年12月25日 09:32

    SVN最新ので名前を付けて保存すると落ちる時があります。
    再現条件がはっきりしないのですが、対括弧の強調ありで、改行コード変換をしたときに落ちやすいようです。

    スタックトレース:
    > sakura.exe!CNativeW::GetSizeOfChar(const wchar_t * pData=0xabababab, int nDataLen=4, int nIdx=0) 行 213 + 0x6 バイト
    sakura.exe!CLayoutMgr::LogicToLayout(const CStrictPoint<... > & ptLogic={...}, CStrictPoint<... > * pptLayout=0x0018a1a0, CStrictInteger<1,1,1,0,1> nLineHint={...}) 行 859 + 0x1f バイト
    sakura.exe!CEditView::DrawBracketPair(bool bDraw=false) 行 143
    sakura.exe!CCaret::MoveCursor(CStrictPoint<... > ptWk_CaretPos={...}, const CStrictPoint<... > * pptWk_CaretPosLogic=0x0018ae54, bool bScroll=false, int nCaretMarginRate=20, bool bUnderLineDoNotOFF=false, bool bVertLineDoNotOFF=false) 行 373
    sakura.exe!CCaret::MoveCursorFastMode(const CStrictPoint<... > & ptWk_CaretPosLogic={...}) 行 398 + 0x24 バイト
    sakura.exe!CEditView::ReplaceData_CEditView3(C
    RangeBase<CStrictPoint<... > > sDelRange={...}, std::vector<CLineData,std::allocator<CLineData> > * pcmemCopyOfDeleted=[...](), std::vector<CLineData,std::allocator<CLineData> > * pInsData=[1]({cmemLine={...} nSeq=4 }), bool bRedraw=false, COpeBlk * pcOpeBlk=0x0278fde8, int nDelSeq=4, int * pnInsSeq=0x00000000, bool bFastMode=true, const CRangeBase<CStrictPoint<... > > * psDelRangeLogicFast=0x0018b3f8) 行 949
    sakura.exe!CEditView::ReplaceData_CEditView(co
    nst CRangeBase<CStrictPoint<... > > & sDelRange={...}, const wchar_t * pInsData=0x009ba638, CStrictInteger<0,1,1,1,1> nInsDataLen={...}, bool bRedraw=false, COpeBlk * pcOpeBlk=0x0278fde8, bool bFastMode=true, const CRangeBase<CStrictPoint<... > > * psDelRangeLogicFast=0x0018b3f8) 行 699
    sakura.exe!CEditView::ReplaceData_CEditView2(c
    onst CRangeBase<CStrictPoint<... > > & sDelRange={...}, const wchar_t * pInsData=0x009ba638, CStrictInteger<0,1,1,1,1> nInsDataLen={...}, bool bRedraw=false, COpeBlk * pcOpeBlk=0x0278fde8, bool bFastMode=true) 行 716
    sakura.exe!CDocVisitor::SetAllEol(CEol cEol={...}) 行 51
    sakura.exe!CSaveAgent::OnBeforeSave(const SSaveInfo & sSaveInfo={...}) 行 107
    sakura.exe!CDocSubject::NotifyBeforeSave(const SSaveInfo & a={...}) 行 116 + 0x73 バイト
    • [2080] Re: 名前を付けて保存でエラーになることがある もか 2013年12月25日 17:06

      MoveCursorFastMode -> LogicToLayoutですか。
      解決策は、MoveCursorFastModeでMoveCursorを呼ばず、単純に座標設定だけにするとかでしょうか。
      • [2081] Re2: 名前を付けて保存でエラーになることがある もか 2013年12月25日 21:45

        パッチを登録しました。
        https://sourceforge.net/p/sakura-editor/patchunicode/722/
      • [2082] Re2: 名前を付けて保存でエラーになることがある syat 2013年12月25日 22:04

        ▼ もかさん
        > MoveCursorFastMode -> LogicToLayoutですか。
        > 解決策は、MoveCursorFastModeでMoveCursorを呼ばず、単純に座標設定だけにするとかでしょうか。

        LayoutToLogicExのGetSizeOfChar(落ちてるところ)の手前でGetLineStrを呼んでいますが、その中でpLayout->GetDocLineRef()内のCNativeが壊れているor未初期化でおかしなポインタを返しているようです。
        うーん、わからん。
        • [2083] Re3: 名前を付けて保存でエラーになることがある もか 2013年12月26日 01:55

          改行を改行に置換するような処理の場合、
          CSearchAgent::ReplaceDataの中では、改行がまず削除されて次の行と一度連結して、
          次の行が削除された後、再度行が分割されて、新しくCDocLineが生成されます。
          CLayoutMgr::GetLineStrの
          (*ppcLayoutDes)->m_pCDocLine
          は、fastModeの途中ではCLayoutMgrが更新されないので、
          その削除されたCDocLineを参照したままで、その先で落ちてるんだと思います。