Visual C++ 2013でWin2000互換モードで実行するとクラッシュする嫌がらせの、実証コード

何の嫌がらせかわからないけど、VC++2013 でコンパイルすると Windows 2000互換モードで実行したときにクラッシュする、最小の実証コードが判明しました!

#include "stdafx.h"
#include <ppl.h>
typedef void* (*Tmemcpy)(void*, const void*, size_t);
static void* mt_copy(void* d, const void* s, size_t size, Tmemcpy memcpyFunc)
{
    size_t blockSize = (size / 2) & ~31; // Make size a multiple of 32 bytes
    const size_t offsets[] = { 0, blockSize, size };

    Concurrency::parallel_for(0, 2, [d, s, &offsets, memcpyFunc](int i)
    {
        memcpyFunc((char*)d + offsets[i], (const char*)s + offsets[i], offsets[i + 1] - offsets[i]);
    });
    return d;
}
int APIENTRY _tWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPTSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    char test1[512];
    mt_copy(test1, "xxx",4, memcpy);
    return (int) 0;
}

並列パターン ライブラリ (PPL)
というのを使うと Windows 7などで Windows 2000互換モードで実行したときにアプリケーションがクラッシュします

|。・ω・) 訳がわからないよ!

Media Player Classic もソース見たら「parallel_for」があったので間違いないです・ω・

Visual Studio 2013 に互換モードに関する欠陥判明!

同じ原因でクラッシュするのが判明しているアプリ

iTunes 12.x
Media Player Classic
東方深秘録
IntelQuickSyncDecoder

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です