Top

Effective C [전문적인 C 프로그래밍 입문서]

  • 원서명Effective C: An Introduction to Professional C Programming (ISBN 9781718501041)
  • 지은이로버트 C. 시코드(Robert C. Seacord)
  • 옮긴이박정재, 장준원, 장기식
  • ISBN : 9791161757599
  • 33,000원
  • 2023년 06월 30일 펴냄
  • 페이퍼백 | 356쪽 | 188*235mm
  • 시리즈 : 프로그래밍 언어

책 소개

요약

시간이 지나도 변하지 않고 컴퓨팅 세계의 기반을 강화하는 데 도움이 되는 전문적이고 안전하며 이식 가능한 C 코드를 작성하는 방법을 저자의 경험을 바탕으로 설명한다. C와 C 표준 라이브러리를 사용하는 모범 사례와 사용 중에 발생할 수 있는 일반적인 오류 등을 설명한다. C 프로그램을 디버깅하고 테스트하고 분석하는 방법도 소개한다.

추천의 글

Effective C는 여러분에게 현대 시대를 위한 C 프로그래밍을 가르쳐 줄 것이다. 이 책은 여러분이 자발적이든 과실이든 정의되지 않은 동작을 사용하지 않도록 좋은 습관을 들이는 데 도움이 될 것이다. 대형 C 프로그램에서 일반적인 프로그래밍 오류만 없애는 것만으로는 임의의 입력으로 인해 발생하는 정의되지 않은 동작을 막을 수는 없다고 독자들에게 경고한다.
이 책이 강조하는 C 프로그래밍의 보안 측면은 타의 추종을 불허한다. 내 개인적인 권고사항은 책을 읽은 후 여러분이 작성하는 C 프로그램에서 정의되지 않은 동작을 막기 위해 이 책에서 알려주는 도구를 모두 활용해야 한다는 것이다.
—파스칼 쿠오크(Pascal Cuoq),
TrustInSoft, 수석 과학자

오늘날 우리는 여전히 보안성 높고 전문적인 C를 작성하는 데 있어 수많은 도전에 직면해 있다. 컴파일러 및 시스템 수준의 완화에 대한 많은 혁신이 정기적으로 훼손될 수 있으며 실제로 그래왔다. 그리고 다른 현대 언어가 진보적인 혁신을 보이는 동안에도 특히 IoT 등 고도의 자원 제한적인 환경에서 C의 수요는 여전히 증가하고 있다.
로버트는 C에서 전문적이며 보안성 높게 프로그래밍하는 방법에 관한 권위자다. 10년 넘게 고객과 팀 내부의 모두에게 그의 자료를 추천해왔다. 전문적으로 그리고 무엇보다도 안전한 방식으로 C를 코딩하는 방법을 가르치는 데 있어 더 좋은 사람은 없다.
오늘날 전문적인 C를 작성한다는 것은 곧 우수하고 안전하며 보안성 높은 코드 작성을 의미한다. 이렇게 하면 기술적으로 신세를 지지 않고도 연결된 사회에 기여할 수 있다.
이 책은 C 경험이 거의 혹은 전혀 없는 사람들이 전문 C 프로그래머가 될 수 있도록 지식과 기법을 빠르게 개발하게 도와주며 우수하고 안전한 동시에 보안성 있는 시스템 개발에 크게 이바지할 것이다.
—올리 화이트하우스(Ollie Whitehouse), Global CTO, NCC Group

이 책에서 다루는 내용

◆ C 프로그램에서 정의되지 않은 동작을 식별하고 처리하는 방법
◆ 정수 및 부동 소수점 값의 범위 및 표현
◆ 동적 메모리 할당이 작동하는 방법과 비표준 함수를 사용하는 방법
◆ 문자 인코딩 및 형식을 사용하는 방법
◆ C 표준 스트림 및 POSIX 파일 설명자를 사용해 터미널과 파일 시스템에서 I/O를 수행하는 방법
◆ C 컴파일러의 변환 단계와 전처리기의 역할을 이해하는 방법
◆ C 프로그램을 테스트하고 디버그하며 분석하는 방법

