Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

warning: function returns address of local variable

65 réponses
Avatar
pere.noel
à la compile d'un ensemble de fonctions + main, j'ai le message de
warning :
function returns address of local variable
pour la fonction "target_path_normalize"

le but de cette fonction :
si j'ai en entrée :

target_path_checked =
////Users////yvon/./////////////////////work/C/../.headers
toto/CFArray.h

elle retourne ce path normalisé :
target_path_normalized = /Users/yvon/work/.headers toto/CFArray.h

cette fonction "marche" mais je me demande quel risque je prends en
laissant trainer ce warning

le contexte : avant l'utilisation de cette fonction, j'en utilise une
autre "target_path_check" qui retourne NULL si le path n'est pas absolu
et accessoirement supprime le "/" en fin de chaîne s'il existe.

--- target_path_normalize ---------------------------------------------
char* target_path_normalize(const char* target_path)
{
int trente_deux = 32; /* maximum de répertoires traversés */
int mille_vingt_quatre = 1024; /* taille maximum d'un path */
char p[mille_vingt_quatre]="";
char *q;
char *token;
const char needle[] = "/";
const char *dot = ".";
const char *dotdot = "..";
int j;
q = strdup(target_path);
j = 0;
char *pieces[trente_deux];
// initialisation des éléments du tableau à NULL
while(j < trente_deux) {
pieces[j] = NULL;
j++;
}

// démarrage du découpage de q (target_path)
token = strtok(q, needle);
j = 0;

// découpage de q (target_path)
while(token != NULL) {
// si ".." on décrémente j equivalent à cd ..
// si "." on ne fait rien
// si différent de ".." et de "." on enregistre token dans
pieces[j] et on incrémente j
if(strcmp(token, dotdot) == 0) {
j--;
} else if(strcmp(token, dot) != 0) {
pieces[j]=token;
j++;
}
token = strtok(NULL, needle);
}
j = 0;

// concaténation de "/" (needle) et de pieces[j] jusqu'à épuisement
(quand pieces[j] == NULL)
while(pieces[j] != NULL) {
strcat(p, needle);
strcat(p, pieces[j]);
j++;
}
return p;
}
-----------------------------------------------------------------------
donc c'est le "return p" qui pose pb à la compil mais pas à
l'utilisation.
--
une bévue

10 réponses

3 4 5 6 7
Avatar
pere.noel
Hamiral wrote:

-----^---- le @ là c'est pour générer une doc, je suppose ?


Oui, j'utilise la syntaxe doxygen pour mes commentaires.


ok, ça ressemble à javadoc...

--
une bévue


Avatar
Eric Levenez
Le 8/09/06 8:22, dans <45010c40$0$27210$, « Harpo »
a écrit :

Eric Levenez wrote:

*(q--) = 0;
est plus lisible.


Les parenthèses ne servent ici qu'à surcharger inutilement la lecture,


Je ne me rappelle jamais de la précédence des opérateurs.


C'est pourtant la base : le ++ et le -- placés après un nom incrémente et
décrémente la variable __après__ utilisation. C'est le but de ces
opérateurs.

un peu comme les :

return(0);

que l'on voit trop souvent :-)


Ca donne un style macro.


Déjà que les macros, c'est mal©, alors essayer de les mimer.... Beurk.

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.



Avatar
Hamiral
Une bévue wrote:

Hamiral wrote:

-----^---- le @ là c'est pour générer une doc, je suppose ?


Oui, j'utilise la syntaxe doxygen pour mes commentaires.


ok, ça ressemble à javadoc...


Oui, doxygen est extrêmement inspiré de javadoc :)



--
Hamiral



Avatar
Stéphane Goujet

Le 8/09/06 8:22, dans <45010c40$0$27210$, « Harpo »
*(q--) = 0;
Les parenthèses ne servent ici qu'à surcharger inutilement la lecture,

Je ne me rappelle jamais de la précédence des opérateurs.

C'est pourtant la base : le ++ et le -- placés après un nom incrémente et

