en

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


شماره: IRCAR201511280

تاريخ: 25/08/94

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

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

بدليل اينكه عملگرهاي == و != به جاي مقادير شي، ارجاعات شي را مقايسه مي‌كنند، مقادير انواعِ اوليۀ بسته بندي شده مستقيماً نمي‌توانند با استفاده از اين عملگرها مقايسه شوند. برنامه نويسان مي‌توانند اين رفتار را تعجب آور بدانند چراكه بسته بندي خودكار، مقادير برخي متغيرهاي اوليه را، memoize يا cache مي‌كند . در نتيجه، مقايسه‌هاي ارجاع و مقايسه‌هاي مقدار نتايج يكساني را براي زيرمجموعه مقادير memoize شده‌ توليد مي‌كنند.

 

بسته بندي خودكار، به طور خودكار مقدار نوع اوليه را با شي لفافۀ (wrapper) متناظر بسته بندي (wrap) مي‌كند. در مشخصه شماره 5.1.7 (تبديل بسته بندي(Boxing Conversion)) از مشخصات زبان جاوا (JLS)، بيان شده كه كدام مقادير اوليه در هنگام بسته بندي خودكار، memoize شده‌اند:

اگر مقدار p كه بسته بندي شده است true، false، byte، char در بازه \u0000 تا \u007f يا عدد int يا short ميان -128 و 127 باشد، r1 و r2، مي‌توانند هر كدام از دو مورد تبديل‌هاي بسته بندي p را به خود اختصاص دهند. اين مورد، حالتي است كه r1== r2 است.


استفاده از عملگرهاي == و != براي مقايسه مقادير انواع اوليه بسته بندي شده كه به صورت كامل memoize شده‌اند مجاز است.

 

استفاده از عملگرهاي == و != براي مقايسه مقادير انواع اوليه بسته بندي شده كه به صورت كامل memoize نشده‌اند فقط زماني مجاز است كه بازه مقادير نمايش داده شده حتماً درون بازه‌هاي مشخص شده توسط JLS باشد تا به صورت كامل memoize شود.

استفاده از عملگرهاي == و != براي مقايسه مقادير انواع اوليه بسته بندي شده در ديگر وضعيت‌ها مجاز نيست.

به خاطر داشته باشيد كه پياده سازي‌هاي ماشين مجازي جاوا (JVM) مجازند (البته نيازي نيست) كه مقادير اضافي را memoize كنند:

پياده سازي‌هاي با محدوديت حافظه كمتر، مي‌توانند، به طور مثال، تمام كاراكترها و shortها را بعلاوۀ اعداد صحيح و longها در محدوده -32K تا +32K، cache كنند (§5.1.7).

كدي كه وابسته به رفتار تعريف شدۀ پياده سازي است غيرقابل حمل (nonportable) است. وابستگي به بازه‌هاي خاص پياده سازي براي مقادير memoize شده زماني مجاز است كه تمام پياده سازي‌ها از اين بازه‌هاي بزرگتر پشتيباني كنند.

 

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

اين نمونه ناسازگار، مقايسه كننده‌اي را با استفاده از متد compare() تعريف مي‌كند. متد compare() دو نوع اوليۀ بسته بندي شده را به عنوان ورودي دريافت مي‌كند. از عملگر == براي مقايسه دو نوع اوليه بسته بندي شده استفاده مي‌شود. در اين حالت، اين عملگر به جاي مقايسه مقاديري كه در آن اشياء نگهداري مي‌شود ارجاعات به اشياء لفافه (wrapper objects) را مقايسه مي‌كند.


به خاطر داشته باشيد كه در اين مثال، بدليل اينكه اعداد صحيح اوليه (primitive integers) در محل فراخواني به طور خودكار بسته بندي شده‌اند، اين نوع داده هم بوسيله اين اعلان پذيرفته مي‌شوند.

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

اين راه حل سازگاري، از عملگرهاي مقايسه‌اي <، <، <= يا >= استفاده مي‌كند چراكه اين عملگرها منجر به خارج شدن خودكارِ مقادير اوليه از بسته بندي مي‌شود. عملگرهاي == و != نبايد براي مقايسه انواع اوليه بسته بندي شده استفاده شوند.


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


 

مطالب مرتبط:

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

برنامه‌نويسي امن با زبان جاوا – قوانين اعتبارسنجي ورودي و پاكسازي داده‌ها – قانون 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

 

منبع:

https://www.securecoding.cert.org


The Wall

No comments
You need to sign in to comment