CμΈμ΄λ‘ λμνλ νλ‘μΈμ€λ ν¬κ² 4κ°μ§μ λ©λͺ¨λ¦¬ μμ(text, data, heap, stack)μ ν΅ν΄ ꡬμ±λλ€. μ μ λ³μ, μ§μλ³μ λ± μ¬μ©λλ μμΉλ ν€μλ λ±μ λ°λΌ λ©λͺ¨λ¦¬ μμμ΄ λ¬λΌμ§κ² λλ€. μμ νλ‘κ·Έλ¨ λ¨μμμλ ν¬κ² μ κ²½ μ°μ§ μμλ λμ§λ§, λ€λ£¨λ μλ£κ΅¬μ‘°μ ν¬κΈ°κ° ν° κ²½μ° stack overflowμ κ°μ μ€λ₯μ μ§λ©΄ν μ μλ€. μ΄λ¬ν μ€λ₯λ₯Ό λ°©μ§νκΈ° μν΄μλ λ©λͺ¨λ¦¬ μμμ λν λͺ νν μ΄ν΄κ° νμνλ€. Memory Layout stack & heap stack ν¨μ νΈμΆ μ μμ±λκ³ , ν¨μ μ’ λ£ μ λ°νλλ μμμ΄λ€. μ¦ μ§μ λ³μ(local variable)μ΄ ν λΉλλ μμμ΄λ€. heap λμ μΌλ‘ ν λΉλλ λ³μλ₯Ό μν μμμ΄λ€. μλ₯Ό λ€λ©΄, malloc λλ callocμ ..
κΈ°μ΅ ν΄λμ€ μ§μ μ(Storage class specifiler)λ λ³μλ₯Ό μν κΈ°μ΅μ₯μΉ ν λΉ κ΄λ¦¬μ ν¨μ¨μ±μ λ΄λΉνλ€. λν λ©λͺ¨λ¦¬, λ μ§μ€ν°, μ€ν λ± μ΄λμ ν λΉνλλμ λ°λΌ scopeμ life timeμ΄ λ¬λΌμ§κ² λλ€. λ°λΌμ κ° κΈ°μ΅ ν΄λμ€μ λν νΉμ§μ λͺ νν μκ³ μ½λλ₯Ό μμ±νλ κ²μ΄ μ’λ€. auto νν μ¬μ©νλ λ³μλ‘, μ무κ²λ μ§μ νμ§ μμΌλ©΄ μλμΌλ‘ `auto` ν€μλκ° λΆκ² λλ€. μ΄λ μ μΈλ μμ λλ ν¨μλ₯Ό λ²μ΄λλ©΄ μ¬λΌμ§κ² λλ©°, μ€ν μ€μλ λ©λͺ¨λ¦¬μ `stack`μ μμΉνκ² λλ€. register ν΄λΉ ν€μλλ₯Ό μ§μ ν λ³μλ₯Ό CPUμ `register`μ μ μ₯νλλ‘ μμ²ν λ μ¬μ©νλ€. μ΄λ μ»΄νμΌλ¬μ λ°λΌ μ¬μ©μκ° `register`λΌκ³ λͺ μνμμμλ λΆκ΅¬νκ³ `auto`..
리λ μ€μμ λ΄κ° μνλ νλ‘μΈμ€λ₯Ό ν λΉνκΈ° μν΄, μ μ λ 벨μμ fork()λ₯Ό νμ©νμ¬ λμ μ€ν νλ‘κ·Έλ¨μ λΆλͺ¨λ‘ νλ μμ νλ‘μΈμ€λ₯Ό μμ±ν μ μλ€. fork()κ° μ΄λ€ μμΌλ‘ λμνλμ§ μ νν μ΄ν΄νμ§ λͺ»νλ€λ©΄, μμΉ μλ κ²°κ³Όλ₯Ό λ§λ€ μ μμΌλ―λ‘ μ 리ν΄λ³΄κ³ μ νλ€. fork μ΄ν΄λ³΄κΈ° 리λ μ€μμ μμ κ°μ΄ `man fork`λ₯Ό μ λ ₯νλ©΄ `fork()`μ λν μ€λͺ μ΄ λμ¨λ€. κ°λ¨ν μ€λͺ νμλ©΄, `fork()`λ₯Ό νΈμΆνλ νλ‘μΈμ€, μ¦ λΆλͺ¨ νλ‘μΈμ€λ₯Ό κ·Έλλ‘ λ³΅μ ν μλ‘μ΄ νλ‘μΈμ€λ₯Ό μμ±νλ€. λν, μ€ν κ²°κ³Όμ λ°λΌ λ°ν κ²°κ³Όλ μμ΄νλ€. μλ‘μ΄ νλ‘μΈμ€λ₯Ό ν λΉν μ μλ κ²½μ°λ `-1`μ λ°ννλ€. λΆλͺ¨ νλ‘μΈμ€μ κ²½μ° μμ±ν μμ νλ‘μΈμ€μ `pid`λ₯Ό λ°ννλ©°, μμ νλ‘μΈμ€μ κ²½μ° `0`μ..
λ ν νΌμ μ νκ²½ κ°μ¬λμ Secure & Generic C κ°μλ₯Ό λ£κ³ , μ 리ν λ΄μ©μ λλ€. ν΄λΉ λ΄μ©μ μ μκΆμ μ νκ²½ κ°μ¬λμκ² μμ΅λλ€. λμ ν λΉ user levelμμ μ¬μ©ν μ μλ λμ ν λΉμΌλ‘λ λνμ μΌλ‘ `malloc`κ³Ό `calloc`μ΄ μλ€. `malloc`μ μ¬μ©νκ³ μ νλ λ©λͺ¨λ¦¬ 곡κ°μ ν λΉ ν λ³λμ μ΄κΈ°νκ° μμ΄ μ°λ κΈ° κ°μ κ°λλ€. μ΄μ λ¬λ¦¬ `calloc`μ λ©λͺ¨λ¦¬ κ³΅κ° ν λΉ νμ ν λΉλ 곡κ°μ λͺ¨λ 0μΌλ‘ μ΄κΈ°ν νλ€. malloc mallocμ parameterλ‘ ν λΉνκ³ μ νλ ν¬κΈ°λ₯Ό λ°λλ€. 보ν΅μ ν λΉνκ³ μ νλ 곡κ°μ λ°μ΄ν° νμ μ λ°λΌ `sizeof(λ°μ΄ν° νμ )` μ°μ°μ ν΅ν΄ ν λΉνλ€. λ§μ½ mallocμ μ¬μ©νμ¬ ν¬κΈ°κ° 5μΈ int 1μ°¨μ λ°°μ΄μ ν λΉνλ€λ©΄ ..
λ ν νΌμ μ νκ²½ κ°μ¬λμ Secure & Generic C κ°μλ₯Ό λ£κ³ , μ 리ν λ΄μ©μ λλ€. ν΄λΉ λ΄μ©μ μ μκΆμ μ νκ²½ κ°μ¬λμκ² μμ΅λλ€. Cμ Generic λ°μ΄ν° νμ μ μκ΄μμ΄ νλμ ν¨μλ‘ λμΌν λμμ μννλλ‘ νλ λ°©μμ΄λ€. μλ₯Ό λ€μ΄ μ λ ¬μ νκ³ μ ν λ, λ°μ΄ν° νμ (int, double ...)μ λ°λΌ λ³λλ‘ ν¨μλ₯Ό ꡬμ±νλ€λ©΄ μ μ§λ³΄μ μΈ‘λ©΄μμ μλΉν λΉν¨μ¨μ μΌ κ²μ΄λ€. λ°λΌμ c++μ STLκ³Ό μ μ¬ν κΈ°λ₯μ Cλ‘λ λ§λ€ μ μλ€. μ΄λ»κ² νλ©΄ genericνκ² μ½λλ₯Ό ꡬνν μ μμκΉ? μ΄λ μμ λ€λ£¬ λ€μν ν¬μΈν°μμ `ν¨μ ν¬μΈν°`, `void ν¬μΈν°`μ κ°μ μμ© ν¬μΈν°λ₯Ό νμ©νλ©΄ λ°μ΄ν° νμ μ μκ΄μμ΄ κΈ°λ₯μ μννλ ν¨μλ€μ ꡬνν μ μλ€. Generic for-eac..
λ ν νΌμ μ νκ²½ κ°μ¬λμ Secure & Generic C κ°μλ₯Ό λ£κ³ , μ 리ν λ΄μ©μ λλ€. ν΄λΉ λ΄μ©μ μ μκΆμ μ νκ²½ κ°μ¬λμκ² μμ΅λλ€. 1μ°¨μ ν¬μΈν° int *p, *pp; int arr[5] = {10, 20, 30, 40 ,50}, num = 10; p = arr; //pλ λ°°μ΄λͺ μ λ°μΌλ―λ‘, p[1]κ³Ό κ°μ΄ λ°°μ΄μ²λΌ μ¬μ©κ°λ₯. *(p++)λ κ°λ₯. // index 3μ μ£Όμλ &arr[2], &p[2], (p + 2), (arr + 2), &*&*(arr + 2) pp = # 1μ°¨μ ν¬μΈν°λ νΉμ ν μ£Όμλ₯Ό ν¬μΈνΈ ν μ μλ€. `λ°°μ΄ λͺ `, `ν¨μ λͺ `, `&λ³μλͺ `μ μ£Όμλ₯Ό λνλΈλ€. λ°λΌμ μμ μμ μ½λμ κ°μ΄ ν¬μΈν° λ³μλ₯Ό μ μΈνκ³ λ°°μ΄λͺ μ λμ μ°μ°νκ² λλ©΄ ν¬μΈν° pλ λ°°μ΄..
λ ν νΌμ μ νκ²½ κ°μ¬λμ Secure & Generic C κ°μλ₯Ό λ£κ³ , μ 리ν λ΄μ©μ λλ€. ν΄λΉ λ΄μ©μ μ μκΆμ μ νκ²½ κ°μ¬λμκ² μμ΅λλ€. μμ€ν μ λ°λ₯Έ λ°μ΄ν° νμ μ μ°¨μ΄ μ¬μ©νλ μμ€ν (ARM, POSIX)μ λ°λΌ κ°μ λ°μ΄ν° νμ μ΄λΌκ³ νλλΌλ ν¬κΈ°κ° λ€λ₯Ό μ μλ€. μ΄λ₯Ό μΈμ§νμ§ λͺ»νκ³ μ½λλ₯Ό μμ±νλ€λ©΄ μμΉ μλ κ²°κ³Όλ₯Ό μ΄λνλ€. μλ₯Ό λ€μ΄ 64bit 리λ μ€ μμ€ν μμ μ μ λμνλ μ½λκ° μλμ° 32bitμμλ λμνμ§ μμ μ μλ€. #include int main() { unsigned int a, b; unsigned long c; a = 100000000; b = 1001; c = (unsigned long)a * b; printf("c = %lu\n", c); return 0; }..
λ ν νΌμ μ νκ²½ κ°μ¬λμ Secure & Generic C κ°μλ₯Ό λ£κ³ , μ 리ν λ΄μ©μ λλ€. ν΄λΉ λ΄μ©μ μ μκΆμ μ νκ²½ κ°μ¬λμκ² μμ΅λλ€. μ°μ°μ μ°μ μμ μ°μ°μ μ°μ μμλ₯Ό μμ§ λͺ»νκ³ , μ μ ν νμ©νμ§ λͺ»νλ€λ©΄ μμΉ μλ κ²°κ³Όλ₯Ό μ΄λν μ μλ€. ν¬μΈν°λ₯Ό μ¬μ©νλλΌλ `()`μ λ°λΌ λ€λ₯Έ κ²°κ³Όλ₯Ό λ§λ€κ² λλ€. #include int main() { int *p; int num[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 0}; p = num; *p++; (*p)++; *++p; ++*p; return 0; } κ°λ¨ν μ½λμ΄μ§λ§ μ°μ°μμ μ°μ μμλ₯Ό λͺ¨λ₯Έλ€λ©΄, μμ μ½λκ° μ΄λ€ κ²°κ³Όλ₯Ό λ°ννκ² λλμ§ μ μ μμ κ²μ΄λ€. `*p++` ν¬μΈν°κ° κ°λ₯΄ν€λ μμΉλ₯Ό 1 μ¦κ°μν¨λ€. μ΄λ `*` 보..