IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

comment cacher le code source ?


Sujet :

C++

  1. #1
    Membre �prouv�
    Profil pro
    Inscrit en
    D�cembre 2004
    Messages
    1 299
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2004
    Messages : 1 299
    Par d�faut comment cacher le code source ?
    Bonjour, je fais une librairie. Certaines des fonctions sont templates, donc je dois les mettre dans un .h.

    Quand je livre ma librairie � mon client, je lui fournis une doc, le .dll, le .lib et tous les .h contenant les d�clarations des fonctions.

    Le souci, selon moi, est que je ne veux pas qu'il voit le code source (de toutes les fonctions templates qui sont dans les .h).

    Savez-vous comment faire ? Je suis sous Visual 2005 et linux (sous linux : compilo g++)

    Merci d'avance

  2. #2
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Salut,

    La premi�re question qui me vient � l'esprit, en lisant ta question, est "pourquoi faire"

    Je peux comprendre que tu souhaite prot�ger un minimum la paternit� de ton code, mais, de mani�re g�n�rale, j'ai quand m�me quelques doutes sur le fait qu'il soit � ce point "r�volutionnaire" pour valoir la peine d'�tre tout � fait cach� (comprend: d'avantage que par la simple compilation)...

    Ceci dit, j'ai une bien mauvaise nouvelle pour toi: d�s le moment o� tu travailles avec des templates, il devient purement et simplement impossible de cacher le code source, si, du moins, tu souhaites permettre � l'utilisateur d'utiliser les fonctions (et les structures) template en tant que telles:

    En effet, l'impl�mentation binaire (ex�cutable) d'un template d�pendra principalement du type d'objet manipul� r�ellement, ce qui implique qu'elle doit �tre cr��e par le compilateur chaque fois qu'une fonction (ou qu'une structure) est utilis�e avec un type particulier, avec pour cons�quence que le compilateur a besoin de disposer du code source correspondant.

    Si, maintenant, tu n'utilise les fonctions et structures template que de mani�re interne, il est toujours possible d'envisager de s�parer l'impl�mentation de la d�claration, en pla�ant, par exemple, la d�claration de fonction template ou la d�finition de structure tempalte dans un fichier d'en-t�te (*.h / *.hpp), et l'impl�mentation des fonctions (membres) dans un fichier s�par�, d'extension libre (*.impl pour implementation ou .tpp )

    Il faudra alors veiller:
    1. A ce que l'utilisateur de ta biblioth�que ne soit pas tent� d'utiliser la structure ou la fonction template (ce qui implique de ne pas fournir le fichier d'en-t�te � ton client)
    2. A inclure, dans tout fichier utilisant la structure ou la fonction template, non seulement le fichier d'en-t�te, mais �galement le fichier d'impl�mentation associ�.


    Cela pourrait donc prendre une forme proche de
    fichier mytemplate.h
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #ifndef MYTEMPLATE_H
    #defineMYTEMPLATE_H
    template <class T>
    class MyTemplate
    {
        public:
            /*...*/
            void foo();
    };
    template <class T>
    void bar();
    #endif // MYTEMPLATE_H
    fichier mytemplate.impl
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <mytemplate.h>
    template<class T>
    void MyTemplate<T>::foo()
    { 
        /*ce qui doit être fait */
    }
    template <class T>
    void bar()
    {
        /* ce qui doit être fait */
    }
    fichier somefile.cpp
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <mytemplate.impl>
    void doSomething()
    {
        MyTemplate<int> ...
     
    }
    void doOtherThing()
    {
         bar<std::string>();
    }
    Il faut bien �tre conscient que, si tu choisi cette mani�re de travailler, la seule inclusion de mytemplate.h ne suffira pas pour te permettre d'utiliser ce qui est d�clar� dans ce fichier

    C'est la raison pour laquelle l'utilisateur final doit carr�ment ignorer l'existence de ce fichier, de mani�re � ne pas �tre tent� de recourir � son contenu
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  3. #3
    R�dacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supa�ro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Ing Supa�ro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par d�faut
    Un gros +1 koala mais si tu dois vraiment prot�ger le code pour des raisons professionnelles, regarde du cot� de l'[ame="http://fr.wikipedia.org/wiki/Obfuscation"]Obfuscation[/ame] ?
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une tr�s bonne doc sur le C++ (en) Why linux is better (fr)

  4. #4
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 505
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 505
    Par d�faut
    Je vais faire mon gros lourd sur les exports C++, comme d'hab.

    L'utilisation de types template dans les .h d'une dll oblige l'utilisateur de votre librairie � avoir le m�me compilateur et la m�me impl�mentation de le STL que le cr�ateur de la dll.

    Une fois encore, je le dis, les exports en C++, c'est de la m****.

    En faisant des exports en C, vous n'aurez pas le probl�me car vous devez encapsuler la m�canique interne dans des fonctions. (pas de classe, pas de fonction template)

  5. #5
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Citation Envoy� par Davidbrcz Voir le message
    Un gros +1 koala mais si tu dois vraiment prot�ger le code pour des raisons professionnelles, regarde du cot� de l'Obfuscation ?
    A titre personnel, c'est, d�cid�ment, une technique que je refuserai toujours aussi bien de mettre en �uvre que de valider...

    D'abord parce que, malgr� tout, elle n'a rien d'infaillible, mais, surtout et principalement parce qu'elle ennuie surtout... celui qui devra maintenir le code...

    Bien sur, pour le "commun des mortels", elle peut avoir un effet dissuasif quant � la possibilit� d'�tudier le code, mais, d'un autre cot�, tu pr�pare d�s aujourd'hui la corde qui servira � te pendre dans quelques mois si tu dois revenir dessus
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  6. #6
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ing�nieur d�veloppement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 136
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activit� : Ing�nieur d�veloppement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 136
    Billets dans le blog
    150
    Par d�faut
    L'Obfuscation ... je suis un peu �tonn�, �a parle pas de ce que je pensais . Un jour j'ai appris que l'on pouvait cach� du code en utiliser des langages �sot�riques. Par exemple, utiliser du brainfuck, ou autre truc � la 'con' pour transformer le code C en un code illisible.
    La raison de faire �a, juste parce que nous utilisons OpenOffice ( qui a un par feu, tout le monde le sait ) ou autre logiciel libre, et qu'� certain endroit, malgr� leurs caract�res ouvert, ils doivent cach� le code, car c'est le code qui permet de cripter les mots de passes ( par example ). Du coup �a serait un peu idiot que le code soit visible ( ou les pirates n'auraient plus rien � faire ).
    ( Pardon de pas avoir dit grand chose d'utile au sujet )
    Vous souhaitez participer � la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui conna�t l'erreur, conna�t la solution.

  7. #7
    R�dacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supa�ro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activit� : Ing Supa�ro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par d�faut
    Citation Envoy� par koala01 Voir le message
    A titre personnel, c'est, d�cid�ment, une technique que je refuserai toujours aussi bien de mettre en œuvre que de valider...

    D'abord parce que, malgr� tout, elle n'a rien d'infaillible, mais, surtout et principalement parce qu'elle ennuie surtout... celui qui devra maintenir le code...

    Bien sur, pour le "commun des mortels", elle peut avoir un effet dissuasif quant � la possibilit� d'�tudier le code, mais, d'un autre cot�, tu pr�pare d�s aujourd'hui la corde qui servira � te pendre dans quelques mois si tu dois revenir dessus
    Je ne parle pas d'obfuscer le code du d�veloppement (� moins d'�tre SM) mais cr�er une branche clone dans le r�pertoire svn/git qui � chaque mise � jour du code principal se met � jour aussi et s'obfusce automatiquement.Il n'aura plus qu'a distribuer cette branche du projet (il garde ainsi un projet principal propre). Et m�me si ce n'est pas infaillible, ca limite quand m�me pas mal les chances.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une tr�s bonne doc sur le C++ (en) Why linux is better (fr)

  8. #8
    R�dacteur/Mod�rateur
    Avatar de JolyLoic
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2004
    Messages
    5 463
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 51
    Localisation : France, Yvelines (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : High Tech - �diteur de logiciels

    Informations forums :
    Inscription : Ao�t 2004
    Messages : 5 463
    Par d�faut
    Citation Envoy� par bacelar Voir le message
    Une fois encore, je le dis, les exports en C++, c'est de la m****.

    En faisant des exports en C, vous n'aurez pas le probl�me car vous devez encapsuler la m�canique interne dans des fonctions. (pas de classe, pas de fonction template)
    Sauf que les exports en C, c'est de la m****.
    On ne peut pas utiliser des types qui g�rent bien la m�moire, on ne peut pas exporter une fonction qui va s'adapter au type sur lequel elle est appel�e,... Alors oui, ce qu'on expose est utilisable alors partout, mais un tel nivellement par le bas a un co�t tel que je pr�f�re encore dans de nombreux cas m'en passer.

    Et honn�tement, si tu trouves un moyen �l�gant d'exposer en C une fonction comme std::sort, sans perdre les perfs, je suis preneur...


    Juste pour info, parce que je ne crois pas que �a ait �t� signal� jusqu'� pr�sent, on peut g�n�ralement ne pas exposer le code des templates si on impose que l'utilisateur du code ne pourra instancier ceux-ci que sur certains types pr�-d�termin�s, et qu'on a fait une instanciation manuelle sur ces types dans la biblioth�que. �a peut �tre utile dans certains cas, mais je suis avant tout persuad� que la protection de code est avant tout une affaire de droit plus qu'une affaire technique.
    Ma session aux Microsoft TechDays 2013 : D�velopper en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage � la d�couverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'h�sitez pas � me contacter.

  9. #9
    Membre �prouv�
    Profil pro
    Inscrit en
    D�cembre 2004
    Messages
    1 299
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : D�cembre 2004
    Messages : 1 299
    Par d�faut
    Bonjour � tous, merci pour vos r�ponses.

    En fait, je d�sire "cacher" le code car je souhaite qu'une personne d�sirant utiliser la librairie n'utilise que les .h (pour avoir la d�claration de la fonction) sans avoir en m�me temps le code de la fonction (template).

    Je vais mieux �tudier ce que propose koala01

    Sinon, une recherche sur google m'a amen� au mot-cl� "export" (mais qui a certaines limites d'un point de vue compilateur)...

    Merci encore

  10. #10
    Expert �minent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activit� : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par d�faut
    Citation Envoy� par salseropom Voir le message
    Bonjour � tous, merci pour vos r�ponses.

    En fait, je d�sire "cacher" le code car je souhaite qu'une personne d�sirant utiliser la librairie n'utilise que les .h (pour avoir la d�claration de la fonction) sans avoir en m�me temps le code de la fonction (template).
    De mani�re g�n�rale, et comme je l'ai fait valoir au d�part, je me demande si cela vaut r�ellement la peine: ton code est-il � ce point "extra-ordinaire" pour que le mal que tu va te donner pour le "cacher" en vaille la peine

    De plus, le propre des classes et des fonctions template est, justement, de laisser l'impl�mentation accessible au compilateur, �tant donn� que, typiquement, il ne s'agit que d'impl�mentations d'algorithmes pour lesquelles nous ne connaissons � la base pas les types r�els sur lesquels ils devront �tre appliqu�s.
    Je vais mieux �tudier ce que propose koala01
    N'oublie pas de prendre la remarque de JolyLoic en compte: une fonction ou une classe template ne peut �tre export�e que s'il existe effectivement une impl�mentation ex�cutable de cette fonction / classe pour un type donn� et d�fini � appliquer.

    Et c'est encore plus vrai si tu applique la solution dont je t'ai parl�.
    Sinon, une recherche sur google m'a amen� au mot-cl� "export" (mais qui a certaines limites d'un point de vue compilateur)...
    il me semble que le mot cl� export n'est, � l'heure actuelle, que tr�s peu support� par les diff�rents compilateurs, ou, du moins, c'�tait le cas la derni�re fois que j'ai crois� une r�f�rence sur le sujet
    A m�diter: La solution la plus simple est toujours la moins compliqu�e
    Ce qui se con�oit bien s'�nonce clairement, et les mots pour le dire vous viennent ais�ment. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 f�vrier 2014
    mon tout nouveau blog

  11. #11
    yan
    yan est d�connect�
    R�dacteur
    Avatar de yan
    Homme Profil pro
    Ing�nieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activit� : Ing�nieur expert
    Secteur : High Tech - Multim�dia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par d�faut
    Normalement, tu peut aussi limiter tes templates � groupe pr�d�finie de type. Et ainsi fournir un .lib avec des templates limit�s et en ne donnant que le .h
    Code maTemplate.h : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
     
    template<typename T>
    struct AA
    {
        void ecrire(const T &);
    };

    Code AA.cpp : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    #include "maTemplate.h"
    #include <iostream>
     
    template<typename T>
     void AA<T>::ecrire(const T &t)
    {
        std::cout<<t<<std::endl;
    };
     
    //generation du code pour int et char
    template AA<int>;
    template AA<char>;


    Code main.cpp : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    #include "maTemplate.h"
     
    int main(int argc, char* argv[])
    {
        AA<int> a;
        a.ecrire(10);
     
        AA<char> b;
        b.ecrire(10);
     
        AA<double> c;
        c.ecrire(10.5);
        return 0;
    }
    tu obtiens une erreur de link uniquement pour
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    AA<double> c;
     c.ecrire(10.5);

    Par contre c'est une erreur de link du coup. Y as peut �tre un moyen pour que ce soit lors du build

  12. #12
    Expert confirm�
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    F�vrier 2005
    Messages
    5 505
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 53
    Localisation : France, Val de Marne (�le de France)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : F�vrier 2005
    Messages : 5 505
    Par d�faut
    On ne peut pas utiliser des types qui g�rent bien la m�moire, on ne peut pas exporter une fonction qui va s'adapter au type sur lequel elle est appel�e
    A moins d'avoir une seule C-runtime dans l'OS, la gestion de la m�moire par les "structures" C++ sont aussi faibles que celles C.
    Une fonction qui s'adapte au type mais pas aux options du compilateur, ce n'est pas ce que j'appelle un avantage.

    Le nivellement pas le bas ? Il y a un nivellement pas le haut, c'est COM (aussi XCOM sous Linux/FireFox je crois), .NET avec un environnement de typage dans le runtime et pas dans le compilateur et je pense qu'ils en restent bien d'autres (� la rigueur CORBA).

Discussions similaires

  1. [Sécurité] Comment protéger mon code source en local
    Par Chikh001 dans le forum Langage
    R�ponses: 3
    Dernier message: 09/06/2006, 11h16
  2. R�ponses: 4
    Dernier message: 24/02/2006, 08h16
  3. [Javadoc] Comment cacher du code dans la javadoc
    Par Tueur_a_gage dans le forum Langage
    R�ponses: 5
    Dernier message: 09/01/2006, 16h59
  4. Comment présenter un code source ?
    Par khayyam90 dans le forum Mise en forme
    R�ponses: 2
    Dernier message: 11/11/2005, 07h27
  5. [Juridique] Comment r�utiliser le code source d'une classe ?
    Par mathieu dans le forum G�n�ral Java
    R�ponses: 8
    Dernier message: 17/05/2004, 13h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo