সমস্যাটি এখানে:
strncpy(buffer,str,strlen(str));
^^^^^^^^^^^
যদি স্ট্রিংটি লক্ষ্য বাফারের দৈর্ঘ্যের চেয়ে বেশি হয় তবে স্ট্রান্সপিপি এখনও এটিকে অনুলিপি করবে। আপনি বাফারের আকারের পরিবর্তে কপির জন্য স্ট্রিংয়ের অক্ষরের সংখ্যাটি বেজ করছেন। এটি করার সঠিক উপায়টি নিম্নরূপ:
strncpy(buffer,str, sizeof(buff) - 1);
buffer[sizeof(buff) - 1] = '\0';
এটি যা করে তা হল নাল টার্মিনেটিং চরিত্রের জন্য বাফার বিয়োগের প্রকৃত আকারে অনুলিপি করা তথ্যের পরিমাণ সীমাবদ্ধ। তারপরে আমরা বাফারে সর্বশেষ বাইটটি একটি যুক্ত সুরক্ষা হিসাবে নাল চরিত্রটিতে সেট করি। এর কারণ হ'ল স্ট্রান্সকিপি টার্মিনেটিং নাল সহ এন বাইট পর্যন্ত অনুলিপি করবে, যদি স্ট্রেন (স্ট্র) <লেন - ১ না থাকে তবে নালটি অনুলিপি করা হয়নি এবং আপনার ক্র্যাশ পরিস্থিতি রয়েছে কারণ এখন আপনার বাফারটিতে একটি বাধা নেই has স্ট্রিং।
আশাকরি এটা সাহায্য করবে.
সম্পাদনা: আরও পরীক্ষা এবং অন্যের কাছ থেকে ইনপুট দেওয়ার পরে, ফাংশনটির জন্য একটি সম্ভাব্য কোডিং নিম্নলিখিত:
int func (char *str)
{
char buffer[100];
unsigned short size = sizeof(buffer);
unsigned short len = strlen(str);
if (len > size - 1) return(-1);
memcpy(buffer, str, len + 1);
buffer[size - 1] = '\0';
return(0);
}
যেহেতু আমরা ইতিমধ্যে স্ট্রিংয়ের দৈর্ঘ্য জানি, তাই স্ট্রিং দ্বারা বাফারে রেফারেন্সযুক্ত অবস্থান থেকে স্ট্রিংটি অনুলিপি করতে আমরা ম্যাকপিটি ব্যবহার করতে পারি। নোট করুন যে স্ট্র্লেন (3) (একটি ফ্রিবিএসডি 9.3 সিস্টেমের জন্য) এর জন্য ম্যানুয়াল পৃষ্ঠা অনুসারে, নিম্নলিখিতটি বর্ণিত হয়েছে:
The strlen() function returns the number of characters that precede the
terminating NUL character. The strnlen() function returns either the
same result as strlen() or maxlen, whichever is smaller.
যা আমি ব্যাখ্যা করছি যে স্ট্রিংয়ের দৈর্ঘ্যে নাল অন্তর্ভুক্ত নয়। এই কারণেই নালটি অন্তর্ভুক্ত করার জন্য আমি লেন + 1 বাইটগুলি অনুলিপি করেছি এবং পরীক্ষাটি চেক করে পরীক্ষা করে পরীক্ষা করে নিন <দৈর্ঘ্যের বাফার - 2 বিয়োগ বিধি কারণ বাফার 0 অবস্থান থেকে শুরু হয়, এবং অন্য একটি বিয়োগের জায়গা আছে কিনা তা নিশ্চিত করার জন্য নাল জন্য।
সম্পাদনা: দেখা যাচ্ছে, কোনওটির আকার 1 দিয়ে শুরু হয় যখন অ্যাক্সেস 0 দিয়ে শুরু হয়, সুতরাং -2 এর আগে ভুল ছিল কারণ এটি কোনও কিছুর জন্য> 98 বাইটের জন্য ত্রুটি ফিরে আসবে তবে এটি> 99 বাইট হওয়া উচিত।
সম্পাদনা: স্বাক্ষরযুক্ত স্বল্প সংক্ষিপ্ত সম্পর্কে উত্তরটি যথাযথভাবে সঠিক কারণ প্রতিনিধিত্ব করা যায় এমন সর্বোচ্চ দৈর্ঘ্য 65৫,৫৩৫ অক্ষর হ'ল, এটি সত্যিকার অর্থে কিছু যায় আসে না কারণ যদি স্ট্রিংটি এর চেয়ে দীর্ঘ হয় তবে মানটি প্রায় মোড়াবে। এটি 75,231 (যা 0x000125DF) নেওয়া এবং শীর্ষ 16 বিটগুলি আপনাকে 9695 (0x000025DF) দিয়ে মাস্ক করার মতো। দৈর্ঘ্যের চেকটি অনুলিপিটির অনুমতি দেবে বলে আমি কেবল এটিই প্রথম 100 টি চরটি 65,535 এর আগে দেখতে পাচ্ছি, তবে এটি কেবলমাত্র স্ট্রিংয়ের প্রথম 100 টি অক্ষর পর্যন্ত অনুলিপি করে স্ট্রিংটি বাতিল করে দেবে । এমনকি মোড়ক ইস্যু নিয়েও, বাফারটি এখনও উপচে পড়া হবে না।
স্ট্রিংয়ের বিষয়বস্তু এবং আপনি এটি কী ব্যবহার করছেন তার উপর নির্ভর করে এটি নিজেই সুরক্ষা ঝুঁকি তৈরি করতে পারে বা নাও পারে। যদি এটি কেবল সরল পাঠ্য যা মানুষের পাঠযোগ্য, তবে সাধারণত কোনও সমস্যা নেই। আপনি কেবল একটি কাটা স্ট্রিং পাবেন। যাইহোক, এটি URL বা এমনকি কোনও এসকিউএল কমান্ড ক্রমের মতো কিছু হলে আপনার সমস্যা হতে পারে you