সমস্ত স্ট্রিং-অনুলিপি / সরানোর দৃশ্যে - strcat (), strncat (), strcpy (), strncpy (), ইত্যাদি - কিছু দম্পতি সরল হিউরিস্টিকস প্রয়োগ করা হয় তবে জিনিসগুলি আরও ভাল ( নিরাপদ ) হয়:
1. সর্বদা NUL- পূরণ করুন ডেটা যোগ করার আগে আপনার বাফার (গুলি)।
২. ম্যাক্রো-ধ্রুবক সহ [SIZE + 1] হিসাবে অক্ষর-বাফারগুলি ঘোষণা করুন।
উদাহরণস্বরূপ, প্রদত্ত:
#define BUFSIZE 10
char Buffer[BUFSIZE+1] = { 0x00 };
আমরা কোড ব্যবহার করতে পারি:
memset(Buffer,0x00,sizeof(Buffer));
strncpy(Buffer,BUFSIZE,"12345678901234567890");
তুলনামূলকভাবে নিরাপদে। মেমসেটটি () টি স্ট্রেনকিপি () এর আগে উপস্থিত হওয়া উচিত, যদিও আমরা সংকলন-সময় বাফারটি আরম্ভ করেছিলাম, কারণ আমাদের ফাংশন বলার আগে আমরা অন্যান্য জঞ্জালটিতে কী আবর্জনা রেখেছিলাম তা জানি না। আরআরএনসিপি () অনুলিপি করা তথ্যটিকে "1234567890" এ ছাঁটাই করবে এবং এটি NUL- সমাপ্ত করবে না । তবে, যেহেতু আমরা ইতিমধ্যে বুফসাইজের পরিবর্তে পুরো বাফার - আকার (বাফার) -কে NUL- পূর্ণ করে দিয়েছি - NU- কে যেভাবেই হোক না কেন একটি চূড়ান্ত "আউট-অফ-স্কোপ" হওয়ার নিশ্চয়তা দেওয়া হচ্ছে, যতক্ষণ না আমরা বুশফিজ ব্যবহার করে আমাদের লেখাগুলি সীমাবদ্ধ রাখি না as ধ্রুবক, পরিবর্তে আকারের (বাফার) এর পরিবর্তে।
বাফার এবং বুফসাইজে স্নিপ্রিন্টফ () এর জন্যও সূক্ষ্মভাবে কাজ করে:
memset(Buffer,0x00,sizeof(Buffer));
if(snprintf(Buffer,BUFIZE,"Data: %s","Too much data") > BUFSIZE) {
}
যদিও স্নিপ্রিন্টফ () সুনির্দিষ্টভাবে কেবল বুফিজ -১ টি অক্ষর লিখেছে, তারপরে NUL অনুসরণ করবে, এটি নিরাপদে কাজ করে। সুতরাং আমরা বাফারের শেষে একটি বহির্মুখী NUL বাইট "নষ্ট" করি ... আমরা একটি খুব ছোট স্মৃতি-ব্যয়ের জন্য বাফার-ওভারফ্লো এবং নির্বিঘ্নিত স্ট্রিং শর্ত উভয়কেই প্রতিরোধ করি।
Strcat () এবং strncat () এ আমার কলটি আরও কঠোর-লাইন: সেগুলি ব্যবহার করবেন না। নিরাপদে strcat () ব্যবহার করা কঠিন এবং স্ট্র্যাঙ্ক্যাট () এর এপিআই এতটা স্ব-স্বজ্ঞাত যে এটি সঠিকভাবে ব্যবহার করার জন্য প্রয়োজনীয় প্রচেষ্টাটি কোনও উপকারকে উপেক্ষা করে। আমি নিম্নলিখিত ড্রপ-ইন প্রস্তাব করছি:
#define strncat(target,source,bufsize) snprintf(target,source,"%s%s",target,source)
এটি একটি স্ট্রিকাট () ড্রপ-ইন তৈরি করতে লোভনীয়, তবে একটি ভাল ধারণা নয়:
#define strcat(target,source) snprintf(target,sizeof(target),"%s%s",target,source)
কারণ লক্ষ্যটি পয়েন্টার হতে পারে (সুতরাং আকারে () আমাদের প্রয়োজনীয় তথ্য ফেরত দেয় না)। আপনার কোডে strcat () এর উদাহরণগুলির জন্য আমার কাছে ভাল "সার্বজনীন" সমাধান নেই।
যে সমস্যাটি আমি প্রায়শই "strFunc () - সচেতন" প্রোগ্রামারদের মুখোমুখি হয়ে থাকি তা হ'ল স্ট্র্লেন () ব্যবহার করে বাফার-ওভারফ্লো থেকে রক্ষা করার চেষ্টা। বিষয়বস্তুগুলি NUL- সমাপ্ত হওয়ার গ্যারান্টিযুক্ত থাকলে এটি ঠিক আছে। অন্যথায়, স্ট্রেন () নিজেই বাফার-ওভাররন ত্রুটির কারণ হতে পারে (সাধারণত একটি বিভাগ বিধি লঙ্ঘন বা অন্য কোর-ডাম্প পরিস্থিতির দিকে নিয়ে যায়), আপনি সুরক্ষার চেষ্টা করছেন এমন "সমস্যাযুক্ত" কোড পৌঁছানোর আগে।