मेरे लिनक्स विकास परियोजना के लिए क्लेंग बनाम जीसीसी


175

मैं कॉलेज में हूँ, और एक ऐसी परियोजना के लिए जिसका उपयोग हम कर रहे हैं। हमने GCC और Clang की खोज की है, और Clang GCC के लिए अधिक उपयोगकर्ता के अनुकूल प्रतीत होता है। नतीजतन, मैं सोच रहा हूं कि लिनक्स के लिए सी और सी ++ में विकसित करने के लिए, जीसीसी के विपरीत, क्लैंग का उपयोग करने के क्या फायदे या नुकसान हैं?

मेरे मामले में इसका उपयोग छात्र स्तर के कार्यक्रमों के लिए किया जाएगा, न कि उत्पादन के लिए।

यदि मैं क्लैंग का उपयोग करता हूं, तो क्या मुझे जीडीबी के साथ डिबग करना चाहिए और जीएनयू मेक का उपयोग करना चाहिए, या किसी अन्य डीबगर का उपयोग करना और उपयोगिता बनाना चाहिए?


7
जहाँ तक मैं बता सकता हूँ, क्लैंग अभी भी "परिपक्व" से बहुत दूर है, विशेष रूप से मानक पुस्तकालय समर्थन के विषय में। फिर भी, इसमें शानदार त्रुटि संदेश हैं, इसलिए आप हमेशा क्लैंग पर कोड की कोशिश करके एक रहस्यमय संकलक त्रुटि का सामना कर सकते हैं। Clang C ++ को C में भी संकलित कर सकता है, मुझे विश्वास है।
केरेक एसबी

3
@KerrekSB: क्लैंग से "मानक पुस्तकालय समर्थन" का कौन सा तत्व गायब है?
स्टीफन कैनन

2
@StephenCanon: पिछली बार जब मैंने इसे आज़माया था, मुझे libstdc ++ (जो कि जहाँ तक मैं समझता हूँ क्लैंग का हिस्सा नहीं है) का उपयोग करना था। और बस दूसरे दिन हमारे पास यह मुद्दा था । वैसे भी, मैं ब्लीडिंग एज का पालन नहीं कर रहा हूं, इसलिए मेरा विचार पूरी तरह से अप्रचलित हो सकता है।
केरेक एसबी

4
@KerrekSB: आपके लिंक के बारे में, क्लैंग शुद्ध विंडोज पर काम नहीं करता है। यह हालांकि मिनगॉव में काम करता है। मानक पुस्तकालय के संबंध में, इस समय क्लैंग का कोई वास्तविक मानक पुस्तकालय हिस्सा नहीं है। Clang को OSX पर libc ++ के साथ बांधा गया है, हालांकि libc ++ को अन्य वातावरणों में पूरी तरह से पोर्ट नहीं किया गया है, इसलिए उन Clang पर एक अन्य मानक लाइब्रेरी कार्यान्वयन की आवश्यकता है। लिनक्स पर, libstdc ++ काम करता है।
मैथ्यू एम।

1
@KerrekSB: C ++ 98 100% समर्थित है। C ++ 11 ज्यादातर समर्थित है (पिछले मैंने जाँच की, <atomic>समर्थित नहीं है, शायद कुछ अन्य छोटी चीजें गायब हैं ... मैं इसका उपयोग नहीं कर सकता, इसलिए मैं पूरी तरह से इसके साथ गति करने के लिए नहीं हूं)।
जेम्स मैकनेलिस

जवाबों:


122

संपादित करें:

जीसीसी लोग वास्तव में जीसीसी (आह प्रतियोगिता) में निदान के अनुभव में सुधार करते हैं। वे इसे प्रदर्शित करने के लिए एक विकि पृष्ठ बनाया यहाँ । gcc 4.8 में अब काफी अच्छे डायग्नोस्टिक्स हैं (gcc 4.9x जोड़ा गया कलर सपोर्ट)। क्लैंग अभी भी अग्रणी है, लेकिन अंतर बंद हो रहा है।


मूल:

छात्रों के लिए, मैं बिना शर्त क्लैंग की सिफारिश करूंगा।