이 책의 대상 독자

C 언어에 대한 입문서로 C 프로그래밍을 배우고자 하는 모든 사람이 쉽게 이해할 수 있도록 작성했다. 즉, 다른 많은 입문서와 강좌처럼 C 프로그래밍을 지나치게 단순화하지 않았다.

이 책의 구성

1장, ‘C로 시작하기’에서는 main 함수 사용에 익숙해지도록 간단한 C 프로그램을 작성한다. 또한 편집기와 컴파일러에 대한 몇 가지 옵션을 살펴본다.
2장, ‘개체와 함수, 형식’에서는 변수와 함수를 선언하는 것과 같은 기본적인 내용을 알아본다. 또한 기본 형식을 사용하는 원칙도 소개한다.
3장, ‘산술 형식’에서는 두 종류의 산술 형식인 정수 형식과 부동 소수점 형식에 관해 알아본다.
4장, ‘식과 연산자’에서는 연산자와 다양한 개체 형식에 대한 연산을 수행하기 위해 간단한 식을 작성하는 방법을 소개한다.
5장, ‘흐름 제어’에서는 각 문(statement)이 평가되는 순서를 제어하는 방법을 알아본다. 먼저 수행할 작업을 정의하는 표현문(expression statements)과 복합문(compound statements)을 알아본다. 그런 다음 실행할 코드 블록을 결정하는 선택(selection)과 반복(iteration), 점프(jump) 세 종류의 문을 살펴본다.
6장, ‘동적으로 할당된 메모리’에서는 런타임에 힙(heap)에서 할당되는 동적으로 할당된 메모리(dynamically allocated memory)에 관해 알아본다. 동적으로 할당된 메모리는 런타임 전에 프로그램에 대한 정확한 스토리지 요구 사항을 알 수 없는 경우에 유용하다.
7장, ‘문자와 문자’에서는 ASCII와 유니코드를 포함한 다양한 문자열 집합을 알아본다. C 표준 라이브러리의 레거시(legacy) 함수와 경계 확인 인터페이스(bounds-checked interfaces), 그리고 POSIX와 Windows API를 사용해 문자열을 표현하고 조작하는 방법을 살펴본다.
8장, ‘입력/출력’에서는 터미널 및 파일 시스템(filesystem)에서 데이터를 읽거나 쓰기 위해 입력/출력(입출력, Input/Output) 연산을 수행하는 방법을 알아본다. 입출력은 정보가 프로그램에 들어오고 나가는 모든 방법을 포함하며, 입출력을 하지 못하면 프로그램은 쓸모가 없다. C 표준 스트림(stream)과 POSIX 파일 설명자를 사용하는 방법을 소개한다.
9장, ‘전처리기’에서는 전처리기를 사용해 파일을 포함하고, 개체 같은 매크로와 함수 같은 매크로를 정의하고, 구현체에 정의된 기능에 따라 코드를 조건부로 포함하는 방법을 알아본다.
10장, ‘프로그램 구조’에서는 프로그램을 소스 파일과 포함(include) 파일로 구성된 여러 변환 단위로 구조화하는 방법을 알아본다. 또한 여러 개체 파일을 함께 연결해 라이브러리와 실행 파일을 만드는 방법도 살펴본다.
11장, ‘디버깅과 테스트, 분석’에서는 컴파일 타임과 런타임 어설션(assertion), 디버깅, 테스트, 정적 분석 그리고 동적 분석을 포함해 정확하고 효과적이며 안전하고 보안성을 제공하며 강건한 프로그램을 만드는데 필요한 도구와 기술을 설명한다. 또한 소프트웨어 개발 프로세스의 여러 단계에서 사용할 수 있는 컴파일러 플래그에 대해서도 알아본다.

저자/역자 소개

지은이 소개

로버트 C. 시코드(Robert C. Seacord)

