بروز Exception در داخل پروژه MFC Library در حالت x64
سلام
یک کد ++C دارم که مربوط به پیاده سازی یک الگوریتم هستش ...
یکسری از نقاط برنامه خطاهایی مثل Divide by zero و Index out of band داره و ممکنه باعث تولید Exception بشه ...
تا وقتی که این کد بصورت یه برنامه Console در VS اجرا میشه مشکلی نیست و از روی خطاها عبور می کنه و الگوریتم رو هرچند غلط به پایان می رسونه. این ممکنه به خاطر غیرفعال بودن Exception ها باشه!
وقتی همین کد برای استفاده در زبانهای دیگر با استفاده از یک پروژه MFC Library به یک dll.* تبدیل میشه؛ باز مشکلی نیست و حداقل تو Delphi و Java الگوریتم بدون خطا اجرا می شه ...
اما تو نسخه 64 بیتی dll.* موضوع فرق می کنه و همون نقطه های Exception باعث بروز خطا و ناتمام ماندن برنامه میشه!!!
جالبه که در حالت اجرای کنسولی (بدون dll.*) در حالت 64 بیتی Exception تولید نمیشه!
فکر کنم باید یه جوری Exception Mask در داخل dll.* انجام بشه، چون در حالت Console ای فعال/غیر فعال کردن Exception ها داخل Visual Studio انجام میشه، اما تو حالت فراخوانی تو محیطهای دیگه، خبری از VS نیست.
مشابه این قضیه رو یک باره دیگه تو ساخت dll.* تو Delphi دیده بودم که مشکل با فراخوانی تابع SetExcepionMask و Mask کردن چند تا Exception برطرف شده بود. البته تو اون قضیه نسخه 64 بیتی بدون مشکل اجرا می شد اما نسخه so.* تهیه شده برای استفاده در لینوکس، Exception هایی ایجاد می کرد که با Mask کردن اونها در سمت so.* مشکل برطرف شد.
ضمنا ممکنه بگید که خوب خطاهایی که باعث Exception میشه رو اصلاح کنم! اما حجم کد خیلی زیاده و نیاز به بررسی زیادی داره و در واقع فعلا می خوام نسخه 64 بیتی مثل نسخه 32 بیتی حداقل بدون خطا اجرا بشه.
با تشکر
نقل قول: بروز Exception در داخل پروژه MFC Library در حالت x64
نقل قول:
یکسری از نقاط برنامه خطاهایی مثل Divide by zero و Index out of band داره و ممکنه باعث تولید Exception بشه ...
نکته اول
خطای Divide by zero از نوع خطاهای زمان کامپایل هست، تقریبا همه کامپایلرهای معتبر در زمان کامپایل این خطا را میگیرند، در زمان اجرا هم اگر یکی از مقادیر عملیات تقسیم 0 شده باشه بازهم یک
Unhand-led exception ساطع میشه حتی اگر درون یک بلاک try-catch عملیات تقسیم انجام شده باشه که این خطا هم مستقیما به کد اسمبلی تولید شده مربوط هست یعنی دستور IDIV OR DIV البته به غیر از دستورات سری SSE نمی توان یکی از عملوندهای دستورات فوق را صفر قرار داد به همین علت خطای تقسیم بر صفر عملا غیر قابل دور زدن می باشد
نکته دوم
خطای index out of bound هم که از اون دسته خطاهای امنیتی هست که در زمان کامپایل فقط یک هشدار ساطع میشود البته نه در همه کامپایلرها ولی در زمان اجرا هم بسته به شرایط overlap شدن آفست ها میتواند باعث کرش برنامه شود ولی در خیلی از مواقع هم برنامه کرش نخواهد کرد ولی قطعا رفتار تعریف نشده برای برنامه رخ خواهد داد.
نقل قول:
تا وقتی که این کد بصورت یه برنامه Console در VS اجرا میشه مشکلی نیست و از روی خطاها عبور می کنه و الگوریتم رو هرچند غلط به پایان می رسونه. این ممکنه به خاطر غیرفعال بودن Exception ها باشه!
از چه نسخه ای از کامپایلر و ویژوال استودیو استفاده میکنید؟
چون در صورت رخداد خطای تقسیم بر 0 در هر نوع باینری فایلی چه DLL , چه EXE برنامه کرش خواهد کرد.
نقل قول:
ضمنا ممکنه بگید که خوب خطاهایی که باعث Exception میشه رو اصلاح کنم! اما حجم کد خیلی زیاده و نیاز به بررسی زیادی داره و در واقع فعلا می خوام نسخه 64 بیتی مثل نسخه 32 بیتی حداقل بدون خطا اجرا بشه.
برای خطا تقسیم بر 0 راههای زیادی وجود داره ولی ساده ترین چک کردن مقادیر متغیرها قبل از عملیات تقسیم هست
برای خطا اندیس خارج از محدوده هم باید با استفاده از شرطهای کنترلی کنترل کنید یعنی قبل از هربار فراخوانی آفست آرایه ابتدا کنترل کنید که اندیس مورد اشاره تون بزرگتر از طول آرایه نباشه البته اگر امکان داشت براتون از ساختمان داده های سبک مثل std::vector , std::array استفاده کنید
در صورتی که مایل بودید میتونید تکه کدتون را همین جا قرار بدید
نقل قول: بروز Exception در داخل پروژه MFC Library در حالت x64
برا جلوگیری از خطای تقسیم بر صفر باید توسط if کنترل کنید که اصلا این Exception تولید نشه.
خطای Index هم یعنی در پیاده سازی(کد) الگوریتم bug وجود داره و باید برطرف شه.