155 ریڈنگز

Code Smell 304: Null Pointer استثنیٰ - ریکارڈنگ وقت حادثات کا سبب بننے والے NULL حوالوں سے بچنے کے لئے کس طرح

کی طرف سے Maximiliano Contieri9m2025/06/20
Read on Terminal Reader

بہت لمبا؛ پڑھنے کے لئے

مناسب تصدیق اور null-secure نمونے کا استعمال کرتے ہوئے runtime crashes کا سبب بننے والے NULL حوالوں سے بچیں
featured image - Code Smell 304: Null Pointer استثنیٰ - ریکارڈنگ وقت حادثات کا سبب بننے والے NULL حوالوں سے بچنے کے لئے کس طرح
Maximiliano Contieri HackerNoon profile picture

میں ہر روز NULL مسائل کے بارے میں لکھتا ہوں، لیکن ہر روز خبر مجھے یاد دلاتا ہے: NULL اب بھی زندہ ہے اور ٹکنگ.


TL;DR: مناسب تصدیق اور null-secure ماڈلز کا استعمال کرتے ہوئے runtime crashes کی وجہ سے NULL حوالوں سے بچیں

TL;DR: مناسب تصدیق اور null-secure ماڈلز کا استعمال کرتے ہوئے runtime crashes کی وجہ سے NULL حوالوں سے بچیں

مسائل

  • ٹائپنگ Crash
  • بڑے واقعات اور بندیاں
  • غیر متوقع رفتار
  • سخت ڈبلنگ
  • صارفین کی frustration
  • نظام کے عدم استحکام
  • کم قابل اعتماد

میںگوگل کے Cloudکیس :

  • برا غلطی کا انتظام: null اعداد و شمار کو خوشگوار طریقے سے کام کرنے کے بجائے کوڈ تباہ ہوا
  • کوئی خصوصیات پرچم: سیکورٹی کنٹرولز کے ساتھ نئے کوڈ کو کم از کم جاری نہیں کیا گیا تھا
  • instant global replication: Bad data spreads worldwide instantly like in Crowdstrike Incident: بلاشبہ عالمی ریپنگ: برا ڈیٹا دنیا بھر میں فوری طور پر پھیلتا ہے جیسے Crowdstrike واقعہ میں
  • کوئی randomized backoff: Recovery کی وجہ سے انحصار کی فراہمی
  • ناممکن ٹیسٹ: تنصیب کے دوران ناکامی کے سکرین کو کبھی نہیں ٹیسٹ کیا گیا تھا

حل

  1. Nulls سے بچیں
  2. null چیک کا استعمال کریں اگر nulls آپ کے کنٹرول سے باہر ہیں (مثال کے طور پر، ایک بیرونی API)
  3. ڈیفالٹ اقدار کو شروع کریں
  4. گارڈ کی شرائط
  5. Null Objects کا استعمال کریں
  6. اختیارات کا استعمال نہ کریں

نوکریاں ️

https://hackernoon.com/code-refactoring-tips-no-015-remove-null

خلاصہ

22 جولائی 2019 کو، Aاہم بندوقیہ Google Cloud Platform پر دستیاب ہے.


یہ تقریبا 10:49 AM سے 1:49 PM PDT (3 گھنٹے مجموعی طور پر) تک دنیا بھر میں Google Cloud اور Google Workspace خدمات پر اثر انداز ہوا، کچھ خدمات کو مکمل طور پر دوبارہ حاصل کرنے میں زیادہ وقت لگتا ہے.


یہ اختتام گوگل کے API مینجمنٹ سسٹم میں ایک کاسکڈنگ ناکامی کی وجہ سے ہوا:


  • trigger کے لئے:

29 مئی، 2025 کو، گوگل نے "Service Control" (ان کی API مینجمنٹ سسٹم) میں نئے کوڈ کو اپ ڈیٹ کیا جس میں اضافی کوٹ پالیسی چیک شامل ہوئے.


اس کوڈ میں ایک اہم غلطی تھی.غلط عملاس کی حفاظت نہیں کی گئیپرچمیں.


  • ناکامی کے بارے میں:

12 جون کو ایک سیاسی تبدیلی جس میں خالی /0 0جب سروس کنٹرول نے ان خالی میدانوں کو پروسیس کرنے کی کوشش کی تو، وہ غیر محفوظ کوڈ راستے میں ایک null پاؤنڈر کا سامنا کیا، جس کے نتیجے میں بائنریوں کو ایک ناممکن لنک میں گرنے کے نتیجے میں.


  • عالمی اثر:

چونکہ کوٹ مینجمنٹ عالمی ہے، یہ خراب ڈیٹا دنیا بھر میں سیکنڈ میں متعارف کرایا گیا تھا، ہر علاقے میں سروس کنٹرول کو تباہ کرنے کی وجہ سے.


Null پاؤنڈر انفرادیات جب آپ ایسی اشیاء پر طریقوں یا خصوصیات تک رسائی حاصل کرنے کی کوشش کرتے ہیں جو موجود نہیں ہیں.


یہ ہوتا ہے جب متغیروں میں درست اشیاء انسٹینز کے بجائے null مندرجہ ذیل ہیں.