NCC 그룹의 기술 이사로 C, C++ 및 다른 언어의 시큐어 코딩을 개발하고 가르친다. C 프로그래밍 언어의 국제 표준화 작업 그룹인 ISO/IEC JTC1/SC22/WG14의 전문가이기도 하다. 또한, 『CERT C 프로그래밍 2/e』(에이콘출판, 2022)와 『C & C++ 시큐어 코딩』(에이콘출판, 2015), 『자바 시큐어 코딩 가이드라인』(인피니티북스, 2017) 등의 다른 책도 저술했다. 소프트웨어 보안과 구성 요소 기반 소프트웨어 엔지니어링, 웹 기반 시스템 설계, 레거시 시스템 현대화, 구성 요소 저장소 및 검색 엔진 그리고 사용자 인터페이스 설계 및 개발에 관한 50편 이상의 논문도 발표했다.

옮긴이의 말

사이버 보안 관련 일을 하기 시작하면서 C 언어로 작성된 코드에서 사소한 오류로 인해 큰 보안 사고가 발생하는 것을 직접 목격했습니다. 이로 인해 시큐어 코딩이라는 개념을 접하게 됐고, 이제는 시큐어 코딩을 코드 작성 초기부터 적용하는 것이 기본이 됐습니다.
이 책은 다른 C 언어 프로그래밍 입문서와는 다릅니다. 표준 C 언어 문법부터 시큐어 코딩에 필요한 디버깅, 정적 분석 및 동적 분석에 이르기까지 폭넓은 내용을 담고 있습니다. 그래서 초보자에게는 다소 어려울 수 있는데, 특히 안전한 코드 작성에 필요한 취약점에 관한 내용이 나오고, 버그가 발생할 수 있는 코드의 예와 이를 해결할 방법까지도 제시합니다.
C 언어의 기본 문법을 어느 정도 알고 있는 독자라면 책 뒷부분에 나오는 메모리 할당과 입출력, 프로그램 구조, 디버깅, 단위 테스트 그리고 정적 분석 및 동적 분석의 내용을 꼼꼼하게 익히길 바랍니다. 전부 시큐어 코딩에 필요한 요소입니다.
저자는 성능이 우수하면서도 안전하며 보안성을 갖춘 코드를 작성하는 것을 강조합니다. C 프로그램에서 정의되지 않은 동작이 발생하는 것을 막을 수 있도록 저자가 소개하는 모든 방법과 도구를 활용해 시큐어 코딩을 익힐 수 있길 바랍니다.

옮긴이 소개

박정재

경찰대학교 행정학과를 졸업하고, 서강대학교 정보통신대학원에서 블록체인 전공으로 공학석사 학위를 받았다. 경찰청 보안 사이버수사대에서 첩보수집·분석 업무, 서울경찰청 사이버수사대에서 디지털포렌식팀장으로 근무했다.
현재 법무법인 율촌 전문위원으로 기업 내부조사, 디지털 증거분석, 블록체인 자문 등 IT 분야 조사업무를 담당하고 있다.

장기식

경희대학교에서 대수학을 전공했으며, 고려대학교 정보보호대학원에서 박사학위를 취득했다. 이후 약 10년간 경찰청 사이버안전국 디지털포렌식센터에서 디지털포렌식 업무를 담당했다. 경찰대학 치안정책연구소에서 데이터 분석을 접한 이후 데이터 분석을 기반으로 한 머신러닝 기술을 연구했으며, 이 경험을 바탕으로 현재 쏘마(SOMMA)에서 고도화된 보안 위협 대응을 위한 사이버 위협 헌팅 플랫폼 MONSTER와 APT 공격 시뮬레이터 CHEIRON 개발 및 연구를 책임지고 있다. 번역서로는 『보안을 위한 효율적인 방법 PKI』(인포북, 2003)와 『EnCase 컴퓨터 포렌식』(에이콘, 2015), 『인텔리전스 기반 사고 대응』(에이콘, 2019), 『적대적 머신러닝』(에이콘, 2020), 『사이버 보안을 위한 머신러닝 쿡북』(에이콘, 2021), 『양자 암호 시스템의 시작』(에이콘, 2021), 『스크래치로 배워보자! 머신러닝』(에이콘, 2022), 『Pandas를 이용한 데이터 분석 실습 2/e』(에이콘, 2022)이 있다.

