Umgebungsvariable in C++ abrufen
-
Verwenden Sie die Funktion
std::getenv
, um auf die Umgebungsvariable in C++ zuzugreifen - Verwenden Sie eigene Prüfroutinen, um die gültigen Werte der Umgebungsvariablen zu überprüfen
![Umgebungsvariable in C++ abrufen](/img/Cpp/feature-image---cpp-get-environment-variables.webp)
In diesem Artikel werden verschiedene Methoden erläutert, wie man die Umgebungsvariable in C++ abrufen kann.
Verwenden Sie die Funktion std::getenv
, um auf die Umgebungsvariable in C++ zuzugreifen
getenv
ist eine POSIX-konforme Funktion, die in der C-Standardbibliothek implementiert ist und mit dem Header <cstdlib>
in die C++-Quelldatei importiert werden kann. Die Funktion nimmt die Zeichenkette als einziges Argument und sucht nach dem Namen der Umgebungsvariablen, der gleich ist.
Umgebungsvariablen werden konventionell mit allen Großbuchstaben dargestellt, aber getenv
verlangt dennoch, dass die Argumentzeichenkette keine Kleinbuchstaben enthält, da sie nicht mit dem Variablennamen übereinstimmen würde, selbst wenn dieser in der Programmumgebung definiert ist. Die Funktion gibt den Typ char*
zurück, in dem der entsprechende Variablenwert gespeichert ist.
Beachten Sie, dass wir den Rückgabewert von getenv
der Variablen const char*
zuweisen, weil wir sicherstellen müssen, dass das Programm diesen Speicherort nicht verändert; andernfalls würde dies zu undefiniertem Verhalten führen.
#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);
}
Ausgabe:
HOME : /home/username
Es ist auch wichtig, den von der Funktion getenv
zurückgegebenen Wert nicht direkt an den Konstruktor std::string
zu übergeben, da dieser einen Segmentierungsfehler auslösen könnte, wenn die Funktion getenv
keine Umgebungsvariable berechnen kann.
Dieses Problem wird hier in der Implementierung des std::string
-Konstruktorcodes verursacht, der unter der Haube die Funktion std::char_traits::length()
aufruft. Die letztgenannte Funktion verursacht undefiniertes Verhalten, wenn ihr nullptr
als Argument übergeben wird. So gibt es das Szenario, dass getenv
nullptr
zurückgeben kann, wenn die Umgebungsvariable nicht gefunden wird, und wenn wir sie an den Konstruktor von string
übergeben, entsteht der fehlerhafte Code.
#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);
}
Verwenden Sie eigene Prüfroutinen, um die gültigen Werte der Umgebungsvariablen zu überprüfen
Einer der gefährlichsten Fallstricke beim Zugriff auf die Umgebungsvariablen ist die Überprüfung des abgerufenen Wertes. Beachten Sie, dass diese Variablen vom Angreifer außerhalb des Bereichs unseres Programms manipuliert werden können. Daher müssen diese Werte zusätzlich sanitisiert werden, um eine korrekte und sichere Programmausführung zu gewährleisten.
Diese Prüfroutinen sind meist programmabhängig und sollten für jeden Fall unterschiedlich gehandhabt werden. Im folgenden Beispiel demonstrieren wir das Szenario, bei dem wir davon ausgehen, dass der String-Wert keine Leerzeichen enthalten darf, und falls doch, extrahieren wir den Teilstring vor dem ersten Leerzeichen. Auf diese Weise entgehen wir allen unregelmäßigen Eingabewerten aus der Systemumgebung. Beachten Sie, dass der Algorithmus std::find
verwendet wird, um nach einem Zeichen in der Zeichenkette zu suchen, und dass er string::npos
zurückgibt, wenn das angegebene Zeichen nicht gefunden wird.
#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