Documente Academic
Documente Profesional
Documente Cultură
Exista posibilitatea ca in momentul executiei unui program scris in limbajul C sau Pascal sa i se transmita acestuia
argumente (parametri) in cadrul liniei de comanda. Aceasta facilitate (respectiv a accesarii acestor parametri) este
oferita de fapt de catre sistemele de operare, care sunt raspunzatoare de corecta transmitere a acestor parametri.
Ca dovada a acestei afirmatii, a se vedea facilitatile de referire la parametrii din linia de comanda oferite in cadrul
fisierelor de comenzi (MS-DOS, Unix).
In cazul in care dorim ca programele executabile (care nu sunt altceva decat comenzi ale SO sub care se lucreaza)
dezvoltate de noi la un moment dat sa poata beneficia de o astfel de facilitate, ne punem problema in ce
masura limbajele de programare in care lucram ne ofera posibilitatea de a referi eventualii parametri din linia de
comanda. Ideea pe care vrem sa o subliniem aici este faptul ca nu este de ajuns "efortul" unei singure parti (adica
fie numai a SO, fie numai a limbajului in care lucram) ci este nevoie de existenta de facilitati la nivelul ambelor
parti implicate in dezvoltarea si executia aplicatiilor.
Vom analiza aici, pe scurt, facilitatile oferite de limbajele de programare Pascal si C(++) in acest sens.
Sa facem de la inceput precizarea, ca standardul limbajului Pascal (spre deosebire de standardul limbajului C) nu
ofera posibilitatea accesarii eventualilor parametri in linia de comanda.
Implementarea Turbo Pascal dispune in cadrul unit-ului System de doua functii speciale destinate acestui
scop: ParamCount si ParamStr. Asadar, sa remarcam faptul ca nu limbajul Pascal standard prevede o astfel de
facilitate ci doar implementarea Borland a acestuia (si bineinteles, si alte implementari ale Pascal-ului o fac - de
exemplu, Pascal Sun sub Unix, insa cu o altfel de sintaxa).
Functia ParamCount din Borland Pascal returneaza numarul de parametri introdusi in linia de comanda la
momentul lansarii programului. Parametrii trebuie sa fie separati prin spatiu sau tab.
function ParamCount:word;
unde indice desemneaza rangul parametrului din linia de comanda. Daca indice este mai mare decat valoarea
returnata de functia ParamCount atunci ParamStr returneaza sirul vid, iar daca indice are valoarea zero atunci
ParamStr returneaza chiar numele programului lansat in executie impreuna cu calea de acces spre acesta.
program listpar;
var i:integer;
begin
if ParamCount = 0 then writeln('Nu sunt parametri...')
else
for i:=1 to ParamCount do writeln(i,' ',ParamStr(i));
end.
In acelasi scop, in limbajul C standard (deci nefiind un apanaj al mediului Turbo - asa cum este in Turbo
Pascal) exista posibilitatea specificarii a doua argumente ale functiei main (sa remarcam deci o alta diferenta intr
e cele 2 limbaje: in Pascal este vorba de functii iar in
C este vorba de argumente; functionalitatea si tipul de informatie oferit este insa aceeasi):
Prin conventie argv[0] este un pointer la numele programului apelat, astfel ca argc este cel putin 1, iar *argv (tiparit
cu descriptorul "%s") este chiar numele programului lansat (echivalent cu ParamStr(0) din Turbo Pascal). Daca
argc=1 atunci nu avem parametri in linia de comanda (echivalent cu situatia ParamCount=0 din Turbo Pascal).
Exemplul dat mai sus in Turbo Pascal se poate scrie in C astfel:
argv fiind un pointer la un tablou de pointeri, exista si variante echivalente de scriere a acestui program. Dam
in continuare inca doua variante:
if (argc !=2) {
printf("Specify a password");
exit(1);
if (!strcmp(argv[1], "password"))
printf("Access Permitted");
else
printf("Access denied");
exit(1);
>>./test.EXE “password”
Ex: un program care muta fisiere, invoca 2 parametrii – fisierul sursa si cea destinatie:
#include <iostream>
Acest program permite acces la codul său numai dacă utilizatorul introduce parola corectă in
linia de comandă.
4. Propuneri de extindere/imbunatatire.
In primul rand, din perspectiva utilizatorului, as invata mai multa lume utilizarea
liniei de comanda, pentru ca mai multa lume sa se poata folosi de acest avantaj al
limbajelor de programare de a folosi argumente in linia de comanda. Tot in privinta
utilizarii liniei de comanda, as pune disponibil folosirea liniei de comanda si pe
telefoane (Android, IOS etc), nu stiu in ce masura ar exista aceasta posibilitate de a
putea rula un program cu argumente in linia de comanda pe telefon.
Din perspectiva programatorului, nu as mai include un al 3lea element care sa
reprezinte tipul elementelor introdus, ci as lasa asa cum e, de a citi sir de caractere,
care pe urma este usor de convertit in orice alt tip de date. Plus, avantajos ar fi atunci
sa nu se specifice doar tipul intregului sir de elemente care se va introduce, ci pentru
fiecare leement in parte, iar astfel lucrurile s-ar complica in privinta programatorului
si nicidecum nu s-ar simplifica. O imbunatatire pe care l-as sugera ar fi securizarea
argumentelor care se pot introduce in linia de comanda. Stim foarte bine ca exista
multe vulnerabilitati datorita argumentelor care pot fi introduse de la comanda (cu
mar fi Command Injection) si acestea chiar sunt exploatate de cei cu rea intentie.
Astfel intr-un fel sau altul as “purifica” elementele introduse cu rea intentie.