`স্ট্রিং.সাইনগাইন (স্ট্রিং.ডাটা (), 5)` ভাল-সংজ্ঞায়িত বা ইউবি?


11

একজন সহকর্মী এটি লিখতে চেয়েছিলেন:

std::string_view strip_whitespace(std::string_view sv);

std::string line = "hello  ";
line = strip_whitespace(line);

আমি বলেছিলাম যে প্রত্যাবর্তন string_viewআমাকে অস্বস্তিকর করে তুলেছিল একটি অগ্রাধিকার , এবং তদুপরি, এখানে এলিয়াসিংটি আমার কাছে ইউবির মতো দেখাচ্ছে looked

আমি দৃ with়তার সাথে বলতে পারি যে line = strip_whitespace(line)এই ক্ষেত্রে সমতুল্য line = std::string_view(line.data(), 5)। আমি বিশ্বাস করি যে কল করবে string::operator=(const T&) [with T=string_view], যার সমতুল্য line.assign(const T&) [with T=string_view]সংজ্ঞা দেওয়া হয়েছে line.assign(line.data(), 5), যার সমতুল্য সংজ্ঞা দেওয়া হয়েছে , যা এটি করার জন্য সংজ্ঞায়িত হয়েছে:

Preconditions: [s, s + n) is a valid range.
Effects: Replaces the string controlled by *this with a copy of the range [s, s + n).
Returns: *this.

তবে এই কথাটি বলে না যে যখন এলিয়াসিং হয় তখন কী হয়।

আমি গতকাল সিপ্লেং স্লেকে এই প্রশ্নটি করেছি এবং মিশ্র উত্তর পেয়েছি। এখানে সুপার অনুমোদনমূলক উত্তর এবং / অথবা বাস্তব গ্রন্থাগার বিক্রেতাদের বাস্তবায়নের অভিজ্ঞতাগত বিশ্লেষণ খুঁজছেন।


আমি পরীক্ষার বিষয় লিখেছিলেন জন্য string::assign, vector::assign, deque::assign, list::assign, এবং forward_list::assign

  • Libc ++ এই সমস্ত পরীক্ষার ক্ষেত্রে কাজ করে work
  • Libstdc ++ এগুলি সেগফাল্ট ব্যতীত তাদের সমস্ত কাজ করে forward_list
  • আমি এমএসভিসির লাইব্রেরি সম্পর্কে জানি না।

Libstdc ++ এ সেগফল্ট আমাকে আশা দেয় যে এটি ইউবি; তবে আমি কমপক্ষে সাধারণ ক্ষেত্রে এই কাজটি করার জন্য libc ++ এবং libstdc ++ উভয়ই দুর্দান্ত চেষ্টা করতে দেখছি।


আপনি কি আসনের সাথে পরীক্ষার কেসগুলি সঙ্কলন করেছেন এবং / বা এগুলি ভালগ্রাইন্ডের অধীনে চালিত করেছেন? কোডটি অ্যাক্সেস লঙ্ঘনের কারণ কিনা তা অনুমানের কাজটি গ্রহণ করবে, যদিও এটি সংজ্ঞার পরিবর্তে বাস্তবে কার্যকর হতে পারে।
কনরাড রুডল্ফ

1
"বেসিক_স্ট্রিংয়ের কোনও সদস্য ফাংশন বা অপারেটর যদি ব্যতিক্রম ছুঁড়ে, সেই ফাংশন বা অপারেটরটি বেসিক_স্ট্রিং অবজেক্টে অন্য কোনও প্রভাব ফেলবে না। - এটি বিদ্যমান স্টোরেজটি মুক্ত হওয়ার আগেই স্টোরেজ বরাদ্দকে জোর করে, যাতে কোনও পরিবর্তন ছাড়াই বরাদ্দ ব্যর্থ হলে একটি ব্যতিক্রম ছুঁড়ে যায় *this। তবে বিদ্যমান স্টোরেজটিকে পুনরায় ব্যবহার করা থেকে বিরত করার জন্য আমি কিছুই দেখতে পাচ্ছি না, তবে স্টোরেজটি অনুলিপি করার কারণে কপিরাইট-ওভারিংয়ের শব্দার্থবিরোধী নয় ified
স্যাম বর্ষাভিক


