Warum ist der argv-Parameter für execvp nicht konstant?

Lesezeit: 2 Minuten

execvp ist wie folgt definiert:

int execvp(const char *file, char *const argv[]);

Was die Verwendung von Code wie diesem ausschließt:

const char* argv[] = {"/bin/my", "command", "here", NULL};
execvp(argv[0], argv);

War das eine versehentliche Auslassung? Ist es sicher, dies mit const_cast zu umgehen? Oder kritzeln einige execvp-Implementierungen tatsächlich in diesen Speicher?

Benutzer-Avatar
Michael Burr

Die POSIX-Spezifikation sagt (http://pubs.opengroup.org/onlinepubs/009604499/functions/exec.html):

Das argv[] und envp[] Arrays von Zeigern und die Zeichenfolgen, auf die diese Arrays zeigen, dürfen nicht durch einen Aufruf einer der exec-Funktionen geändert werden, außer als Folge des Ersetzens des Prozessabbilds.

Ich denke, die fehlenden (oder verlegten) const ist einfach eine historische Kuriosität.

  • Das fehlende const ist keine historische Kuriosität; Vielmehr liegt es daran, dass Sie nicht von a konvertieren können char** zu einem const char* const* in C ohne Besetzung (aber du kann in C++).

    – Adam Rosenfield

    4. Mai 2012 um 21:57 Uhr

  • @Adam: stimmt. Das ist die Antwort auf die erste Frage im Beitrag. Davon habe ich Abstand genommen: c-faq.com/ansi/constmismatch.html

    – Michael Burr

    4. Mai 2012 um 22:10 Uhr

  • Siehe auch den Abschnitt BEGRÜNDUNG am Ende der POSIX-Spezifikation für exec. Es erklärt die Wahl der const Weglassung.

    – R.. GitHub HÖR AUF, EIS ZU HELFEN

    5. Mai 2012 um 2:56 Uhr

  • @AdamRosenfield Dann sollte der Standard eine separate #ifdef __cplusplus-Deklaration hinzufügen, die es dem C++-Programm ermöglicht, konstant korrekt zu sein.

    – Benutzer877329

    5. August 2013 um 12:17 Uhr

Benutzer-Avatar
Kai Salbei

Ich bin auf dieselbe Situation gestoßen. Weil execvp() eine hat char *const als zweiter Parameter, das heißt, es akzeptiert einen konstanten Zeiger auf ein Zeichen. Wenn Sie ihm also ein Zeigerzeichen übergeben, kann es das Zeigerzeichen in einen konstanten Zeiger auf ein Zeichen umwandeln. Also, anstatt es zu deklarieren

const char* argv[] = {"/bin/my", "command", "here", NULL};

Versuchen

char* argv[] = {"/bin/my", "command", "here", NULL};

und es wird akzeptieren argv[] ohne Problem.

  • Ich meinte Zeigerkonstante auf ein Zeichen. Ich ging weiter und korrigierte den Grammatikfehler.

    – Kai Salbei

    7. März 2017 um 17:45 Uhr

  • Das verschiebt nur den Fehler / die Warnung von der execvp() Zeile zur Zuweisungsanweisung (es sei denn, Sie haben einen sehr nachsichtigen Compiler).

    – Toby Speight

    7. März 2017 um 18:04 Uhr

  • Ich habe sowohl mit gcc als auch mit clang mit der Option -Wall getestet. Bei mir hat es keine Fehler zurückgegeben.

    – Kai Salbei

    7. März 2017 um 18:16 Uhr


  • Mein üblicher Befehl (gcc -Wall -Wextra -Wwrite-strings -Wno-parentheses -Wpedantic -Warray-bounds) gibt warning: initialization discards ‘const’ qualifier from pointer target type

    – Toby Speight

    1. Juni 2018 um 15:49 Uhr

1366720cookie-checkWarum ist der argv-Parameter für execvp nicht konstant?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy