Menulis Kode Yang Tidak Aman dan fenomena RGB

Dahulu, perjuangan memasuki dunia keteknikinformatikaan dimulai dengan menggunakan bahasa C dan C++. Hal yang masih menjadi kesulitan terbesar saya- bahkan hingga saat ini-  adalah penggunaan pointer ,variabel yang menunjuk ke alamat memori.

Di tingkat 2, saya mulai berdamai dengan kesulitan memrogram, dan .NET pun merasuk dalam kehidupan pemrograman, memberikan banyak kemudahan dan kelas-kelas dasar untuk digunakan. Ya,itulah framework, sekumpulan library yang membentuk kerangka program yang mau kita tulis. Zaman sekarang, jika ingin membuat aplikasi, sebaiknya dimulai dengan eksplorasi tersedia atau tidaknya framework yang mendukung pembuatan aplikasi tersebut. Tidak terbatas hanya .NET, berlaku untuk semua bahasa. Jika sudah terdapat framework, tentu pekerjaan kita terbantu seperti pepatah yg banyak bilang “Don’t reinvent the wheel …” .

Nah, C# sejak setahun terakhir memang menjadi pilihan utama saya dalam pengerjaan tugas ataupun proyek yang kebetulan mampir. C# sangat apik, menyembunyikan keseluruhan manajemen memori dengan hadirnya garbage collector dan reference. Akan tetapi,untuk membuat suatu bahasa cukup powerful terkadang pada sebagian kasus kita butuh untuk mengakses memori secara langsung, itulah yang dimaksud dengan unsafe code- Kode yang tidak aman.

Unsafe Code

Pada dasarnya, sebagaian besar pemrograman pada .NET tidak membutuhkan unsafe code, kecuali untuk hal-hal sebagai berikut :

  • Aplikasi real-time, untuk meningkatkan performa aplikasi
  • Fungsi eksternal, dalam non-.net DLL beberapa fungsi memerlukan pointer sebagai parameter, seperti WinAPI yang ditulis dalam C
  • Debugging, terkadang dibutuhkan inspeksi terhadap isi  memori pada saat debugging.

Di situs ini (http://msdn.microsoft.com/en-us/library/aa288474(VS.71).aspx) ditambahkan bahwa penggunaan unsafe code terutama untuk masalah yang berkenaan dengan pengaksesan struktur pada storage, dan advance COM. Peringatannya adalah, kode yang tidak aman ini tidak dapat dijalankan pada lingkungan yang tidak terpercaya (untrusted environment), misalnya internet.

Berikut keuntungan dan kekurangan unsafe code yang saya terjemahkan dari (http://www.codersource.net/csharp_unsafe_code.html)

Keuntungan Unsafe Code

  • Performansi dan fleksibiltas, pengaksesan data dan manipulasinya dapat dikerjakan dengan lebih efisien
  • Kompatibilitas, terutama dengan native winApi.
  • Pengalamatan memori, tidak mungkin mengetahui alamat memori suatu data tanpa menggunakan pointer

Kekurangannya

  • Sintaks yang cukup kompleks
  • Sulit digunakan, dan mesti hati-hati karena bisa mengakibatkan overwriting, stack oveflow, access memory yang kosong dan overwrite informasi yang dbuuthkan .net runtime.
  • Kode lebih susah di debub, kesalahan kecil pada penggunaan pointer, membuat aplikasi bisa crash secara random, tidak terprediksi dan sulit diproduksi lagi kesalahannya
  • Pengaturan boleh tidaknya unsafe code di jalankan pada mesin yang berbeda

Salah satu penggunaan yang memerlukan unsafe code ketimbang managed code adalah pada field image processing. Sebelum ini, saya sedang mengerjakan tugas yang berkaitan dengan pengaksesan pixel demi pixel menggunakan kelas Bitmap yang disediakan .NET. Memang tergolong cukup mudah, telah tersedia method setPixel dan getPixel, kita hanya perlu menggunakannya. Akan tetapi, untuk kasus ukuran file yang begitu besar, terkadang failed dan waktu eksekusinya cukup lama. Lalu pada beberapa forum ada yang menyarankan penggunaan unsafe code, dimana Bitmap di lock di dalam memori, dan kita mengakses pixel per pixel ke alamat nya langsung di memori. Alhasil, ternyata memang benar, algoritmanya berjalan lebih cepat dan hingga saat ini masih selalu berhasil untuk ukuran file yang besar.

Penggunaan unsafe code ada beberapa cara, misalnya mendeklarasi kan keseluruhan kelas sebagai unsafe

Unsafe class ClassX

{

//Use pointer here

}

Atau pada bagian properti saja misalnya

class ClassX

{

Unsafe int* ptr;

Unsafe void MyMethod()

{

//use pointer here

}

}

Untuk penggunaan unsafe local variabel pada method dapat menggunakan block unsafe seperti

static void Main()
{
//can’t use pointers here

unsafe
{
//you can declare and use pointer here

}

//can’t use pointers here
}

Kemudian hal yang saya temukan lagi adalah perbedaan representasi nilai RGB pada Windows. Secara berurutan windows menyimpan RGB menjadi BGR untuk satu pixel data di memori. Hal ini saya sadari ketika menggambar histogram citra yang mengakibatkan terbaliknya nilai R dan B akibat representasi yang sebelumnya tidak saya ketahui ini.

Share this post: | | | |
Published Thursday, August 27, 2009 11:06 AM by poedja_p

Comments

# re: Menulis Kode Yang Tidak Aman dan fenomena RGB

Thursday, August 27, 2009 12:31 PM by pebbie

kenapa unsafenya nggak cuma dipakai waktu baca atau tulis bitmap aja. manipulasinya kan bisa di managed code. jadi modifier unsafe bisa diisolasi dengan hanya ada di dalem method.

:D latihan pertama citra yah? :D

# re: Menulis Kode Yang Tidak Aman dan fenomena RGB

Thursday, August 27, 2009 1:58 PM by poedja_p

wah ada dewa yang datang

maksudnya manipulasinya di managed code gimana kak ?

sementara ini untuk hitung disribusi masing2 warna masih di dalam unsafe, ntar outputnya udah berupa List of nilai nya aja ...

betul sekali kak peb , baru yang pertama nih ... masi panjang perjalanan bersama prof.Iping

# re: Menulis Kode Yang Tidak Aman dan fenomena RGB

Thursday, August 27, 2009 6:14 PM by pebbie

jadi nilai pixelnya disalin dulu ke array,

yang dimanipulasi array bukan bitmapnya langsung

klo mau ditampilkan baru ditulis balik ke bitmap.

eh, dipakenya kalo udah mulai filtering sih. kalau cuma ngitung histogram mendingan baca langsung dari bitmap pake pointer.

Powered by Community Server (Commercial Edition), by Telligent Systems