[so] [Tema2][Linux] Eroare checker coding styl

Darius Mihai dariusmihaim at gmail.com
Wed Apr 3 23:40:49 EEST 2019


On Wed, Apr 3, 2019 at 10:01 PM Alexandru Fazakas via so
<so at cursuri.cs.pub.ro> wrote:
>
> In caz ca mai e cineva in aceeasi situatie, un work-around bun ar putea fi sa aruncati o privire la execl [1]. :)
>
> [1] https://linux.die.net/man/3/execl
>
> Alex
>
> On Wed, Apr 3, 2019 at 9:23 PM Paul Olaru <olarupaulstelian97 at gmail.com> wrote:
>>
>> Există o funcție în familia exec care te scutește de acel array, overall.
>>
>> Te avertizează generic că ai un vector de pointeri, pointerii în sine sunt constanți si chestiile la care indică nu neapărat.
>>
>> On Wed, Apr 3, 2019, 21:19 Alexandru Fazakas via so <so at cursuri.cs.pub.ro> wrote:
>>>
>>> Salut,
>>>
>>> Stie cineva de ce `static const char *args[] = {"sh", "-c", NULL, NULL};` rezulta
>>> pe checkerpatch intr-un warning de tipul `../util/so_stdio.c:267: WARNING:STATIC_CONST_CHAR_ARRAY: static const char * array should probably be static const char * const`?
>>>
>>> Mersi,
>>> Alex

Salut,

În C există două calificative separate pentru pointer-i:
1.   const char *p = "sh"; // valoarea spre care indică p este
constantă, dar p nu este forțat să fie constant
2.   char * const p = "sh"; // valoarea pointer-ului este constantă,
dar datele spre care indică nu sunt neapărat constante

Probabil din modul natural de citire, ar părea că prima variantă face
ce face a doua, însă nu este adevărat.

Cele două se pot combina în `const char *const p = "sh"; ` pentru a
face atât pointer-ul cât și datele constante.

Pentru problema ta, checkpatch spune că vede că ai un array de
pointeri spre date constante (ex. "sh" nu va putea fi modificat), dar
pointerii nu sunt constanți (ex. args[0] = "ls" este posibil).
Așteptarea este, probabil, ca atunci când vede un array de pointeri de
caractere (string-uri) inițializat inline, să fie atât datele și
pointer-ii constate.

Dacă vrei totuși să poți să modifici pointer-ii (presupun că primul
NULL ai vrea să îl schimbi), atunci ai putea să folosești
`static char const *arr[]`. Varianta asta funcționează la fel ca
primul exemplu (datele vor fi constante, nu pointer-ul), iar checkpatch
nu se plânge (s-ar putea să fie un corner case care nu este tratat
de checkpatch, deci nu este foarte recomandat -- dacă știe cineva
mai exact, corectați-mă dacă am spus prostii).

All the best,
Darius


More information about the so mailing list