আমার এমন একটি ফাংশন দরকার যা (উইনপিআই থেকে সিকিউরজিরো মেমোরির মতো) সর্বদা স্মৃতি শূন্য করে এবং অপ্টিমাইজড হয় না, যদিও সংকলকটি মনে করে যে এর পরে মেমরিটি আর কখনও অ্যাক্সেস হয় না। অস্থির জন্য নিখুঁত প্রার্থীর মতো মনে হচ্ছে। তবে বাস্তবে এটি জিসিসির সাথে কাজ করার জন্য আমার কিছু সমস্যা হচ্ছে। এখানে একটি উদাহরণ ফাংশন:
void volatileZeroMemory(volatile void* ptr, unsigned long long size)
{
volatile unsigned char* bytePtr = (volatile unsigned char*)ptr;
while (size--)
{
*bytePtr++ = 0;
}
}
যথেষ্ট সহজ। আপনি যদি জিসিসি কল করেন তবে জিসিসি আসলে যে কোডটি উত্পন্ন করে তা সংকলক সংস্করণ এবং বাইটের পরিমাণের সাথে আপনি প্রকৃতপক্ষে শূন্য করার চেষ্টা করছেন with https://godbolt.org/g/cMaQm2
- জিসিসি 4.4.7 এবং 4.5.3 কখনই অস্থিরতাকে উপেক্ষা করে না।
- GCC 4.6.4 এবং 4.7.3 অ্যারে মাপের 1, 2 এবং 4 এর জন্য অস্থিরতা উপেক্ষা করে।
- GCC 4.8.1 অবধি 4.9.2 পর্যন্ত অ্যারের আকার 1 এবং 2 এর জন্য অস্থিরতা উপেক্ষা করুন।
- জিিসিসি 5.1 5.3 অবধি অ্যারে মাপের 1, 2, 4, 8 এর জন্য অস্থিরতা উপেক্ষা করুন।
- জিসিসি .1.১ এটিকে যে কোনও অ্যারের আকারের জন্য (ধারাবাহিকতার জন্য বোনাস পয়েন্ট) উপেক্ষা করে।
আমি পরীক্ষিত অন্য কোনও সংকলক (ঝনঝন, আইসিসি, ভিসি) যে কোনও স্টোরের প্রত্যাশিত স্টোর তৈরি করে, যে কোনও সংকলক সংস্করণ এবং কোনও অ্যারের আকার সহ। সুতরাং এই মুহুর্তে আমি ভাবছি, এটি কি একটি (বেশ পুরানো এবং গুরুতর?) জিসিসি সংকলক বাগ, বা মানের মধ্যে অস্থিরতার সংজ্ঞা যা প্রকৃতপক্ষে আচরণের অনুকরণ করে, এটি কোনও বহনযোগ্য লেখার জন্য প্রয়োজনীয়ভাবে অসম্ভব করে তোলে " সিকিউরজিরো মেমরি "ফাংশন?
সম্পাদনা করুন: কিছু আকর্ষণীয় পর্যবেক্ষণ।
#include <cstddef>
#include <cstdint>
#include <cstring>
#include <atomic>
void callMeMaybe(char* buf);
void volatileZeroMemory(volatile void* ptr, std::size_t size)
{
for (auto bytePtr = static_cast<volatile std::uint8_t*>(ptr); size-- > 0; )
{
*bytePtr++ = 0;
}
//std::atomic_thread_fence(std::memory_order_release);
}
std::size_t foo()
{
char arr[8];
callMeMaybe(arr);
volatileZeroMemory(arr, sizeof arr);
return sizeof arr;
}
কলমিবেবে () থেকে সম্ভাব্য লিখনটি .1.১ ব্যতীত সমস্ত জিসিসি সংস্করণ তৈরি করবে the মেমরি বেড়াতে মন্তব্য করা জিসিসি 6.1 স্টোরগুলিও জেনারেট করে তুলবে, যদিও কেবল কলমেমেবে () থেকে সম্ভাব্য লেখার সংমিশ্রণে।
কেউ কেউ ক্যাশে ফ্লাশ করার পরামর্শও দিয়েছেন। মাইক্রোসফ্ট "সিকিউরজিরো মেমোরি" তে ক্যাশে ফ্লাশ করার চেষ্টা করে না । ক্যাশে সম্ভবত যাইহোক বেশ দ্রুত অবৈধ হতে চলেছে, সুতরাং এটি সম্ভবত কোনও বড় বিষয় নয়। এছাড়াও, যদি অন্য কোনও প্রোগ্রাম ডেটা অনুসন্ধানের চেষ্টা করে, বা যদি এটি পৃষ্ঠা ফাইলে লিখিত হতে থাকে তবে এটি সর্বদা শূন্য সংস্করণ হতে পারে।
স্ট্যান্ডেলোন ফাংশনে মেমসেট () ব্যবহার করে জিসিসি 6.1 সম্পর্কে কিছু উদ্বেগ রয়েছে। গডবোল্টের জিসিসি 6.১ সংকলকটি একটি ভাঙ্গা বিল্ড হতে পারে, কারণ জিসিসি .1.১ মনে হচ্ছে কিছু লোকের স্ট্যান্ডেলোন ফাংশনটির জন্য একটি সাধারণ লুপ (গডবোল্টে 5.3 এর মতো) উত্পন্ন হয়। (Zwol এর উত্তর সম্পর্কে মন্তব্য পড়ুন।)
volatile
অন্যথায় প্রমাণিত না হলে আইএমএইচও ব্যবহার করা একটি বাগ is তবে সম্ভবত একটি বাগ।volatile
বিপজ্জনক হিসাবে এতটাই সংজ্ঞায়িত - কেবল এটি ব্যবহার করবেন না।