UBSan और TSan
अपरिभाषित व्यवहार और रेस खोजें
UBSan और TSan, CoddyKit पर C++ Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। इस अध्ययन पथ के 3 तक कोई भी पाठ पूरा पढ़ना निःशुल्क है — इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ व्यावहारिक अभ्यास भी उपलब्ध कराता है। यह C++ Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। C++ Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
दो और सैनिटाइज़र
ASan के अलावा, दो सैनिटाइज़र अलग-अलग वर्ग के बग पर ध्यान देते हैं।
- UBSan: अपरिभाषित व्यवहार (अतिप्रवाह, गलत शिफ़्ट, नल डीरेफ़रेंस)
- TSan: बहु-थ्रेड वाले कोड में डेटा रेस
UBSan सक्षम करना
UndefinedBehaviorSanitizer को -fsanitize=undefined से सक्षम किया जाता है। इसे ASan के साथ जोड़ा जा सकता है।
g++ -fsanitize=undefined -g main.cpp -o app
./appसाइन किए गए पूर्णांक का अतिप्रवाह
C++ में साइन किए गए पूर्णांक का अतिप्रवाह अपरिभाषित व्यवहार है। UBSan ठीक उसी पंक्ति पर इसकी रिपोर्ट करता है।
#include <climits>
#include <iostream>
int main() {
int x = INT_MAX;
int y = x + 1; // signed overflow: UB
std::cout << y << "\n";
return 0;
}UBSan द्वारा पकड़ी जाने वाली अन्य UB त्रुटियाँ
UBSan कई सूक्ष्म त्रुटियों को चिह्नित करता है।
- सीमा से बाहर शिफ़्ट (
x << 4032-बिट int के लिए) - नल पॉइंटर डीरेफ़रेंस
- गलत संरेखित पहुँच
- अमान्य enum या bool मान
UBSan को रोकने पर बाध्य करना
डिफ़ॉल्ट रूप से UBSan प्रिंट करके आगे बढ़ता रहता है। पहली त्रुटि पर रुकने के लिए -fno-sanitize-recover=undefined जोड़ें; CI के लिए यह बेहतर है।
g++ -fsanitize=undefined -fno-sanitize-recover=undefined -g main.cpp -o appTSan सक्षम करना
ThreadSanitizer को -fsanitize=thread से सक्षम किया जाता है। यह डेटा रेस का पता लगाता है: जब दो थ्रेड बिना समकालिकता के एक ही मेमोरी तक पहुँचते हैं और उनमें से कम-से-कम एक लिख रहा होता है।
g++ -fsanitize=thread -g main.cpp -o app -pthread
./appडेटा रेस का उदाहरण
दो थ्रेड बिना लॉक के साझा काउंटर को बढ़ाते हैं। TSan रेस वाली पहुँच और उनके स्टैक की रिपोर्ट करता है।
#include <thread>
#include <iostream>
int counter = 0;
void work() { for (int i = 0; i < 1000; ++i) ++counter; }
int main() {
std::thread t1(work), t2(work);
t1.join();
t2.join();
std::cout << counter << "\n";
return 0;
}रेस ठीक करना
साझा डेटा को म्यूटेक्स से सुरक्षित करें या std::atomic का उपयोग करें। ठीक करने के बाद TSan किसी रेस की रिपोर्ट नहीं करता।
#include <thread>
#include <atomic>
#include <iostream>
std::atomic<int> counter{0};
void work() { for (int i = 0; i < 1000; ++i) ++counter; }
int main() {
std::thread t1(work), t2(work);
t1.join();
t2.join();
std::cout << counter << "\n";
return 0;
}TSan और ASan की संगतता
TSan को उसी बिल्ड में ASan के साथ नहीं जोड़ा जा सकता, क्योंकि दोनों में टकराव होता है। अलग-अलग बिल्ड कॉन्फ़िगरेशन का उपयोग करें: एक ASan+UBSan के लिए और दूसरा TSan के लिए।
सैनिटाइज़र बिल्ड मैट्रिक्स
एक व्यावहारिक CI व्यवस्था परीक्षण-सूट को दो सैनिटाइज़र बिल्ड में चलाती है।
- बिल्ड A:
-fsanitize=address,undefined - बिल्ड B:
-fsanitize=thread
इससे मेमोरी, UB और समवर्तीता से जुड़े बग शामिल हो जाते हैं।
लागत और सीमाएँ
TSan प्रोग्राम को 5 से 15 गुना धीमा कर सकता है और बहुत अधिक मेमोरी का उपयोग कर सकता है। सभी सैनिटाइज़र की तरह, यह केवल चलाए गए कोड पथों में बग पकड़ता है, इसलिए अच्छे बहु-थ्रेड वाले परीक्षण महत्वपूर्ण हैं।
त्वरित जाँच
याद करें कि TSan किसका पता लगाता है।
पुनरावलोकन
आपने UBSan और TSan सीखे।
- UBSan (
-fsanitize=undefined) अतिप्रवाह, गलत शिफ़्ट और नल डीरेफ़रेंस ढूँढ़ता है - पहले UB पर रुकने के लिए
-fno-sanitize-recoverका उपयोग करें - TSan (
-fsanitize=thread) डेटा रेस ढूँढ़ता है; उन्हें म्यूटेक्स या atomic से ठीक करें - TSan और ASan के लिए अलग-अलग बिल्ड आवश्यक हैं
एआई शिक्षक के साथ C++ सीखें — निःशुल्क
अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।
- पाठ्यक्रम
- 51
- पाठ
- 203
अक्सर पूछे जाने वाले प्रश्न
क्या “UBSan और TSan” पाठ निःशुल्क है?
हाँ — C++ Academy अध्ययन पथ के 3 तक कोई भी पाठ, जिसमें “UBSan और TSan” भी शामिल है, यहाँ वेब पर पूरा पढ़ना निःशुल्क है। इसके बाद CoddyKit PRO हर पाठ अनलॉक करता है, साथ ही अंतर्निर्मित कोड संपादक और चौबीसों घंटे एआई शिक्षक के साथ इंटरैक्टिव अभ्यास भी उपलब्ध कराता है। C++ Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।
“UBSan और TSan” में मैं क्या सीखूँगा?
अपरिभाषित व्यवहार और रेस खोजें आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ C++ Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।
क्या C++ Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?
पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर C++ Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।
“UBSan और TSan” पाठ पूरा करने में कितना समय लगता है?
CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।
क्या मैं इस C++ Academy पाठ में कोड लिख और चला सकता हूँ?
हाँ। हर C++ Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।