C++에서 환경 변수 가져 오기

Jinku Hu 2023년10월12일
  1. std::getenv 함수를 사용하여 C++에서 환경 변수에 액세스
  2. 사용자 지정 검사 루틴을 사용하여 유효한 환경 변수 값 확인
C++에서 환경 변수 가져 오기

이 기사에서는 C++에서 환경 변수를 얻는 방법에 대한 몇 가지 방법을 설명합니다.

std::getenv 함수를 사용하여 C++에서 환경 변수에 액세스

getenv는 C 표준 라이브러리에 구현 된 POSIX 호환 함수로<cstdlib>헤더를 사용하여 C++ 소스 파일로 가져올 수 있습니다. 이 함수는 문자열을 유일한 인수로 사용하고 동일한 환경 변수 이름을 검색합니다.

환경 변수는 일반적으로 모두 대문자로 표시되지만getenv는 프로그램 환경에서 정의되어 있어도 변수 이름과 일치하지 않으므로 인수 문자열에 소문자가 없어야합니다. 이 함수는 해당 변수 값이 저장된 char *유형을 반환합니다.

프로그램이 해당 위치를 수정하지 않도록해야하기 때문에getenv의 반환 값을const char *변수에 할당합니다. 그렇지 않으면 정의되지 않은 동작이 발생합니다.

#include <cstdlib>
#include <iostream>
#include <string>

using std::cerr;
using std::cout;
using std::endl;
using std::getenv;
using std::string;

const char *ENV_VAR = "HOME";

int main() {
  const char *tmp = getenv("HOME");
  string env_var(tmp ? tmp : "");
  if (env_var.empty()) {
    cerr << "[ERROR] No such variable found!" << endl;
    exit(EXIT_FAILURE);
  }

  cout << "HOME : " << env_var << endl;

  exit(EXIT_SUCCESS);
}

출력:

HOME : /home/username

또한 getenv함수에서 반환 된 값을 std::string생성자에 직접 전달하지 않는 것이 중요합니다. getenv함수가 환경 변수를 계산하는 데 실패하면 분할 오류가 발생할 수 있기 때문입니다.

이 문제는 내부에서 ‘std::char_traits::length()‘함수를 호출하는 ‘std::string’생성자 코드 구현 내에서 발생합니다. 후자의 함수는nullptr이 인수로 전달되면 정의되지 않은 동작을 유발합니다. 따라서 환경 변수가 발견되지 않을 때getenvnullptr을 반환 할 수있는 시나리오가 있으며string 생성자에 전달하면 잘못된 코드가 형성됩니다.

#include <cstdlib>
#include <iostream>
#include <string>

using std::cerr;
using std::cout;
using std::endl;
using std::getenv;
using std::string;

const char *ENV_VAR = "HOME";

int main() {
  // Erroneous
  string env_var(getenv("HOME"));
  if (env_var.empty()) {
    cerr << "[ERROR] No such variable found!" << endl;
    exit(EXIT_FAILURE);
  }

  cout << "HOME : " << env_var << endl;

  exit(EXIT_SUCCESS);
}

사용자 지정 검사 루틴을 사용하여 유효한 환경 변수 값 확인

환경 변수에 액세스 할 때 가장 위험한 함정 중 하나는 검색된 값을 확인하는 것입니다. 이러한 변수는 우리 프로그램의 범위 밖에서 공격자에 의해 조작 될 수 있습니다. 따라서 정확하고 안전한 프로그램 실행을 보장하기 위해 이러한 값을 추가로 삭제해야합니다.

이러한 검사 루틴은 대부분 프로그램에 따라 다르며 각 경우에 대해 다르게 처리해야합니다. 다음 예제에서는 문자열 값에 공백이 없어야한다고 가정하고 첫 번째 공백 문자 앞에있는 부분 문자열을 추출하는 시나리오를 보여줍니다. 이러한 방식으로 시스템 환경에서 불규칙한 입력 값을 피합니다. std::find 알고리즘은string에서 문자를 검색하는 데 사용되며 지정된char이 없으면string::npos를 반환합니다.

#include <algorithm>
#include <cstdlib>
#include <iostream>
#include <string>

using std::cerr;
using std::cout;
using std::endl;
using std::find;
using std::getenv;
using std::string;

const char *ENV_VAR = "HOME";

int main() {
  const char *tmp = getenv(ENV_VAR);
  string env_var(tmp ? tmp : "");
  if (env_var.empty()) {
    cerr << "[ERROR] No such variable found!" << endl;
    exit(EXIT_FAILURE);
  }

  // Env Variable Value Sanitization
  int pos = env_var.find(' ');
  if (pos != string::npos) env_var = env_var.substr(0, pos);

  cout << "HOME : " << env_var << endl;

  exit(EXIT_SUCCESS);
}
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook