میں ہر روز 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 کی وجہ سے انحصار کی فراہمی
- ناممکن ٹیسٹ: تنصیب کے دوران ناکامی کے سکرین کو کبھی نہیں ٹیسٹ کیا گیا تھا
حل
- Nulls سے بچیں
- null چیک کا استعمال کریں اگر nulls آپ کے کنٹرول سے باہر ہیں (مثال کے طور پر، ایک بیرونی API)
- ڈیفالٹ اقدار کو شروع کریں
- گارڈ کی شرائط
- Null Objects کا استعمال کریں
- اختیارات کا استعمال نہ کریں
نوکریاں ️
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 |
---|---|
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 سیریز کا حصہ ہے.