2
উল্লিখিত ক্রম ধারকগুলির জন্য, এটি অবশ্যই ইউবি, কারণ [ট্যাব: ধারক.সেক.রেক] এরassign প্রয়োজনীয়তার পূর্বশর্ত লঙ্ঘনের কারণে ।
আখরোট

উত্তর:


8

আপনার এক নয় এমন কয়েকটি ব্যতিক্রম বাদ দিয়ে assignস্ট্রিং -এ অ-কনস্ট্যান্ট সদস্য ফাংশন (অর্থাত্ ) কল করা অবৈধ [...] পয়েন্টার [...] এর উপাদানগুলিতে। লঙ্ঘন পূর্বশর্ত উপর assignযে [s, s + n)একটি বৈধ ব্যাপ্তির, তাই এই অনির্ধারিত আচরণ।

নোট করুন যে string::operator=(string const&)স্ব-অ্যাসাইনমেন্টকে কোনও অপ-অফ করার জন্য বিশেষত ভাষা রয়েছে।


1
সুতরাং অবৈধকরণের বিন্দুটি ঠিক কী এবং পূর্ব-শর্তটি ধরে রাখতে পয়েন্টটি ঠিক কী? উত্তরটি ধরেই নেওয়া হচ্ছে বলে মনে হচ্ছে যে সদস্য ফাংশন আহ্বানের পরে পূর্বশর্ত অবশ্যই রাখা উচিত।
আখরোট

1
@ ওয়ালআন্ট আমি কোনও ভাষা-আইনজীবী নই (বিশেষত বর্ধিত সি ++ জ্ঞানের অধিকারী কোনও ব্যক্তিই নয়) তবে আমরা যখন আপনার দৃশ্যের বিপরীত হই তখন আমরা একটি প্রশ্ন জিজ্ঞাসা করতে পারি - কার্যকর করার সময় এই পরিসীমা অবৈধ হতে পারে assign? যদি হ্যাঁ, তবে ঠিক যখন অবৈধতা ঘটতে পারে তা চিহ্নিত করার জন্য আমাদের নিয়োগের প্রয়োগের ভিতরে একটি নির্দিষ্ট পয়েন্ট নির্ধারণ করতে হবে এবং আমি বিশ্বাস করি যে এটি সি ++ কিছু করবে না। আমি যদিও ভুল হতে পারে।
ফিউরিয়েশ

2
@ ফিউরিশ আমিও জানি না, তবে দেখুন এলডাব্লুজি ইস্যু ৫২6 , " ত্রুটি নয় " হিসাবে বন্ধ রয়েছে , যা বন্ধের জন্য তার সুপারিশে উল্লেখ করেছে যে ভেক্টরের মধ্যে থাকা অবস্থায় std::vector::insert(iterator pos, const T& value)অবশ্যই কাজ করতে হবে value, কারণ মানটি এটি নির্দিষ্ট করে না সেই রেফারেন্সটি কল দ্বারা অবৈধ করা হতে পারে, যদিও তাকে কাজ করার অনুমতি নেই allowed
আখরোট

1
@walnut " কাজ প্রয়োজন বোধ করা হয় কারণ মান তার জন্য কাজ না করতে অনুমতি দেয় না। " - প্রেম এটা । সুও ... অনুশীলনে কী ঘটে তা জিজ্ঞাসা করা কি মূল্যবান ? বাস্তবায়নের কি এমন পরিস্থিতিতে যুক্তির অনুলিপি তৈরি করা দরকার? আপনি কীভাবে বাস্তবে এটি বাস্তবায়ন করতে পারবেন ..? আমি স্ট্যান্ডার্ড সম্পর্কে অসম্পূর্ণটি করতে কম্পাইলারগুলির প্রয়োজনীয়তার কথা শুনেছি - এটি কি এই ক্ষেত্রে অন্যতম? নির্বিশেষে, মন্তব্যের জন্য আপনাকে ধন্যবাদ!
ফিউরিশ

1
@ ফিউরিশ আসলে আমার আগের (এখন মুছে ফেলা) উদাহরণটি আসলে যা পরীক্ষা করতে চেয়েছিল তা পরীক্ষা করছিল না। এখানে একটি স্থির উদাহরণ দেখানো হচ্ছে যে libc ++ এবং libstdc ++ উভয়ই প্রয়োজন অনুসারে পুনঃনির্ধারণের দিকে এগিয়ে যাওয়ার আগে কপি করে।
আখরোট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.