Gcc और Clang के बीच उत्पन्न कोड के संदर्भ में प्रदर्शन अब अस्पष्ट है (हालांकि मुझे लगता है कि gcc 4.7 में अभी भी लीड है, मैंने अभी तक निर्णायक बेंचमार्क नहीं देखा है), लेकिन छात्रों के लिए यह सीखना वास्तव में वैसे भी मायने नहीं रखता है।

दूसरी ओर, क्लैंग के अत्यंत स्पष्ट निदान निश्चित रूप से शुरुआती लोगों के लिए व्याख्या करना आसान है।

इस सरल स्निपेट पर विचार करें:

#include <string>
#include <iostream>

struct Student {
std::string surname;
std::string givenname;
}

std::ostream& operator<<(std::ostream& out, Student const& s) {
  return out << "{" << s.surname << ", " << s.givenname << "}";
}

int main() {
  Student me = { "Doe", "John" };
  std::cout << me << "\n";
}

आप तुरंत ध्यान देंगे कि अर्ध-कॉलन Studentवर्ग की परिभाषा के बाद गायब है , ठीक है :)?

ठीक है, यह एक फैशन के बाद भी नोटिस :

prog.cpp:9: error: expected initializer before ‘&’ token
prog.cpp: In function int main()’:
prog.cpp:15: error: no match for operator<<’ in std::cout << me
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/ostream:112: note: candidates are: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>& (*)(std::basic_ostream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/ostream:121: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ios<_CharT, _Traits>& (*)(std::basic_ios<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/ostream:131: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::ios_base& (*)(std::ios_base&)) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/ostream:169: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/ostream:173: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/ostream:177: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(bool) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/bits/ostream.tcc:97: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/ostream:184: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(short unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/bits/ostream.tcc:111: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/ostream:195: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/ostream:204: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/ostream:208: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long long unsigned int) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/ostream:213: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(double) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/ostream:217: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(float) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/ostream:225: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(long double) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/ostream:229: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(const void*) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i686-pc-linux-gnu/4.3.4/include/g++-v4/bits/ostream.tcc:125: note:                 std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_streambuf<_CharT, _Traits>*) [with _CharT = char, _Traits = std::char_traits<char>]

और Clang वास्तव में यहाँ अभिनीत नहीं है, लेकिन फिर भी:

/tmp/webcompile/_25327_1.cc:9:6: error: redefinition of 'ostream' as different kind of symbol
std::ostream& operator<<(std::ostream& out, Student const& s) {
     ^
In file included from /tmp/webcompile/_25327_1.cc:1:
In file included from /usr/include/c++/4.3/string:49:
In file included from /usr/include/c++/4.3/bits/localefwd.h:47:
/usr/include/c++/4.3/iosfwd:134:33: note: previous definition is here
  typedef basic_ostream<char>           ostream;        ///< @isiosfwd
                                        ^
/tmp/webcompile/_25327_1.cc:9:13: error: expected ';' after top level declarator
std::ostream& operator<<(std::ostream& out, Student const& s) {
            ^
            ;
2 errors generated.

मैं जानबूझकर एक उदाहरण चुनता हूं जो एक अस्पष्ट त्रुटि संदेश (व्याकरण में एक अस्पष्टता से आने वाले) को ट्रिगर करता है बजाय ठेठ "ओह माय गॉड क्लैंग मेरे माइंड रीड" उदाहरण। फिर भी, हम नोटिस करते हैं कि क्लैंग त्रुटियों की बाढ़ से बचता है। छात्रों को डराने की जरूरत नहीं है।


2
उम ... पिछली बार जब मैंने जाँच की थी तो मैंने एक लेख पढ़ा था जिसमें विभिन्न बेंचमार्क प्रकाशित किए गए थे, जिसमें क्लैंग ने कभी भी टेस्ट में पानी से बाहर निकाल दिया था। स्रोत: clang.llvm.org/features.html#performance

31
@AscensionSystems: सावधान रहें, उन परीक्षणों में क्लैंग बाइनरी के प्रदर्शन को दिखाया गया है (और यह कुछ समय पहले था), न कि आपके द्वारा संकलित बाइनरी का प्रदर्शन।
मैथ्यू एम।

यह एक अच्छी बात है कि मैं संकलित निष्पादनयोग्य के बीच एक स्टैंड अप तुलना देखने के लिए इच्छुक हूं। मैं इस धारणा के तहत हूं कि क्लैग ऑप्टिमाइज़ेशन में बहुत बेहतर काम करता है, लेकिन मैंने वास्तव में कोई बेंचमार्क नहीं देखा है। मैं इसे देख लूँगा।

4
@AscensionSystems: यहाँ नवीनतम बेंच है जो मुझे gcc 4.6 की तुलना llvm 3.0 से करने की जानकारी है जो औसत में gcc का शुद्ध लाभ दिखाती है। यह भी दिलचस्प हो सकता है कि ड्रैगनगेट बेंच हो , ड्रैगनएग एक प्लगइन है जो कि जीसीसी फ्रंट-एंड (और संभवतः ऑप्टिमाइज़र) का उपयोग करने की अनुमति देता है और फिर कोड उत्पन्न करने के लिए एलएलवीएम बैकएंड करता है।
मैथ्यू एम।

1
पिछली बार जब मैंने जाँच की, तो phoronix मानक बहुत अविश्वसनीय थे: संकलक झंडे को ठीक से प्रलेखित नहीं किया गया था, लेकिन सुझाए गए परिणाम ठीक से सेट नहीं किए जा रहे थे।
Eamon Nerbonne

35

अभी के अनुसार, GCC के पास Clang की तुलना में C ++ 11 विशेषताओं के लिए बहुत बेहतर और अधिक पूर्ण समर्थन है। इसके अलावा, जीसीसी के लिए कोड जनरेटर क्लैंग में एक की तुलना में बेहतर अनुकूलन करता है (मेरे अनुभव में, मैंने कोई संपूर्ण परीक्षण नहीं देखा है)।

दूसरी ओर, क्लैंग अक्सर कोड को जीसीसी की तुलना में अधिक तेजी से संकलित करता है, और आपके कोड में कुछ गड़बड़ होने पर बेहतर त्रुटि संदेश उत्पन्न करता है।

वास्तव में किस चीज का उपयोग करना है यह इस बात पर निर्भर करता है कि आपके लिए क्या चीजें महत्वपूर्ण हैं। मैं संकलन की मूल्य सुविधा की तुलना में C ++ 11 समर्थन और कोड पीढ़ी की गुणवत्ता को अधिक महत्व देता हूं। इस वजह से, मैं जीसीसी का उपयोग करता हूं। आपके लिए, ट्रेड-ऑफ अलग हो सकता है।


3
यहाँ नवीनतम Phoronix लेख है जिसकी तुलना जीसीसी 4.6 बनाम क्लैंग 3.0 के साथ-साथ बुलडोजर प्लेटफ़ॉर्म के लिए पिछले लेख से की गई है। बेंचमार्क के आधार पर, विजेता या तो एक या दूसरा होता है (पिछले लेख में, gcc 4.7 भी दिखाई देता है), इसलिए मुझे व्यक्तिगत रूप से यह स्पष्ट नहीं है कि कौन बेहतर प्रदर्शन कर रहा है।
मैथ्यू एम।

दोनों का उपयोग क्यों नहीं? विकास के लिए क्लैंग, और उत्पादन के लिए जीसीसी।
सेगफॉल्ट

5
@segfault: यह वही है जो मैं वर्तमान में कर रहा हूं। यह उत्तर काफी पुराना है, और यह अब पूरी तरह से सच नहीं है। क्लैंग और जीसीसी दोनों में काफी सुधार हुआ है क्योंकि मैंने इसे लिखा था (विशेष रूप से, क्लैंग अब जीसीसी समग्र सी ++ 11 समर्थन से मेल खाता है, और जीसीसी ने अपने त्रुटि संदेशों और संकलन गति में सुधार किया है)। अब मैं क्लैंग की ओर थोड़ी वरीयता के साथ दोनों का उपयोग करने का सुझाव दूंगा क्योंकि क्लैंग स्रोत कोड जीसीसी स्रोत की तुलना में समझने में बहुत आसान है।
मकारसे

23

मैं दोनों का उपयोग करता हूं क्योंकि कभी-कभी वे अलग-अलग, उपयोगी त्रुटि संदेश देते हैं।

पायथन परियोजना कई छोटे बगलेट को खोजने और ठीक करने में सक्षम थी, जब कोर डेवलपर्स में से एक ने पहली बार क्लैंग के साथ संकलन करने की कोशिश की थी।


1
डीबग बिल्ड के लिए क्लैंग का उपयोग करने पर आपके विचार क्या हैं लेकिन अनुकूलित रिलीज के लिए जीसीसी?
ओलिकल

5
यह Clang के साथ विकसित करने और GCC के साथ रिलीज़ करने के लिए उचित है, लेकिन सुनिश्चित करें कि आपका GCC रिलीज़ आपके टेस्ट सूट (NDEBUG के साथ और बिना दोनों) पास करता है।
रेमंड हेटिंगर

2
जवाब देने के लिए धन्यवाद। मैं इसे थोड़े समय के लिए आज़मा रहा हूं और यह वास्तव में अच्छी तरह से काम करता है। मुझे चेतावनी के अलग-अलग सेट भी मिलते हैं, जो बहुत अच्छा है।
ओलिकल

11

मैं क्लैंग और जीसीसी दोनों का उपयोग करता हूं, मुझे लगता है कि क्लैंग के पास कुछ उपयोगी चेतावनियां हैं, लेकिन मेरे स्वयं के रे-ट्रेसिंग बेंचमार्क के लिए - इसके लगातार 5-15% धीमे फिर जीसीसी (ले लो कि निश्चित रूप से नमक के अनाज के साथ, लेकिन समान समान झंडे का उपयोग करने का प्रयास किया गया) दोंनो के लिए)।

तो अब के लिए मैं क्लैंग स्थैतिक विश्लेषण और जटिल मैक्रोज़ के साथ इसकी चेतावनियों का उपयोग करता हूं: (हालांकि अब जीसीसी की चेतावनियां बहुत अच्छी हैं - gcc4.8 - 4.9)।

कुछ विचार:

  • क्लैंग का कोई ओपनएमपी समर्थन नहीं है, केवल तब ही मायने रखता है जब आप इसका लाभ उठाते हैं लेकिन जब से मैं करता हूं, यह मेरे लिए एक सीमा है। (*****)
  • क्रॉस संकलन का समर्थन नहीं किया जा सकता है (उदाहरण के लिए FreeBSD 10 अभी भी GCC4.x का उपयोग ARM के लिए), उदाहरण के लिए gcc-mingw लिनक्स पर उपलब्ध है ... (YMMV)।
  • कुछ IDE अभी तक पार्संग आउटपुट ( उदाहरण के लिए QtCreator *****) का समर्थन नहीं करते हैं । EDIT: QtCreator अब Clang के आउटपुट का समर्थन करता है
  • जीसीसी के कुछ पहलुओं को बेहतर ढंग से प्रलेखित किया गया है और चूंकि जीसीसी लंबे समय से आसपास है और व्यापक रूप से उपयोग किया जाता है, इसलिए आपको चेतावनियों / त्रुटि संदेशों की मदद लेना आसान हो सकता है।

***** - ये क्षेत्र सक्रिय विकास में हैं और जल्द ही इसका समर्थन किया जा सकता है


मैं ओपनएमपी का भी उपयोग करता हूं लेकिन मैं टीबीबी पर स्विच करने के बारे में सोच रहा हूं जो मुझे लगता है कि क्लैंग के साथ काम करेगा।

1
टीबीबी कुछ मामलों में ओपनएमपी के लिए एक व्यवहार्य विकल्प हो सकता है (लेकिन केवल सी ++ के लिए जहां तक ​​मैं बता सकता हूं), सी के लिए इसका समर्थन नहीं है - बड़ी परियोजनाओं के लिए भी, ओपनएमपी से कुछ और पर स्विच करना विशेष रूप से सार्थक नहीं हो सकता है यदि क्लैंग अंततः होगा। वैसे भी OpenMP का समर्थन करें।
ideasman42

7

छात्र स्तर के कार्यक्रमों के लिए, क्लैंग को यह लाभ है कि यह डिफ़ॉल्ट रूप से, सख्त लेख है। सी मानक। उदाहरण के लिए, हैलो वर्ल्ड का निम्नलिखित कश्मीर एंड आर संस्करण जीसीसी द्वारा चेतावनी के बिना स्वीकार किया जाता है, लेकिन क्लैंग द्वारा कुछ सुंदर वर्णनात्मक त्रुटि संदेशों के साथ अस्वीकार कर दिया गया है:

main()
{
    puts("Hello, world!");
}

जीसीसी के साथ, आपको इसे यह -Werrorप्राप्त करने के लिए देना होगा कि यह वास्तव में एक वैध C89 कार्यक्रम नहीं है। इसके अलावा, आपको अभी भी C99 भाषा का उपयोग करने c99या gcc -std=c99प्राप्त करने की आवश्यकता है ।


8
gccआम तौर पर इसे कम से कम लागू किया जाना चाहिए -Wall, जो इस कार्यक्रम के लिए चेतावनी देता है। clangहालांकि अच्छी चेतावनियाँ / त्रुटियाँ पैदा करता है।
कैफे

2
@ caf: जो वास्तव में वह बिंदु है जिसे मैं बनाने की कोशिश कर रहा हूं, जीसीसी के साथ आपको इसे विकल्प पास करना होगा। बॉक्स से बाहर, शिक्षण उद्देश्यों के लिए बहुत सहनशील हो सकता है।
फ्रेड फू

यह सच हो सकता है, लेकिन यह काफी मामूली बात है। त्रुटि संदेशों की गुणवत्ता अधिक महत्वपूर्ण है । जीसीसी 4.6 बहुत अच्छा मिला है, हालांकि मैं समझता हूं कि क्लैंग वहां कुछ वास्तविक जादू कर रहा है।
केरेक एसबी

2
@ ड्रीमलैक्स: सच; वहाँ भी है gnu99, gnu++98और gnu++0x। मुझे लगता है कि वे वास्तविक विस्तार हैं , हालांकि, वे बिना अड़चन के आईएसओ मानक कोड संकलित करेंगे। यहाँ विवरण हैं: C के लिए , C ++ के लिए
केरेक एसबी नोव

1
यह प्रोग्राम त्रुटियों या चेतावनियों का उत्पादन नहीं करना चाहिए। यह मानक के अनुरूप है।
माइल्स रूट

3

मुझे लगता है कि क्लैंग एक विकल्प हो सकता है।

GCC और क्लैंग के भावों में कुछ अंतर है a+++++a, और मुझे अपने सहकर्मी के साथ कई अलग-अलग उत्तर मिले हैं जो मैक पर क्लैंग का उपयोग करते हैं जबकि मैं एफसीसी का उपयोग करता हूं।

जीसीसी मानक बन गया है, और क्लैंग एक विकल्प हो सकता है। क्योंकि जीसीसी बहुत स्थिर है और अभी भी इसका विकास जारी है।


5
क्लैंग तेजी से पूरी तरह से लिनक्स की दुनिया में जीसीसी को बदलने की तैयारी कर रहा है, और बीएसडी दुनिया में काफी हद तक ऐसा कर चुका है। इसने मैक पर GCC को वर्षों पहले बदल दिया था। क्लैंग अच्छी चीज है। मुझे लगता है कि जीसीसी व्यक्तिगत रूप से एक विकल्प बन सकता है, और मुझे इस बारे में खुशी होगी।
कोडर 543

5
अभिव्यक्ति +++++ a अपरिभाषित है, इसलिए प्रत्येक संकलक पर एक अलग उत्तर पाने की उम्मीद है, या एक ही संकलक के विभिन्न संस्करणों पर भी। आप अलग-अलग समय पर संकलित होने पर उसी संकलक पर उस अभिव्यक्ति के लिए अलग-अलग परिणाम प्राप्त कर सकते हैं। यही "अपरिभाषित" का अर्थ है।
लेलंथ्रान

1
a+++++aअसफल होना चाहिए, क्योंकि यह a ++ ++ + aएक वाक्यविन्यास त्रुटि है जिसे पार्स किया गया है।
राउत

@ लेलंथ्रान जो अपरिभाषित का मतलब नहीं है। इसका अपरिभाषित व्यवहार है, इसलिए कंपाइलर इसे संकलित करने में विफल हो सकता है, या यह रनटाइम पर फेंक सकता है या सीपीयू को लॉक कर सकता है ताकि आपको हार्ड रीसेट या कुछ और भी अधिक भयावह करने की आवश्यकता हो।
एंटटी हापला
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.