مسئلہ خاص طور پر پیداوار کے ماحول میں خطرناک ہو جاتا ہے جہاں یہ استثنا آپ کے ایپلی کیشن کو تباہ کرسکتا ہے اور صارفین کو مایوس کرسکتا ہے.


جاوا، C#، اور جاوا سکرپٹ جیسے زبانوں کو اس مسئلہ کے لئے خاص طور پر حساس ہیں، اگرچہ جدید زبان کی خصوصیات اور نمونے آپ کو ان حادثات کو مکمل طور پر بچانے میں مدد کرسکتے ہیں.


Nulls سالوں سے سافٹ ویئر کی صنعت میں ایک اہم مسئلہ ہے، لیکن سافٹ ویئر انجینئرز ان کے تخلیق کرنے والے کی خبروں کے باوجود ان کو نظر انداز کر رہے ہیں.

نمونہ کوڈ

غلط ہے

public class ServiceControlPolicy {
  private SpannerDatabase spannerDB;
  private QuotaManager quotaManager;
    
  public void applyPolicyChange(PolicyChange change) {
      // NULL POINTER: change can be null
      Policy policy = spannerDB.getPolicy(change.getPolicyId());
      // NULL POINTER: policy can be null from the database
      String quotaField = policy.getQuotaField();
      // NULL POINTER: quotaField can be null (blank field)
      quotaManager.updateQuota(quotaField, change.getValue());
  }
    
  public void exerciseQuotaChecks(String region) {
      // NULL POINTER: policies list can be null
      List<Policy> policies = spannerDB.getPoliciesForRegion(region);
      for (Policy policy : policies) {
          // NULL POINTER: individual policy can be null
          String quotaValue = policy.getQuotaField();
          // NULL POINTER: quotaValue can be null before trim()
          quotaManager.checkQuota(quotaValue.trim());
      }
  }
    
  public boolean validatePolicyData(Policy policy) {
      // NULL POINTER: policy parameter can be null
      String quotaField = policy.getQuotaField();
      // NULL POINTER: quotaField can be null before length()
      return quotaField.length() > 0 && 
             !quotaField.equals("null");
  }
    
  public void replicateGlobally(PolicyChange change) {
      List<String> regions = getGlobalRegions();
      for (String region : regions) {
          // NULL POINTER: change.getPolicy() can return null
          spannerDB.insertPolicy(region, change.getPolicy());
      }
  }
}

حق ہے

public class ServiceControlPolicy {
  private SpannerDatabase spannerDB;
  private QuotaManager quotaManager;
    
  public void applyPolicyChange(PolicyChange change) {
      if (change == null) {
          // Assuming it comes from an external API
          // Beyond your control
          change = new NullPolicyChange();
      }
      
      Policy policy = findPolicyOrNull(change.policyId());
      String quotaField = policy.quotaField();
      if (!quotaField.isEmpty()) {
          quotaManager.updateQuota(quotaField, change.value());
      }
  }
    
  public void exerciseQuotaChecks(String region) {
      if (region == null || region.isEmpty()) {
          // Assuming it comes from an external API
          // Beyond your control
          return;
      }
      
      List<Policy> policies = policiesOrEmpty(region);
      
      for (Policy policy : policies) {
          String quotaValue = policy.quotaField();
          if (!quotaValue.isEmpty()) {
              quotaManager.checkQuota(quotaValue.trim());
          }
      }
  }
    
  public boolean validatePolicyData(Policy policy) {
      if (policy == null) {
          // Assuming it comes from an external API
          // Beyond your control
          // From now on, you wrap it
          policy = new NullPolicy();
      }
      
      String quotaField = policy.quotaField();
      return quotaField.length() > 0;
  }
    
  public void replicateGlobally(PolicyChange change) {
      if (change == null) {
          // Assuming it comes from an external API
          // Beyond your control
          // From now on, you wrap it
          change = new NullPolicyChange();
      }
        
      Policy policy = change.policy();
      if (policy == null) {
          // Assuming it comes from an external API
          // Beyond your control
          // From now on, you wrap it
          policy = new NullPolicy();
      }
        
      List<String> regions = globalRegions();
      for (String region : regions) {
          spannerDB.insertPolicy(region, policy);
      }
  }
    
  private Policy findPolicyOrNull(String policyId) {
      Policy policy = spannerDB.policy(policyId);
      return policy != null ? policy : new NullPolicy();
  }
    
  private List<Policy> policiesOrEmpty(String region) {
      List<Policy> policies = spannerDB.policiesForRegion(region);
      if (policies == null) {
          // This is a good NullObject
          return Collections.emptyList();
      }
      
      return policies.stream()
              .map(p -> p != null ? p : new NullPolicy())
              .collect(Collectors.toList());
  }
}

class NullPolicy extends Policy {
  @Override
  public String quotaField() { return ""; }
    
  @Override
  public String policyId() { return "unknown-policy"; }
    
  @Override
  public Map<String, String> metadata() { 
      return Collections.emptyMap(); 
  }
}

class NullPolicyChange extends PolicyChange {
  @Override
  public String policyId() { return ""; }
    
