Umgebungsvariable in C++ abrufen

Jinku Hu 12 Oktober 2023
  1. Verwenden Sie die Funktion std::getenv, um auf die Umgebungsvariable in C++ zuzugreifen
  2. Verwenden Sie eigene Prüfroutinen, um die gültigen Werte der Umgebungsvariablen zu überprüfen
Umgebungsvariable in C++ abrufen

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);
}
Autor: 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