클라우스 이글베르거(Klaus Iglberger)는 짧은 C++ 코드가 의도대로 작동하더라도 안전하다고 확신하기는 어렵다고 주장한다. 팰린드롬 판별 예제를 통해 코딩 관행 위반과 경계 조건, 메모리 안전성 문제를 살펴보고, 다음 편에서 현대 C++ 방식의 대안을 다루겠다고 예고했다.
이 글은 2025년 10월 6일 ALS로 세상을 떠난 레이너 그림(Rainer Grimm)을 기리는 블로그 연재의 첫 편이다. 이글베르거와 마테우시 푸시(Mateusz Pusz), 옌스 웰러(Jens Weller), 슬로보단 드미트로비치(Slobodan Dmitrović), 이반 추키치(Ivan Čukić)가 그림의 C++ 블로그를 이어간다. 글쓴이는 각자의 관심사와 문체에 따라 내용은 달라지겠지만, 품질과 통찰을 중시한 그림의 방향을 잇겠다고 밝혔다.
글은 C++이 메모리 안전 언어가 아니라는 점을 출발점으로 삼는다. 미국 국가안보국(NSA)은 2022년 안전·보안 관련 소프트웨어에 C나 C++를 사용하지 말라고 권고했고, 유럽연합의 사이버 복원력 법안(Cyber Resilience Act)도 메모리 안전성이 없는 언어를 피하라는 취지의 권고를 담았다고 설명한다. 법안 자료는 2021년까지 사이버 범죄로 인한 전 세계 연간 비용을 5조 5천억 유로로 추산한다. 이글베르거는 C++에 대한 비판이 과장되거나 잘못 전달된 부분이 있을 수 있지만, 그 근거가 되는 문제 자체를 부정하기보다 어디서 비롯되는지와 대응 방법을 살펴보는 편이 낫다고 말한다.
예시로 제시한 팰린드롬 판별 코드는 std 네임스페이스를 using 지시문으로 가져오고, main() 안에 로직을 두며, 바뀌지 않는 변수에 const를 붙이지 않는다. 이글베르거는 한 선언문에서 여러 변수를 선언한 점, int 변수에 Pointer라는 이름을 붙인 점, 문자열 인덱싱에 경계 검사를 하지 않는 operator[]를 쓴 점도 지적한다. size-1 계산은 이 코드에서 int를 사용했기 때문에 작동하지만, 일반화한 함수에서는 별도 처리가 필요하다고 덧붙인다. 사용하지 않는 후위 증가 연산자도 코어 가이드라인에 어긋난다고 설명한다.
첫 예시를 고친다며 제시한 함수는 다음과 같다.
bool is_palindrome( std::string_view str )
{
if( str.empty() )
return true;
auto begin{ str.begin() };
auto end { str.end() };
--end; // We know the string is not empty, so we can decrement
while( begin<=end ) {
if( *begin != *end ) {
return false;
}
++begin;
--end;
}
return true;
}
int main()
{
std::string const str{ "nitin" };
if( is_palindrome(str) )
std::cout << "palindrome\n";
else
std::cout << "not palindrome\n";
return 0;
}
이글베르거는 이 코드도 몇 줄만 보고 안전성이나 보안 문제가 전혀 없다고 100% 확신하기 어렵다고 말한다. 모든 특수 사례를 처리하는지, 무한 반복이나 유효하지 않은 메모리 접근, 정의되지 않은 동작이 생기지 않는지 따져보려면 더 많은 검토 시간이 필요할 수 있다는 것이다. 따라서 단순히 작동하는지를 넘어 세부 사항을 충분히 확신할 수 있는 코드인지가 중요하다고 주장한다. 그는 이 예시를 현대 C++라기보다 고전적인 C++에 가깝다고 평가하며, 다음 편에서 더 짧고 단순하다고 보는 현대 C++ 해법을 설명할 예정이다.
참고 자료:
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요