Menghindari Kesalahan Titik Mengambang di Lingkungan Build Kustom

Informasi ini ditujukan untuk pengembang dan teknisi build yang mengkompilasi driver mode kernel untuk Windows. Di Microsoft Visual Studio Professional 2012, arsitektur default untuk kompilator Visual C++ (VC++) berubah dari IA32 ke set instruksi Streaming SIMD Extensions 2 (SSE2). Akibat perubahan ini, instruksi floating-point (FP) SSE2 yang disuntikkan ke dalam biner pada waktu kompilasi dapat menghasilkan kesalahan floating-point jika tidak dipertimbangkan. Masalah ini dapat ditemui oleh mereka yang menggunakan pengkompilasi Microsoft VC++, atau lingkungan build kustom untuk mengembangkan driver Windows. Namun, masalah ini tidak memengaruhi pengembang yang menggunakan lingkungan pengembangan Microsoft Visual Studio, atau yang menggunakan utilitas MSbuild untuk membangun driver dengan toolset yang tidak dimodifikasi.

Kesalahan titik mengambang dapat menyebabkan kerusakan data atau crash komputer

Jika Anda mengkompilasi driver tanpa menggunakan WDK, Visual Studio, dan toolset platform yang direkomendasikan untuk driver Windows (WindowsKernelModeDriver8.0), driver mungkin tidak mengelola operasi floating point dengan benar, bahkan jika driver mengkompilasi tanpa kesalahan.

Pengkompilasi Visual Studio Professional 2012 VC++ memancarkan kode yang menggunakan set instruksi SSE2 dengan mengatur opsi pengkompilasi /arch:sse2 . Dimulai dengan Visual Studio Professional 2012, ini adalah opsi default untuk pembuatan kode kompilator x86 VC++. Secara khusus, nilai default berubah dari /arch:ia32 menjadi /arch:sse2.

Untuk aplikasi, perubahan ini menghasilkan kode yang berkinerja lebih baik dan menggunakan lebih sedikit waktu prosesor selama eksekusi. Namun, untuk driver mode kernel, perubahan ini tidak akan mengelola status floating point (FP) dengan benar. Hal ini disebabkan oleh pengompilasi VC++ yang memperkenalkan urutan instruksi FP di tempat-tempat di mana konteks belum disimpan. Setiap sistem floating-point biner hanya dapat mewakili jumlah nilai floating-point terbatas dalam bentuk yang tepat, dengan sisanya adalah perkiraan. Status kontrol floating-point, seperti, mode pembulatan atau presisi, adalah hal yang membuat operasi FP tetap sinkron satu sama lain. Ketika status tidak terdefinisi, ini menyebabkan kesalahan perhitungan FP. Kesalahan perhitungan ini sulit dideteksi karena dalam kebanyakan kasus kerusakan status aplikasi adalah satu-satunya tanda masalah ini. Kerusakan ini dapat memanifestasikan dirinya dalam banyak cara, mulai dari crash acak hingga kerusakan data.

Solusi

Untuk menghindari masalah ini dengan perhitungan floating-point, tambahkan bendera /kernel pada baris perintah compiler dan linker C++ untuk mencegah pembuatan instruksi SSE2. Bendera /kernel mengubah nilai default /arch:sse2 kembali ke /arch:ia32.

Selain itu, jika Anda membuat driver menggunakan WDK dan lingkungan pengembangan Visual Studio Professional 2012, atau menggunakan MSBuild, di jendela prompt Perintah Visual Studio, toolset platform yang disediakan Microsoft (WindowsKernelModeDriver8.0) mengatur bendera /kernel . Akibatnya, kesalahan pembuatan floating-point dihindari.

msbuild myProject.vcxproj /p:PlatformToolset=WindowsKernelModeDriver8.0

Rekomendasi

Berikut adalah solusi yang direkomendasikan berdasarkan jenis lingkungan pengembangan yang Anda gunakan:

  • Set alat Microsoft (MSBuild) - Tidak diperlukan pekerjaan. Gunakan WindowsKernelModeDriver8.0 sebagai toolset platform dan /kernel secara otomatis ditambahkan di mana sesuai.
  • Microsoft VC++ Compiler - Tambahkan bendera /kernel untuk mencegah compiler memancarkan SSE2.
  • Custom Tooling/Non-Microsoft Compiler - Anda harus memperhitungkan instruksi perakitan yang digunakan dalam biner yang dihasilkan secara manual.