++i )

strcat (text, argv[i]); strcat (text, " ");

std::cout << text << std::endl;

return 0; }

W powyższym kodzie użyto niebezpiecznego wywołania strcat() bez kontroli długości łańcucha argv[i], który może nie zmieścić się w pamięci przeznaczonej dla zmiennej text.

old$ ./plik Ala ma kota. Ala ma kota. old$ ./plik Ala w domu ma chomika, kota, rybki oraz psa. Ala w domu ma chomika, kota, rybki oraz psa. Naruszenie ochrony pamięci

Zgodnie z przewidywaniami, dane, które nie mieszczą się w pamięci dla nich przeznaczonej nadpisują adres powrotu funkcji main().

Poniżej przedstawiono drugi program w poprawionej wersji:

#include <iostream> #include <string>

using namespace std;

int main ( int argc, char **argv) { string text;

for ( int i = 1; i < argc; ++i )

text += string(argv[i]) + " ";

cout << text << endl;

return 0; }

Ta wersja nie korzysta z niebezpiecznego wywołania strcat() i używa typu string, który automatycznie zarządza swoją pamięcią.

Testowanie programu potwierdza, że błąd w nim nie występuje:

new$ ./plik Ala ma kota. Ala ma kota. new$ ./plik Ala w domu ma chomika, kota, rybki oraz psa. Ala w domu ma chomika, kota, rybki oraz psa.

Łatę można wygenerować poleceniem diff.