  @Override
  public String value() { return ""; }
    
  @Override
  public Policy policy() { return new NullPolicy(); }
}

کی شناخت

  • [x] نصف خودکار

آپ null چیکنگ کے بغیر اشیاء پر براہ راست طریقہ کار کال کے لئے کوڈ کا جائزہ لانے کے ذریعے ممکنہ null پاؤنڈر اختیارات کی تشخیص کرسکتے ہیں.You can detect potential null pointer exceptions by reviewing code for direct method calls on objects without null checks.


Linters ان طریقوں سے واپسی کے معیاروں کی جانچ کر سکتے ہیں جو واپسی کرسکتے ہیں0 0غیر ابتدائی اشیاء کے میدانوں کی تلاش، اور اسٹیٹک تجزیہ کے اوزار کا استعمال کرتے ہوئے جو ممکنہ null dereferences کو نشانہ بناتے ہیں.


جدید IDEs اکثر ان مسائل کو ڈراپ کے ساتھ ظاہر کرتے ہیں.

️️

  • 0 0

سطح

  • [x] منتظم

یہ کیوں اہم ہے ️

میںحقیقی دنیاچیزیں موجود ہیں یا نہیں ہیں.


جب آپ اپنے پروگرام میں یہ درست طریقے سے ماڈل کرتے ہیں تو، آپ ایک واضحایک سے ایک پیغامحقیقت اور کوڈ کے درمیان


null حوالوں کی اجازت کے ذریعے اس bijection کو توڑنے سے آپ کو آپ کے کوڈ میں موجود فانتوم اشیاء پیدا ہوتے ہیں لیکن حقیقی دنیا میں نہیں، جب آپ ان موجودہ موجودہ اشیاء کے ساتھ بات چیت کرنے کی کوشش کرتے ہیں تو آپ کی تباہی کی وجہ سے.


اگر آپ اپنے لائسنس پلیٹ "NULL" کا نام منتخب کرتے ہیں تو آپ کوبہت سے پارکنگ ٹکٹ

یہ نسل ہے

AI جنریٹرز اکثر null pointer vulnerabilities کے ساتھ کوڈ تخلیق کرتے ہیں کیونکہ وہ خوشگوار راستے کے منظر پر توجہ مرکوز کرتے ہیں.


وہ اکثر میٹرو کالز پیدا کرتے ہیں، جہاں اشیاء ممکنہ طور پر کنجیس حالات پر غور نہیں کرتے ہیں.0 0خاص طور پر پیچیدہ اشیاء ہائیریشیا میں یا بیرونی اعداد و شمار کے ذرائع کے ساتھ کام کرتے وقت.

ڈیزائن

AI ٹولز تشخیص کرسکتے ہیں اور null pointer مسائل کو حل کرسکتے ہیں جب آپ دفاعی پروگرامنگ کے طریقوں کے بارے میں واضح ہدایات فراہم کرتے ہیں.

کوشش کریں!

یاد رکھیں: AI مددگار بہت سی غلطیاں کرتے ہیں

تجاویز: تمام Null References کو ہٹا دیں

تجاویز: تمام Null References کو ہٹا دیں

Without Proper Instructions

With Specific Instructions

ChatGPT

ChatGPT

Claude

Claude

Perplexity

Perplexity

Copilot

Copilot

Gemini

Gemini

DeepSeek

DeepSeek

Meta AI

Meta AI

Grok

Grok

Qwen

Qwen

چیٹنگ

چیٹنگ

کلوڈ

کلوڈ

پریشانی

پریشانی

پائلٹ

پائلٹ

Gemini کے

Gemini کے

DeepSeek کے

DeepSeek کے

کا مقصد

کا مقصد

گرک

گرک

کیوین

کیوین

Conclusion 🏁

Null Pointer اختیارات پروگرامنگ میں سب سے زیادہ عام runtime غلطیوں میں سے ایک ہیں.


آپ مناسب null چیک، Null Object ڈیزائن کے ماڈل کا استعمال کرتے ہوئے، اور دفاعی پروگرامنگ کے طریقوں کو قبول کرکے ان میں سے اکثر حادثات کو حذف کرسکتے ہیں.


تصدیق کوڈ کا چھوٹا سا اوورکرپٹ ایپلی کیشن کی استحکام اور صارف کے تجربے میں اہم طور پر فائدہ اٹھاتا ہے.

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-iii-t7h3zkv

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xliii

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxxix

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxvi

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xlii

مزید معلومات

Disclaimer

ذائقہ میرا ہےنظریہ.


میں نے اسے میرا ہزاروں ڈالر کی غلطی کہا۔ یہ 1965 میں صفر رجحان کی تخلیق تھی

میں نے اسے میرا ہزاروں ڈالر کی غلطی کہا۔ یہ 1965 میں صفر رجحان کی تخلیق تھی

ٹونی ہار


یہ مضمون CodeSmell سیریز کا حصہ ہے.


Trending Topics

blockchaincryptocurrencyhackernoon-top-storyprogrammingsoftware-developmenttechnologystartuphackernoon-booksBitcoinbooks