본문 바로가기

Software

(79)
Hi-Impedance(하이 임피던스) 우선 알아야 할것은 논리회로에서 1과 0과 Open의 차이를 정확하게 구분해야 한다. 1은 5V이고, 0은 0V라는 것은 대부분 사람들이 잘 이해한다. 그렇다면 Open은 어떤 상태일까? Open 즉 전압이 없으므로 0이 아닐까?라고 생각할 수 있지만 Open과 0은 분명히 다르다. 이 Open이 Hi-Impedance 상태라한다. 화재를 잠시 바꾸어, 어떤 스위치가 있다고 가정을 하자. 이 스위치는 누르면 On이 되고, 떼면 Off가 된다.(여기서 Off란 Open 상태와 동일하다) 이것을 CPU에 연결했다고 가정해보자. 한쪽은 CPU 입력단자에, 다른 한쪽은 GND로 연결하면 스위치를 GND가 되어 0이 되는 것은 확실하지만 떼면 어떻게 될까? 정답은 Open 상태가 된다. 이 때는 0이라할 수도 없..
Error message 모음 ※ Bad call of in-line function 마크로 정의로부터 행단위(in-line) 관계가 올바르게 호출되지 않고 있다. 행단위 관계란 시작과 끝에 두개의 연속한 밑줄이 붙어 있는 함수를 말한다. 이 행단위 함수는 이중 밑줄( _ _ )로 시작하고 끝난다. ※ Irreducible expression tree 컴파일러 자신의 에러를 표시한다. 원시화일의 지정되 행에서 코드를 생성할 수 없는 식이 존재하기 때문에 변경을 해야만 한다. ※ Register allocation failure 컴파일러 자신의 에러를 표시한다. 원시 화일의 지정된 행에 몇개의 식이 코드생성기로 하여금 코드를 생성할 수 없게 하고 있다. 위배되는 식이 무엇이든 간에 이것은 방지 되어야 한다. Error ---------..
Secure Cordng C - Expression EXP-00 연산자 우선순위를 나타내는데 괄호를 사용하라 괄호를 적절하게 사용하면 우선순위 때문에 발생하는 실수를 피할 수 있으며, 방어적으로 에어를 줄일 수 있고 코드 가독성도 높아진다. 1. 부적절한 코드연산자 우선순위를 잘못 이해하여 코드가 의도대로 실행되지 않는다.#include int is_even(int x){return x & i == 0 ? 1 : 0;} int main(){int n = 2;if(is_even(n))printf("even\n");elseprintf("odd\n"); return 0;} 해결 방법 - 표현식이 의도대로 평가되도록 괄호를 사용한다.#include int is_even(int x){return (x & i) == 0 ? 1 : 0;} int main(){int ..
Secure Cordng C - Declaration DCL-00 변하지 않는 객체는 const로 보장해둬라 변하지 않는 객체는 const로 보장해야 한다. 객체의 불변성을 const를 사용해 보장하면애플리케이션의 정확성과 안전성을 보장하는데 도움이 된다. 부적절한 코드다음의 코드에서 객체의 값이 의도하지 않게 변경되고 있다.#include typedef struct{int x, y;}Point; void print_point(Point *p){printf("x = %d, y = %d\n", p->x, p->y);p->x = -1;} int main(){Point p = { 0, };print_point(&p); return 0;} 해결 방법 - const 키워드를 사용하면 이를 해결할 수 있다.#include typedef struct{int x, y;}..
Secure Cordng C - Preprocessor PRE-00 함수형의 매크로보다는 인라인이나 정적 함수를 사용하라 일반 함수는 함수 호출의 오버헤드가 존재한다. 때문에 간단한 코드에 대한 함수 호출은 성능 상의 이슈가 발생할 수 있다. 그래서 전통적인 프로그래머들은 간단한 코드에 대해 일반 함수가 아닌 함수형 매크로를 사용하기도 한다. 그러나 매크로는 컴파일러에 의한 평가가 아닌 단순 치환 구조이기 때문에 부수 효과가 발생할 수 있다.인라인 함수란 함수 호출 코드가 함수의 기계어 코드로 치환되는 함수를 의미한다. 인라인 함수는컴파일 타임에 처리되므로 함수 호출의 오버헤드가 없어진다. 그러므로 함수형 매크로보다는인라인 함수를 사용하는 것이 좋다. 위험한 코드 1매크로 함수 호출 시 사용된 인자에 대한 증가, 감소, 메모리 변수 접근 등은 부수 효과를 발..
Secure Cordng C - Coding Style 2-1 코딩 스타일의 이해 1. 코딩(Coding) 일반적으로 프로그래밍 언어를 사용하여 원시 코드 또는 소스 코드를 작성하는 행위를 코딩이라고 한다. 2. 프로그래밍과 코딩(Programming and Coding) 코딩과 프로그래밍은 유사한 개념으로 사용되지만 엄밀히 이야기하면 다음과 같다.프로그래밍 - 프로그램의 논리를 설계하는것코딩 - 프로그램의 논리에 따라 특정 언어를 사용하여 구현 3. 코딩 스타일(Cording Style) 원시 코드 또는 소스 코드를 작성하는 방식을 보통 코딩 스타일이라고 하며, 유사한 개념으로 '코딩 습관(Coding convention)'이 있다. 4. 코딩 스타일의 목적 코딩 스타일의 목적은 여러 가지가 존재하며 대표적으로 다음과 같은 것들이 있다.개발 기간의 지연 방..
Secure Cordng C - 포인터의 개념과 이해 #3 1-9 동적 메모리 할당 1. 동적 메모리 할당동적 메모리 할당 또는 메모리 동적 할당은 프로그램이 실행 시간(runtime) 동안 또는 실행 중에 사용할 메모리 공간을 할당하는 것을 의미동적 할당은 스택(stack)이 아닌 힙(heap) 영역을 사용 2. 동적 메모리 할당 함수사용자가 동적으로 메모리를 할당할 수 있도록 표준 라이브러리에서는 다음의 3가지 함수를 제공하며 이 함수는 sodlib.h 파일에서 찾을 수 있음void *malloc(size_t size): 힙 영역에 메모리 할당void *realloc(void *ptr, size_t size): 기존의 할당된 메모리의 크기를 변경void *calloc(size_t elength, size_t esize): 힙 영역에 메모리 할당 후, 0으로 ..
Secure Cordng C - 포인터의 개념과 이해 #2 1-5 포인터와 연산1. 포인터와 포인터와의 산술 연산주소는 정수 타입의 상수이므로 근본적으로는 산술 연산 가능덧셈과 곱셈 그리고 나눗셈에 의한 연산은 할 수 없는데 이는 잘못된 메모리 참조로 인한 프로세스의 비정상 종료를 최소화하기 위함피연산자를 포인터로 하는 연산자는 오직 뺄셈만 가능뺄셈의 결과는 정수 타입의 값이며 이 값은 두 위치 사이의 차(거리)를 의미#include int str_length(const char *str){char *p = str;while(*p++)/* nothing */;return (p - str) -1;} void main(){printf("length of hello = %d\n", str_length("hello"));} 2. 포인터와 정수의 산술 연산피연산자가 포인..