décrémente la variable __après__ utilisation. C'est le but de ces
opérateurs.


Rien à voir : le problème de Harpo est de savoir quelle est la
variable concernée, q ou *q.

A+,
Stéphane.




Avatar
Pierre Maurette
Eric Levenez wrote:

*(q--) = 0;
est plus lisible.


Les parenthèses ne servent ici qu'à surcharger inutilement la lecture,


Je ne me rappelle jamais de la précédence des opérateurs.


Idem. Je préfère *(q--), *(q--), --(*q) et (*q)-- que le doute.

un peu comme les :

return(0);

que l'on voit trop souvent :-)


Ca donne un style macro.


Autant que des pompes vernies bicolores ?

--
Pierre Maurette



Avatar
Marc Boyer
Le 08-09-2006, Pierre Maurette a écrit :
Je trouve au contraire que c'est une bonne habitude de systématiser:
p = malloc(nbrObjets * sizeof(type));


Je ne partage pas cet avis. Ce que je trouve utile, c'est
p = malloc(nbrObjets * sizeof(*p)); // ou p[0]...

Marc Boyer
--
Si tu peux supporter d'entendre tes paroles
Travesties par des gueux pour exciter des sots
IF -- Rudyard Kipling (Trad. Paul Éluard)

Avatar
Pierre Maurette
[...]
p = (char *) malloc (PATH_SIZE_MAX * sizeof (char));


Je crois que sizeof(char) vaut toujours 1, à vérifier.


Oui. Il a eu droit à la remarque une demi-douzaine de fois, et je n'ai
pas tout lu ;-)
Je trouve au contraire que c'est une bonne habitude de systématiser:
p = malloc(nbrObjets * sizeof(type));

En revanche, ED étant en vacance(*), il n'a eu droit à rien (dans ce
que j'ai lu) sur le cast superflu. L'argument (capillotracté) contre
est qu'il masque un warning éventuel. L'argument (fallacieux) pour est
qu'il compile en C++, où le malloc() est "fonctiona non grata". La
bonne pratique un peu veule est de le virer avant de poster ici.

(*) j'ignore s'il est en vacances.

--
Pierre Maurette


Avatar
Pierre Maurette
Le 08-09-2006, Pierre Maurette a écrit :
Je trouve au contraire que c'est une bonne habitude de systématiser:
p = malloc(nbrObjets * sizeof(type));


Je ne partage pas cet avis. Ce que je trouve utile, c'est
p = malloc(nbrObjets * sizeof(*p)); // ou p[0]...


C'est mieux.

--
Pierre Maurette


Avatar
Harpo
Eric Levenez wrote:

Le 8/09/06 8:22, dans <45010c40$0$27210$, «
Harpo » a écrit :

Eric Levenez wrote:

*(q--) = 0;
est plus lisible.


Les parenthèses ne servent ici qu'à surcharger inutilement la
lecture,


Je ne me rappelle jamais de la précédence des opérateurs.


C'est pourtant la base : le ++ et le -- placés après un nom incrémente
et décrémente la variable __après__ utilisation. C'est le but de ces
opérateurs.


C'est une chose différente, là vous parlez de la sémantique; non de la
syntaxe.
Si on ne connais pas la précédence de * et -- on peut se demander si
*p-- veut dire *(p--) ou (*p)--, dans les 2 cas il s'agit d'une
post-décrémentation.

Déjà que les macros, c'est mal©,


Mais parfois utile.

alors essayer de les mimer.... Beurk.


On peut trouver de bonne raisons pour, par exemple changer return(0) par
blah(0) (bjah = macro) de manière simple sans avoir à faire des
expressions régulières compliquées pour changer un ensemble de sources.

--
http://patrick.davalan.free.fr/




Avatar
Harpo
Pierre Maurette wrote:

Ca donne un style macro.


Autant que des pompes vernies bicolores ?


Les baguouzes et les sizeof(char).

--
http://patrick.davalan.free.fr/


3 4 5 6 7