++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.