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 :

Identifier source et classe d'un argument


Sujet :

C

  1. #1
    Membre extrêmement actif
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Billets dans le blog
    5
    Par défaut Identifier source et classe d'un argument
    bonsoir le forum,

    Je voudrais savoir, s'il est possible dans une fonction recevant un pointeur en arguments, de déterminer la classe de celle-ci : static ou auto?
    Est-il également possible d'identifier le processus ayant transmis la variable?
    Et enfin est-il possible en standard d'énumérer les processus en cours sur la pile d'un programme?

  2. #2
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par NVCfrm Voir le message
    Je voudrais savoir, s'il est possible dans une fonction recevant un pointeur en arguments, de déterminer la classe de celle-ci : static ou auto?
    Non il ne me semble pas, un pointeur pointe sur une adresse mémoire c'est tout et d'ailleurs tu ne peux même savoir sur quelle type de données il pointe sauf si c'est explicitement précisé dans l'argument.

    Citation Envoyé par NVCfrm Voir le message
    Est-il également possible d'identifier le processus ayant transmis la variable?
    Pas en standard non.

    Citation Envoyé par NVCfrm Voir le message
    Et enfin est-il possible en standard d'énumérer les processus en cours sur la pile d'un programme?
    Pareil, pas en standard, il faut que tu utilises les bibliothèques que ton système te fournit:
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  3. #3
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Et attention... processus et arguments/fonctions ne sont pas vraiment liés...

    Comme l'a dit Franck.H, tout va dépendre de ton OS !
    S'il s'agit de RPC sur Windows, c'est assez tordu, mais il s'agit d'interfaces préprocessées, donc tu connaitras le type (et de toutes façon tu DOIS connaitre le type...), et Windows pourra probablement te dire avec qui tu bavardes/échanges des données et fais des appels distants de fonctions ou procédures.
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  4. #4
    Membre extrêmement actif
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Billets dans le blog
    5
    Par défaut
    Bonjour,
    merci beaucoup Frank pour les liens que je vais d'emblée approfondir!
    C'est frustrant, pour l'identification des classes de variables. Je pensais bêtement que l'appel d'une option du compilateur permettrait de connaître la classe.
    @Metalman: merci pour l'intérêt porté à la question. Il s'agit de windows.
    Je ne vois pas trop ce que tu veux dire par
    (et de toutes façon tu DOIS connaitre le type...)

  5. #5
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    En relisant ton premier post : en effet tu ne parles que de pointeurs... donc niveau typage c'est facile...

    Enfin quoique...
    Par "tu dois connaitre le type", c'est parce que le programme qui recevra la donnée devra "aussi" connaitre les structures/types pour pouvoir accéder aux champs.... enfin tu peux faire de l'arithmétique des pointeurs, mais c'est pas très facile/aisé.
    Mais comme tu sembles rester sur les même threads, ça devrait aller.
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  6. #6
    Membre extrêmement actif
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Billets dans le blog
    5
    Par défaut
    re,
    Bien que le type est un cas pour une fonction recevant un pointeur du type void, je ne me suis pas encore donné ce casse tête d'identification du type d'une variable autrement que par les moyens conventionnels. Je pourrais revenir avec cette question.
    D'ailleurs je la pose maintenant: Certaines commandes de gdb whatis, ptype permettent de connaître le type d'une variable. Est il possible de les implémenter dans un programme?

    Pour revenir à la question initiale reformulée ainsi: les variables sont stockées dans différents segments: données, pile,... y a t-il un moyen pour une fonction de déterminer à quel segment appartient la variable?

    Merci.

  7. #7
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Hmmm.... tu peux tester l'adresse des variables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    static int a;
    int b;
     
    if &a < 0x*****
    if &b < 0x*****
    Je ne connais pas les specs exactes Intel et des formats binaires Windows...
    Mais en gros, tant que les variables sont dans la pile, elles sont modifiables, et si elles sont dans le segment read-only, non tu ne pourras.
    Il faut connaitre ces formats et les ranges d'adresses, et tu sauras si elles sont modifiables.

    Après, pour connaitre la taille exacte d'une variable... c'est seulement avec les instructions qui travaillent dessus que tu pourrais le deviner... (genre un add 64bits, tu te doutes que le résultat sera 64 bits )
    Et je doute que tu puisses retrouver facilement les structures.
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  8. #8
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par NVCfrm Voir le message
    D'ailleurs je la pose maintenant: Certaines commandes de gdb whatis, ptype permettent de connaître le type d'une variable. Est il possible de les implémenter dans un programme?
    Oui. La question est "a quel cout et avec quel degre de portabilite?" Il faut reimplementer une partie de gdb, il y a quelques libs qui existent qui aident en partie.

    Pour revenir à la question initiale reformulée ainsi: les variables sont stockées dans différents segments: données, pile,... y a t-il un moyen pour une fonction de déterminer à quel segment appartient la variable?
    Oui. A nouveau la question est "a quel cout et avec quel degre de portabilite?" Suivant comment tu acceptes de limiter ton scope (est-ce que tu veux que ca fonctionne en multithread par exemple?) le cout doit etre relativement faible mais la portabilite tout autant.

    La vraie question: qu'est-ce que tu veux faire avec? Il est peut-etre possible de faire plus simple que ces contorsions.

  9. #9
    Membre chevronné
    Profil pro
    Ingénieur sécurité
    Inscrit en
    Février 2007
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2007
    Messages : 574
    Par défaut
    Citation Envoyé par NVCfrm Voir le message
    Pour revenir à la question initiale reformulée ainsi: les variables sont stockées dans différents segments: données, pile,... y a t-il un moyen pour une fonction de déterminer à quel segment appartient la variable?
    Sous linux, le linker rend accessible certaines variables (.text, .data, .bss), voir man 3 end

    sbrk(0) te retourne l'adresse de la heap.

    Pour la stack, tu peux creer une fonction avec une variable locale. Depuis l'interieur de cette fonction, la valeur de l'adresse de la variable locale sera la base de la stack.

    Plus generallement, pour la stack, tu peux utiliser l'adresse de argc (a peut pres base) et recuperer la taille max de la stack (via getrlimit et RLIMIT_STACK). Sinon en ASM, recupere l'adresse courante dans esp/rsp.

    pour la zone de donnees, meme principe. voir man 2 getrlimit et man 3 end.

  10. #10
    Membre extrêmement actif
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Billets dans le blog
    5
    Par défaut
    Merci à tous pour ces indications très intéressantes!
    Je comptes exploiter au plus tôt ces excellentes idées, voir sur quoi cela aboutira.
    Si par la suite d'autres bonnes inspirations venaient, je restes intéressée.

Discussions similaires

  1. Package Jar avec source et classes
    Par speyron dans le forum Maven
    Réponses: 3
    Dernier message: 18/08/2008, 11h05
  2. Réponses: 4
    Dernier message: 11/04/2008, 11h36
  3. [Debutant] Sources des Classes
    Par youbyoub dans le forum Langage
    Réponses: 3
    Dernier message: 16/02/2006, 00h39

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