Czy można pisać do argv?

0

Jest definicja:

int
main(
  int argc
, char *argv[]
){  return 0;
}

Czy mogę w funkcji main zmieniać znaki tekstów zawartych w tablicy argv?

2

Argumenty są święte. Skopiuj i tam sobie zmieniaj do woli.

BTW skąd taka brzydka konwencja pisania?

6

C11 standard draft N1570, §5.1.2.2.1/2:

The parameters argc and argv and the strings pointed to by the argv array shall be modifiable by the program, and retain their last-stored values between program startup and program termination.

Więc odpowiedź brzmi tak. Możesz.

0

Formalnie możesz. Ale dlaczego chciałbyś to robić?

0
kq napisał(a):

Formalnie możesz. Ale dlaczego chciałbyś to robić?

Potrzebowałem podzelić argument na dwie części przy pomocy znaku '\0'. Ale i tak ostatecznie skopiowałem go.

2

Ciekawostka: można to wykorzystać do leakowania informacji, bo stackprotector w komunikacie błędu ma coś takiego:

*** stack smashing detected ***: ./a.out terminated
Aborted (core dumped)

Jak nadpiszemy argv[0] to ten komunikat będzie zawierał to co na nadpisaliśmy! Patrz np. https://nandynarwhals.org/32c3-readme/

1 użytkowników online, w tym zalogowanych: 0, gości: 1