OVH Cloud OVH Cloud

(Question) Link final et code mort

9 réponses
Avatar
Olivier
Bonjour,

Le linker (VC6 entreprise ou VS2003 architecte) n'est il pas
censé supprimer le code mort dors du link Final ?
Si je regarde dans l'exe générer je retrouve des chaines de caractères
ou des valeurs (int ou int64) initialisées dans des fonctions qui ne sont
pas appelées, non ? problème d'option de compile/ de link ?

Merci,

9 réponses

Avatar
Vincent Burel
"Olivier" wrote in message
news:dg8k5j$ppg$
Bonjour,

Le linker (VC6 entreprise ou VS2003 architecte) n'est il pas
censé supprimer le code mort dors du link Final ?
Si je regarde dans l'exe générer je retrouve des chaines de caractères
ou des valeurs (int ou int64) initialisées dans des fonctions qui ne sont
pas appelées, non ? problème d'option de compile/ de link ?

Merci,



non, ce que vous définissez reste dans le BIN final ... il manquerait plus
que ca. De plus la notion de code mort n'est pas détectable fiablement par
le compilo... par un jeu de pointeur calculés, on peut utiliser une fonction
qui pour le compilo semble être inutile... idem pour les constantes.

Par contre ca fait des années que je souhaite que le MSVC puisse dire ce qui
semble être inutilisé dans le source (comme il le fait avec les locals :
pourquoi pas avec les globales, membres de structure, fonctions etc...)...
Est-ce que ca existe maintenant !? Je n'en ai pas l'impression...

VB
Avatar
Olivier
Dans mon cas ce serait des fonctions completes et pas des parties de code
dans une
fonction.

Bonjour,

Le linker (VC6 entreprise ou VS2003 architecte) n'est il pas
censé supprimer le code mort dors du link Final ?
Si je regarde dans l'exe générer je retrouve des chaines de caractères
ou des valeurs (int ou int64) initialisées dans des fonctions qui ne
sont
pas appelées, non ? problème d'option de compile/ de link ?

Merci,



non, ce que vous définissez reste dans le BIN final ... il manquerait plus
que ca. De plus la notion de code mort n'est pas détectable fiablement par
le compilo... par un jeu de pointeur calculés, on peut utiliser une
fonction
qui pour le compilo semble être inutile... idem pour les constantes.

Par contre ca fait des années que je souhaite que le MSVC puisse dire ce
qui
semble être inutilisé dans le source (comme il le fait avec les locals :
pourquoi pas avec les globales, membres de structure, fonctions etc...)...
Est-ce que ca existe maintenant !? Je n'en ai pas l'impression...

VB




Avatar
Vincent Burel
"Olivier" wrote in message
news:dg8soe$ca4$
Dans mon cas ce serait des fonctions completes et pas des parties de code
dans une
fonction.



oui, c'est ce dont je parlais.
Le compilateur ne peut pas décider d'enlever une fonction parce que
soi-disant "inutilisé explicitement"... Une fonction peut être utilisée
implicitement sans que le compilateur puisse le savoir... donc il ne
l'enlève pas.

VB
Avatar
adebaene
Olivier wrote:
Dans mon cas ce serait des fonctions completes et pas des parties de code
dans une
fonction.



Normalement, il peut supprimer les fonctions non référencées, vu que
la seule façon d'accéder à une fonction, c'est :
- de l'appeler directement.
- de prendre son addresse dans un pointeur.

2 choses que le compilo/linker peut détecter.

Par contre, il ne le fait qu'en mode release et quand il ne s'agit pas
d'une DLL ou d'une librairie (évidemment).

Arnaud
MVP - VC
Avatar
Vincent Burel
wrote in message
news:

Olivier wrote:
Dans mon cas ce serait des fonctions completes et pas des parties de code
dans une
fonction.





Normalement, il peut supprimer les fonctions non référencées, vu que
la seule façon d'accéder à une fonction, c'est :
- de l'appeler directement.
- de prendre son addresse dans un pointeur.




manque d'imagination
VB
Avatar
Arnold McDonald
wrote:

Normalement, il peut supprimer les fonctions non référencées, vu que
la seule façon d'accéder à une fonction, c'est :
- de l'appeler directement.
- de prendre son addresse dans un pointeur.



Tu as des tas de manières de déguiser un appel de fonction. Et cela sert
dans les méthodes de protections, les malwares, (qui, quoi qu'on en dise
sont des logiciels comme les autres), etc. En obfusquant un peu ton code, tu
peux pommer complètement le compilo pour ce qui est de
l'estimation/évaluation/detection d'un appel de fonction.

Sans compter les tas de magouilles comme sauter à un bout de code (la
fonction déguisée) et au beau milieu, construire un RET sur la pile et metre
IP dessus. Etc, etc.

Bref, je préfère que le compilo laisse mon code tranquille plutôt que
d'essayer de virer le code inutile. AMHA le code inutile doit être enlevé
par le codeur lui-même lorsqu'il écrit son code :-). Quand aux librairies,
les 9/10e utilisent des DLLs, donc, n'est chargé que ce qu'il faut au moment
où il faut. Et encore, quand je dis chargé, c'est juste mappé.

--
Arnold McDonald (AMcD®)

http://arnold.mcdonald.free.fr/
Avatar
Olivier
D'apres mes tests

Pour des fonctions C:
----------------------
L'unité de suppression du code mort du Linker est le fichier .obj et non pas
la fonction, explication.

Soit une librairie MyLib contenant deux fichiers sources :

Source1.ccp contient : deux fonctions fct11() et fct12()

Source2.cpp contient : une fonction fct20()

Une application MyApp est lié statiquement à la librairie MyLib :

Si cette application appelle une des deux fonctions fct11 ou fct12 le code
compile de source1.obj sera ajoute en totalite a l'application.



Pour des classes:

Cela depend des options d'optim aussi de la lib que de l'appli.



Vous confirmez ?



wrote in message
news:

Olivier wrote:
Dans mon cas ce serait des fonctions completes et pas des parties de code
dans une
fonction.



Normalement, il peut supprimer les fonctions non référencées, vu que
la seule façon d'accéder à une fonction, c'est :
- de l'appeler directement.
- de prendre son addresse dans un pointeur.

2 choses que le compilo/linker peut détecter.

Par contre, il ne le fait qu'en mode release et quand il ne s'agit pas
d'une DLL ou d'une librairie (évidemment).

Arnaud
MVP - VC
Avatar
Aurelien Regat-Barrel
> Bonjour,



Bonjour,

Le linker (VC6 entreprise ou VS2003 architecte) n'est il pas
censé supprimer le code mort dors du link Final ?
Si je regarde dans l'exe générer je retrouve des chaines de caractères
ou des valeurs (int ou int64) initialisées dans des fonctions qui ne sont
pas appelées, non ? problème d'option de compile/ de link ?



Il me semble plutôt qu'il est censé n'importer que le minimum depuis une
lib ("smart linker"), ce qui n'est pas la même chose.
Une idée : transforme ton code en lib statique, et lie-le à un exe
presque vide...

--
Aurélien Regat-Barrel
Avatar
Gilles Vollant \(MVP\)
Je ne partage pas cette conclusion.
Pas en utilisant le WPO, qui donne les meilleurs resultats d'optimisation
avec Visual C++ de Visual Studio 2002 et suivant. Avec le WPO, c'est un peu
comme si tout le code était d'un bloc.

Avec le WPO, toute fonction et toute partie de code dont le compilateur peut
détecter qu'il est rigoureusement impossible qu'il soit appeler sera
éliminé.


a propos du WPO
http://gilles-vollant.developpez.com/visual-cpp/optimisation/