프로그래밍 언어

    [C/C++] 32bit 자료형 / 64bit 자료형의 크기 정리

    #include #include #include int main(void) { printf("### 1 Byte = 8 bit ###\n"); printf("int : %d byte\n",sizeof(int)); printf("unsigned int : %d byte\n",sizeof(unsigned int)); printf("long int : %d byte\n",sizeof(long int)); printf("unsigned long int : %d byte\n",sizeof(unsigned long int)); printf("long long int : %d byte\n",sizeof(long long int)); printf("float : %d byte\n",sizeof(float)); prin..

    C++ 컴파일과정 [링킹, 컴파일, 라이브러리, 오브젝트]

    라이브러리(library)는 다른 프로그램들과 링크되기 위하여 존재하는, 하나 이상의 서브루틴(subroutine)이나 함수(function)들의 집합 파일 말하는데 함께 링크(link)될 수 있도록 보통 컴파일된 형태인 목적코드(object code) 형태로 존재한다. 라이브러리는 코드 재사용을 위해 조직화된 오래된 기법 중의 하나이며, 많은 다른 프로그램들에서 사용할 수 있도록, 운영체계나 소프트웨어 개발 환경 제공자들에 의해 제공되는 경우가 많다. 보통은 목적코드형태를 하나의 파일로 묶어 사용한다. 라이브러리가 생긴이유 1. 코드의 재사용 2. 코드의 부품화 실현 3. 소스를 제공하지 않아 기술 유출 방지 4. 사용자의 개발시간 단축 등의 이유가 있다. 프로그램 빌드 과정 - 컴파일 과정 링킹은 프..

    [C#] 8.0 새로운 기능

    1. 디폴트 인터페이스 멤버(Default Inteface Members) 이전 버전에서는 인터페이스를 한번 배포한 후 수정하면, 기존에 구현된 모든 타입들을 수정하지 않는 한 타입 오류를 발생시켰다. 더구나 그 인터페이스를 외부에서 사용한다면, 수정은 거의 불가능하였다. C# 8.0에서는 인터페이스에 새로운 멤버를 추가하고 새로운 멤버의 Body 구현 부분을 추가할 수 있게 되었다. 이렇게 새로 추가된 인터페이스 멤버는 디폴트로 사용되기 때문에 기존 구현된 타입들이 새 멤버를 추가적으로 구현되지 않을 경우 이 디폴트 구현을 사용하게 된다. 새로 구현하는 클래스는 디폴트 멤버 구현을 사용하지 않고 재정의할 수 있다. 인터페이스의 디폴트 멤버 구현을 액세스 하기 위해서는 인터페이스로 캐스팅된 변수를 사용해..

    [C#] 9.0 새로운 기능

    C# 9.0 추가된 기능들 최상위 프로그램(Top-Level Programs) init accessor record Type 향상된 패턴 매칭(Pattern matching) 최상위 프로그램 (Top-Level Programs) 1. 정의 C# 프로그램은 Main() 정적 메서드에서부터 프로그램 시작하며, C# 프로젝트 생성하면 항상 이 Main() 메서드를 자동으로 생성한다. 프로그래밍에서 이를 보통 엔트리 포인트(Entry point) 라 부른다. 프로그래밍을 처음 시작하면 Main() 엔트리 포인트 부분의 이해가 어렵기 때문에 C# 9.0에서 이러한 제약을 없애고 바로 C# 문장을 사용할 수 있는 기능을 제공한다. 이를 최상위 프로그램(Top-Level Program) 이라 부른다. 2. 사용 예제..

    [C++] 문자열 (string) 함수 모음

    length() 메소드와 size() 메소드 length() 메소드는 문자열의 길이를 반환하는 메소드다. size() 메소드도 length() 메소드와 언제나 같은 값을 반환하지만, 그 의미는 약간 다르다. length() 메소드는 문자열의 길이를 나타내지만, size() 메소드는 해당 string 객체가 메모리에서 실제 사용하고 있는 크기를 나타낸다. string str1; string str2 = "C++ Programming"; cout

    [C] 복합 대입 / 증감 연산자

    복합 대입 연산자와 증감 연산자는 연산식을 간단하게 표현할 수 있는 특별한 연산자다. #include int main () { int a = 3, b = 2; printf ( "%d %d \n", ++a, b–); a + 1; b -= 1; printf ( "%d %d \n", a, b); } 4행에서 정수형 변수 a와 b를 선언하고, 각각 3과 2로 초기화한다. 5행에서 a의 값을 1만큼 증가시키는 연산자 ‘++’에 의해 a의 값이 4가 된다. 그러나 b의 값을 1만큼 감소시키는 연산자’–‘는 다음 번 b의 값을 이용할 때까지 연산을 보류시킨다. 6행에서 ‘a+=1’은 a값을 1만큼 증가시키는 ‘a=a+1’을 줄인 표현이며, ‘b-=1’도 b 값을 1만큼 감소시키는 ‘b=b-1’을 줄인 표현이다. 따라..

    [C++] Buffer Overflow (버퍼 오버플로우) 예시

    String Buffer Overflow 20byte의 buf를 할당하고 std::cin 함수를 통해 문자열을 입력받는다. 하지만 여기서도 입력한 문자열의 길이를 검사하는 부분이 없어서 20byte 이상의 문자열을 입력한다면 버퍼오버플로우가 발생할 수 있다. #include using namespace std; int main() { char buf[20]; cin >> buf; // string 제외 입력에 따라 자동 할당됨. } Container Overflow f 함수 부분이다. vector v를 src 매개변수로 받는다. std::vector dest(5) 7행에서 기본값(0)으로 초기화 된 5개의 원소를 가지는 vector dest를 생성한다. std::copy(src.begin(), src.e..

    [C] 버퍼 오버플로 (buffer overflow)

    프로그램이 데이터를 버퍼(buffer)에 저장할 때, 버퍼가 가득 차 넘치게 되어 프로그래머가 지정한 부분 바깥에 덮어 씌워버리는 취약점, 버그, 이를 이용한 공격 방법을 말한다. 넘쳐난 데이터는 원래 데이터를 밀어내거나 이상한 곳에 저장하는 것이 아니라 덮어 씌우는 것이다. 덮어 씌워진 메모리에는 다른 데이터가 이미 포함되어 있을 수 있고, 이 때문에 메모리 접근 오류, 프로그램 종료, 시스템 보안 취약점 등이 발생할 수 있다. 버퍼 오버플로는 보통 데이터를 저장하는 과정에서 그 데이터를 저장할 메모리 위치가 유효한지를 검사하지 않아 발생한다. 이러한 경우 데이터가 담긴 위치 근처에 있는 값이 손상되고 그 손상이 프로그램 실행에 영향을 미칠 수도 있다. 특히, 악의적인 공격으로 인해 프로그램에 취약점이..

    [C++] 디버그 모드에서 변수의 메모리 차지 공간

    int64의 크기는 8바이트이고 로컬변수 선언시 스택 메모리에 8바이트씩 차지하게 된다. 8바이트 크기의 변수 3개를 선언 후 메모리 주소를 확인해보자. int64 n1 = 1; int64 n2 = 2; int64 n3 = 3; cout

    [C/C++] 메모리 오류에 대하여

    1. C/C++에서 메모리 오류의 종류 일단 메모리 공간에 따라 크게 Heap Memory 에러와 Stack (local variables) Memory 에러가 있다. Heap 메모리 영역에서 발생가능한 에러는 이미 해제된 메모리 다시 해제 할때 할당된적도 없는 메모리 해제 할라고 할때 이미 해제된 메모리 영역에 뭔가 데이터를 쓰려고 할때 할당된 적이 없는 메모리에 뭔가 데이터를 쓰려고 할때 메모리 할당 에러 동적으로 할당된 메모리 배열에서 초과된 index의 위치를 읽거나 쓰려고 할때 1,2 번과 3,4번을 묶어서 볼 수 있는데 해제시에 발생하는 문제 vs 데이터 입력시 발생하는 문제로 볼 수 있다. 스택 메모리 영역에서 발생가능한 에러들로는 정적 배열에서 초과된 index의 위치를 읽거나 쓰려고 할때..