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
이 인수로 전달되면 정의되지 않은 동작을 유발합니다. 따라서 환경 변수가 발견되지 않을 때getenv
가nullptr
을 반환 할 수있는 시나리오가 있으며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);
}
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