en

‫ برنامه‌نويسي امن با زبان جاوا – عدم استفاده از عملگرهاي تساوي در زمان مقايسه مقادير انواع اوليه بسته بندي شده - قانون EXP03-J (قسمت دوم)

 


شماره: IRCAR201510282

تاريخ: 30/08/94

سومين موضوعي كه در برنامه نويسي امن با زبان جاوا مورد توجه قرار مي‌گيرد «عبارات» است. در ادامه به چهارمين قانون (EXP03-J) ذيل اين موضوع پرداخته خواهد شد.

 

قانون EXP03-J – عدم استفاده از عملگرهاي تساوي در زمان مقايسه مقادير انواع اوليه بسته بندي شده (قسمت دوم)

در اين قسمت، به نمونه‌هاي ديگري از كدهاي ناسازگار با قانون و راه‌حل‌هاي سازگار آن خواهيم پرداخت.

 

 

يك نمونه ناسازگار با قانون

اين نمونه ناسازگار، از عملگر == براي مقايسه مقادير اشياء‌اي از نوع Integer استفاده مي‌كند. عملگر == ارجاعات شي را به جاي مقادير شي مقايسه مي‌كند.

 

كلاس Integer فقط مقادير عدد صحيح را از -128 تا 127، cache مي‌كند؛ اينكار مي‌تواند منجر به اين شود كه وقتي مقادير يكسان خارج از اين محدوده با استفاده از عملگرهاي تساوي مقايسه مي‌شوند، نابرابر شناخته شوند. به طور مثال، JVM اي كه هيچ مقادير ديگري را در زمان اجراي اين برنامه cache نكرده خروجي زير را ايجاد مي‌كند:

 

 

راه حل سازگار با قانون

اين راه حل سازگاري، براي مقايسه مقادير اشياء از متد equals() به جاي عملگر == استفاده مي‌كند. حال، برنامه در تمام پلتفرم‌ها همانطور كه انتظار مي‌رود (به ترتيب از چپ به راست) مقادير true, false, true, false  را چاپ مي‌كند.

 

 

 

يك نمونه ناسازگار با قانون

مجموعه‌هاي جاوا (java collections) فقط شامل اشياء هستند؛ آنها نمي‌توانند حاوي انواع اوليه باشند. بعلاوه، نوع پارامترهايِ تمام genericهاي جاوا بايد به جاي انواع اوليه، انواع شي باشند. به همين جهت، اعلان ArrayList<int> (كه احتمالاً حاوي مقاديري از نوع int است) در زمان كامپايل به دليل اينكه نوع int يك نوع شي (object type) نيست شكست خواهد خورد. اعلان صحيح به صورت ArrayList<Integer> است كه از كلاس‌هاي لفافه (wrapper classes) و بسته بندي خودكار استفاده مي‌كند.

هدف از اين نمونه ناسازگار، شمارش تعداد ايندكس‌هايي است كه در آرايه‌هاي list1 و list2 مقادير يكساني دارند. به خاطر بياوريد كه كلاس Integer براي memoize كردنِ فقط آن مقادير عدد صحيح كه در محدوده -128 تا 127 است لازم است؛ اين كار ممكن است براي هر مقدار خارج از محدوده، شي غيريكتايي را برگرداند. در نتيجه، موقع مقايسه مقادير عدد صحيح بسته بندي شده خودكار كه خارج از محدوده است، عملگر == ممكن است مقدار false را برگرداند و اين مثال مي‌تواند به صورت فريبنده خروجي 0 را ايجاد كند.

اما اگر JVM اي كه اين كد را اجرا مي‌كند مقادير عدد صحيح بين -32768 تا 32767 را memoize كند، تمام مقادير int در مثال، به طور خودكار به اشياء Integer متناظر بسته بندي مي‌شوند و اين كد همانطور كه انتظار مي‌رود عمل خواهد كرد. استفاده از تساوي ارجاع به جاي تساوي شي، نيازمند اين است كه تمام مقاديري كه در بازه قرار مي‌گيرند توسط آن JVM، memozie شود. در JLS درباره مشخصات اين بازه چيزي گفته نشده است؛ به جاي اين، JLS حداقل بازه‌اي را كه بايد memoize شود مشخص مي‌كند. در نتيجه، پيشگويي موفق رفتار اين كد نيازمند جزييات خاص پياده سازي JVM است.

در بخش بعدي مقاله، به راه حل سازگاري با قانون اين مثال به علاوه نمونه‌هاي ديگري از كدهاي ناسازگار با قانون و راه‌حل‌هاي سازگار آن خواهيم پرداخت.

مطالب مرتبط:

برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها - آشنايي

برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS00-J – قسمت اول

برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS00-J – قسمت دوم

برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS01-J

برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS02-J

برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS03-J

برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS04-J

برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS06-J

برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS07-J

برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS08-J

برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS09-J – قسمت اول

برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون IDS09-J – قسمت دوم

برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها- قوانين IDS10-J و IDS11-J

برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها- قوانين IDS13-J و IDS14-J

برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها- قوانين IDS15-J و IDS16-J

برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها- قانون IDS17-J

برنامه‌نويسي امن با زبان جاوا – قانون اعلان‌ها و مقدار دهي اوليه- قانون DCL00-J – بخش اول

برنامه‌نويسي امن با زبان جاوا – قانون اعلان‌ها و مقدار دهي اوليه- قانون DCL00-J – بخش دوم

برنامه‌نويسي امن با زبان جاوا – عدم استفاده مجدد از شناسه‌هاي عمومي كتابخانه استاندارد جاوا- قانون DCL01-J

برنامه‌نويسي امن با زبان جاوا – عدم تغيير مولفه‌هاي مجموعه در حين استفاده از عبارت for بهبود يافته- قانون DCL02-J

برنامه‌نويسي امن با زبان جاوا – عدم چشم پوشي از مقادير بازگشتي متدها - قانونEXP00-J

برنامه‌نويسي امن با زبان جاوا – عدم استفاده از null در جايي كه يك شي لازم است- قانون EXP01-J

برنامه‌نويسي امن با زبان جاوا – عدم استفاده از متد Object.equals() براي مقايسه دو آرايه- قانون EXP02-J

برنامه‌نويسي امن با زبان جاوا – عدم استفاده از عملگرهاي تساوي در زمان مقايسه مقادير انواع اوليه بسته بندي شده - قانون EXP03-J (قسمت اول)

 

منبع:

https://www.securecoding.cert.org

 


The Wall

No comments
You need to sign in to comment