Question bank — Undefined behavior — comprehensive list, why to avoid
5.1.30 · D5· Coding › C Programming › Undefined behavior — comprehensive list, why to avoid
Shuru karne se pehle, ek anchor jo tumhare dimag mein har jawab ke liye rehna chahiye:
Pure page ke liye ek hi picture dimag mein rakho: tumhara program well-defined states ki ek "valley" ke andar rehta hai. Har UB trap ek cliff edge hai — uspe kadam rakho aur neeche zameen nahi hai, koi rule nahi ki tum kahan gire.

True or false — justify
True or false: unsigned integer overflow undefined behavior hai.
True or false: signed overflow theek hai jab tak CPU two's complement use karta hai.
True or false: INT_MIN / -1 safe hai kyunki se divide karna sirf sign flip karta hai.
True or false: C mein zero se divide karna UB hai.
x / 0 aur x % 0 UB hain. (Floating-point division by zero ek alag, IEEE-governed kahani hai, yahan cover nahi ki gayi.)True or false: i = i++; guaranteed hai ki i ya 5 ya 6 chodega.
i ko do baar modify karna bina kisi sequence point ke unhe order kiye UB hai, isliye result kuch bhi ho sakta hai, do values mein se choice nahi. Dekho Sequence Points and Operator Precedence.True or false: uninitialized int padhna sirf ek unpredictable-but-real number deta hai.
True or false: ek program jo -O0 par saare tests pass karta hai mein koi UB nahi hai.
-O2, ya naya input "never happens" assumption ko activate na kar de. Tests pass karna UB ke baare mein kuch nahi prove karta.True or false: array ke end se ek past pointer banana legal hai, lekin usse dereference karna nahi.
True or false: char *s = "hi"; s[0]='H'; jaisa string literal modify karna theek hai kyunki s ek valid pointer hai.
True or false: printf("%d", 3.5) truncation ke baad 3 print karta hai.
printf stack ke galat jagah se bits ko int samajhkar padhta hai, isliye output meaningless hai, rounded 3 nahi.Spot the error
if (x + 100 < x) return -1; — signed x ke liye overflow check mein kya galat hai?
x + 100 < x hamesha false hai aur poora check delete ho jata hai. Defined domain mein x > INT_MAX - 100 se check karo.int *bad(void){ int local=42; return &local; }Return kiye gaye pointer use karne mein kya undefined hai?
local ek automatic variable hai jiska lifetime bad() return hote hi khatam ho jata hai; return kiya gaya pointer dangling hai. Baad mein *p padhna UB hai chahe 42 "accidentally" wahan ho. Dekho Pointers and Memory in C.free(p); free(p);Yeh UB kyun hai?
free ek double free hai — pehle free ke baad, p ab kisi live allocation ki taraf point nahi karta, isliye use phir se free karna allocator ki bookkeeping corrupt kar deta hai. Dekho malloc and free — Dynamic Memory.free(p); printf("%d", *p);Kaun sa rule toot raha hai?
free par khatam ho gayi, isliye p ko dereference karna UB hai. Bug ko loudly crash karane ke liye freeing ke baad pointer ko NULL karo.int a[3]={1,2,3}; printf("%d", a[3]);a[3] ek bug kyun hai jab bhi usne ek number print kiya?
0..2 hain; a[3] out of bounds read karta hai — UB. "Ek number" print karna sirf ek possible symptom hai; yeh crash bhi ho sakta hai ya kisi adjacent variable ko silently corrupt kar sakta hai.int v; unsigned n = ...; int r = v << n;n ki kaun si values ise UB banati hain?
n >= width_in_bits of int (jaise >= 32), aur negative v ko left-shift karna bhi. Kyunki n unsigned hai yeh kabhi negative nahi ho sakta, isliye khatra purely too-large ya negative-v cases mein hai; sirf 0..width-1 ke andar shifts suitable value par defined hain. (Agar signed shift count hota, toh n < 0 ek aur UB case add karta.)Ek int foo(int x) function kisi path par return ke bina } par khatam hota hai; caller result use karta hai. UB kahan hai?
void function ke end se gir jaana aur phir returned value use karna UB hai — returned "value" exist hi nahi karti. (Return na karna sirf tab theek hai jab value kabhi use na ho.)Why questions
Line 50 par UB kabhi kabhi line 10 kyun tod deta hai?
printf) ko delete ya reorder kar sakta hai jo UB path mein le jaata hai — poore program ka meaning undefined ho jaata hai, sirf ek line ka nahi.C committee ne itni saari cheezein undefined kyun chodhi instead of specify karne ke?
Unsigned overflow defined kyun hai lekin signed overflow nahi?
Main "yeh sahi chala" pe trust kyun nahi kar sakta ki mera code UB-free hai?
-O2 enable karne par kabhi kabhi ek bug "introduce" kyun ho jaata hai jo -O0 par nahi tha?
-O2 optimizer ko "never happens" assumption par act karne ki zyada freedom deta hai — checks delete karna ya reorder karna — isliye latent UB finally manifest hoti hai. Dekho Compiler Optimizations and -O flags.Kisi object ko incompatible pointer type ke through access karna UB kyun hai chahe bytes line up hon?
f(g(), h()) ke evaluation order par rely karna risky kyun hai, aur f(i++, i++) worse kyun hai?
f(i++, i++) aage jaata hai: yeh i ko do baar modify karta hai bina unke beech kisi sequence point ke, jo undefined hai — kuch bhi ho sakta hai.Edge cases
Kya C11 mein bina side effects wala infinite loop while(1); safe hai?
volatile side effect add karo.Kya array ke end se do past pointer banana (dereference nahi) UB hai?
Kya p = NULL; p + 1; — null pointer par pointer arithmetic — UB hai?
p + 1 compute karna bhi (dereference toh door ki baat) UB hai. Arithmetic karne se pehle NULL check karo. Dekho Pointers and Memory in C.Kya apne type ke liye correctly aligned na ho aisi pointer dereference karna UB hai?
char* ko int* mein cast karo aur ussse read karo, tum type ki alignment requirement violate karte ho — UB hai, chahe x86 par yeh "usually works" kare. Stricter CPUs (kuch ARM) par yeh outright fault karta hai. Bytes ko properly aligned object mein move karne ke liye memcpy use karo.Kya x % 0 UB hai usi tarah jaise x / 0 hai?
Agar unsigned int n = 0; n--; — kya yeh UB hai?
n UINT_MAX ban jata hai — yeh puri tarah defined behavior hai, aur yahi reason hai ki unsigned sahi tool hai jab tum genuinely wraparound chahte ho.Kya ek valid void* ko uske original type mein cast karna aur usse dereference karna UB cause karta hai?
void* ko directly dereference karna error hai; correct object type se round-trip karna theek hai. UB galat type use karne mein hai, void* ko storage ke liye use karne mein nahi.Recall Fast self-quiz
Signed overflow defined hai? ::: Nahi — UB. Unsigned overflow defined hai? ::: Haan — wraps mod .
Kya UB pehle wali lines ko affect kar sakti hai? ::: Haan — compiler "never happens" se backward reason karta hai.
UB pakadne ke do runtime tools? ::: UBSan aur ASan (-fsanitize=undefined,address).
Kya one-past-the-end pointer banana legal hai? ::: Banana ke liye haan, dereference karne ke liye nahi.
Kya NULL + 1 UB hai? ::: Haan — aise pointer par arithmetic jo kisi object ki taraf point nahi karta.