장준원

경찰대학(18기) 법학과를 졸업하고, 서울영등포경찰서 수사과 조사반장으로 공직생활을 시작해, 서울지방경찰청 수사과 사이버범죄수사대 수사팀장과 디지털포렌식팀장, 외사과 국제범죄수사대 기획팀장, 경찰수사연수원 사이버범죄수사학교 교수 및 학과장, 그리고 경찰청 국가수사본부 사이버테러수사팀장 등으로 근무한 후, 20여년간 몸담았던 경찰을 떠나 2021년에 법무법인(유) 화우에 합류해 디지털포렌식 전문위원으로 사이버범죄 수사 및 디지털포렌식 분석 사건에 대한 기술 지원 및 자문업무를 수행하고 있다.
현재 세계 최고의 사이버범죄 수사 및 디지털포렌식 전문가이자 경력자로 경찰청 디지털포렌식 자문단, 감사원 감사연구원 자문위원, 한국디지털포렌식학회 이사 등을 역임하고, SBS 『그것이 알고 싶다』와 YouTube 꼼짝마TV 등 다양한 방송 및 인터뷰에 출연하는 등 활발하게 대외적으로도 활동하고 있다.

목차

목차
  • 1장. C 시작하기
    • 첫 번째 C 프로그램 개발하기
      • 프로그램 컴파일 및 실행
      • 전처리기 지시문
      • main 함수
      • 함수 반환 값 확인
      • 출력 형식
    • 편집기 및 통합 개발 환경
    • 컴파일러
      • GNU 컴파일러 모음
      • Clang
      • 마이크로소프트 Visual Studio
    • 이식성
      • 구현 정의 동작
      • 미지정 동작
      • 미정의 동작
      • 로케일 별 동작 및 공통 확장
    • 요약

  • 2장. 개체와 함수, 형식
    • 개체와 함수, 형식, 그리고 포인터
    • 변수 선언
      • 값 바꾸기 (첫 번째 시도)
      • 값 바꾸기 (두 번째 시도)
    • 범위
    • 스토리지 기간
    • 맞춤
    • 개체 형식
      • 부울 형식
      • 문자 형식
      • 숫자 형식
      • void 형식
    • 함수 형식
    • 파생된 형식
      • 포인터 형식
      • 배열
      • 구조체
      • 공용체
    • 태그
    • 형식 한정자
      • const
      • volatile
      • restrict
    • 연습 문제
    • 요약

  • 3장. 산술 형식
    • 정수
      • 패딩과 정밀도
      • <limits.h> 헤더 파일
      • 정수 선언하기
      • 부호가 없는 정수
      • 부호가 있는 정수
      • 정수 상수
    • 부동 소수점
      • 부동 소수점 형식
      • 부동 소수점 산술
      • 부동 소수점 값
      • 부동 소수점 상수
    • 산술 변환
      • 정수 변환 순위
      • 정수 확장
      • 일반 산술 변환
      • 암시적 변환의 예
      • 안전한 변환
    • 요약

  • 4장. 식과 연산자
    • 단순 할당
    • 평가
    • 함수 호출
    • 증가 및 감소 연산자
    • 연산자 우선순위 및 결합성
    • 평가 순서
      • 비순차적 평가와 규정되지 않은 순차적 평가
      • 시퀀스 포인트
    • sizeof 연산자
    • 산술 연산자
      • 단항 연산자 +와 -
      • 논리 부정 연산자
      • 곱하기 연산자
      • 더하기 연산자
    • 비트 연산자
      • 보수 연산자
      • 시프트 연산자
      • 비트 AND 연산자
      • 비트 배타적 OR 연산자
      • 비트 포괄적 OR 연산자
    • 논리 연산자
    • 캐스트 연산자
    • 조건부 연산자
    • _Alignof 연산자
    • 관계형 연산자
    • 복합 할당 연산자
    • 쉼표 연산자
    • 포인터 산술
    • 요약

  • 5장. 흐름 제어
    • 식 문
    • 복합 문
    • 선택 문
      • if 문
      • switch 문
    • 반복문
      • while 문
      • do...while
      • for 문
    • 점프 문
      • goto 문
      • continue 문
      • break 문
      • return 문
    • 연습 문제
    • 요약

  • 6장. 동적으로 할당된 메모리
    • 스토리지 기간
      • 힙과 메모리 관리자
      • 동적으로 할당된 메모리를 사용하는 경우
    • 메모리 관리 함수
      • malloc 함수
      • aligned_alloc 함수
      • calloc 함수
      • realloc 함수
      • reallocarray 함수
      • free 함수
    • 메모리 상태
    • 유연한 배열 멤버
    • 동적으로 할당된 다른 스토리지
      • alloca 함수
      • 가변 길이 배열
    • 할당된 스토리지 문제 디버깅하기
      • Dmalloc
      • 안전이 중요한 시스템
    • 연습 문제
    • 요약

  • 7장. 문자와 문자열
    • 문자
      • ASCII
      • 유니코드
      • 소스 및 실행 문자 집합
      • 데이터 형식
      • 문자 상수
      • 이스케이프 문자
      • Linux
      • Windows
      • 문자 변환
    • 문자열
      • 문자열 리터럴
    • 문자열 처리 함수
      • <string.h>와 <wchar.h>
      • 부속서 K 경계 검사 인터페이스
      • POSIX
      • Microsoft
    • 요약

  • 8장. 입출력
    • 표준 입출력 스트림
      • 스트림 버퍼링
      • 미리 정의된 스트림
      • 스트림 방향
      • 텍스트 및 이진 스트림
    • 파일 열기 및 만들기
      • fopen 함수
      • POSIX open 함수
    • 파일 닫기
      • fclose 함수
      • POSIX close 함수
    • 문자와 줄을 읽고 쓰기
    • 스트림 플러싱
    • 파일에서 위치 설정하기
    • 파일 삭제하기 및 이름 바꾸기
    • 임시 파일 사용하기
    • 형식이 있는 텍스트 스트림 읽기
    • 이진 스트림에서 읽기 및 쓰기
    • 요약

  • 9장. 전처리기
    • 컴파일 과정
    • 파일 포함
      • 따옴표 및 홑화살괄호 포함 문자열
    • 조건부 포함
      • 오류 만들기
      • 헤더 보호기 사용하기
    • 매크로 정의
      • 매크로 대체
      • 형식 제네릭 매크로
      • 미리 정의된 매크로
    • 요약

  • 10장. 프로그램 구조
    • 구성 요소화의 원칙
      • 결합도와 응집도
      • 코드 재사용
      • 데이터 추상화
      • 불투명 형식
    • 실행 파일
    • 링크
    • 간단한 프로그램 구조화하기
    • 코드 빌드하기
    • 요약

  • 11장. 디버깅과 테스트, 분석
    • 어설션
      • 정적 어설션
      • 런타임 어설션
    • 컴파일러 설정 및 플래그
      • GCC 및 Clang
      • Visual C++
    • 디버깅
    • 단위 테스트
    • 정적 분석
    • 동적 분석
      • AddressSanitizer
    • 연습 문제
    • 요약

도서 오류 신고

도서 오류 신고

에이콘출판사에 관심을 가져 주셔서 고맙습니다. 도서의 오탈자 정보를 알려주시면 다음 개정판 인쇄 시 반영하겠습니다.

오탈자 정보는 다음과 같이 입력해 주시면 됩니다.

(예시) p.100 아래에서 3행 : '몇일'동안 -> 며칠동안