Question

J'audit le code C qui a été généré à partir de Pro * c il y a des temps, et j'ai trouvé ceci:

static const struct sqlcxp sqlfpn =
{
    33,
    "d:¥¥VS¥¥Projects¥¥SOMEDIR¥¥somefile.pc"
};

Les chemins absolus dans le code sont interdits par nos règles de qualité.
Le convertisseur Pro * C → C d'Oracle fait-il vraiment une si mauvaise chose, ou ai-je manqué quelque chose?

Était-ce utile?

La solution

Ceci est utilisé par les sans-papiers sqlctx() fonction, et je ne pense pas que vous puissiez arrêter pro * c générer cette structure. Je ne suis pas sûr que ce soit intrinsèquement une mauvaise chose, c'est juste quelque chose qui apparaît dans le code généré et est utilisé en interne par Oracle.

Vous verrez également le chemin complet de l'original .pc déposer #line directives, si vous avez le LINES option de précompilateur allumé. (Cela permet au compilateur C de signaler les erreurs par rapport au numéro de ligne dans le fichier source d'origine, ce qui est beaucoup plus pratique que d'essayer de le comprendre à partir de la ligne dans la source générée).

Je soupçonne, mais je ne suis pas entièrement sûr, qu'il est inclus dans sqlctx() Ainsi, la valeur peut également être utilisée pour les erreurs internes, et éventuellement pour le débogage.

Du point de vue des normes de codage, avoir des chemins complets dans votre source est probablement considéré comme une mauvaise chose car vous devez toucher le code si les chemins ont changé; Mais cela semble plutôt théorique dans le code généré car le nouveau chemin sera repris automatiquement sur la prochaine version. Cependant, s'il existe d'autres raisons - une exigence de sécurité générale pour révéler peut-être des informations de construction minimales - vous devez savoir que le chemin complet apparaîtra également dans le binaire final. (En Linux, strings montre le chemin complet; Aucune idée d'un équivalent Windows, mais j'imagine qu'il est là quelque part). Si vous vérifiez le code généré, cela ressemble à une sécurité plutôt qu'à une chose pratique.

Vous pouvez éviter le chemin complet, si cela importe vraiment, en déménageant dans le répertoire source et en donnant simplement le nom de fichier sans chemin dans le iname, c'est à dire

cd d:\VS\Projects\SOMEDIR
proc iname=somefile.pc ...

à la place de

proc iname=d:\VS\Projects\SOMEDIR\somefile.pc

Autres conseils

Il y a en fait une raison: E10825 P313:

Remarque: La valeur de hachage SQLCTX est générée en fonction du paramètre INAME transmis à la commande pro * c / c ++. Cela peut entraîner des problèmes dans les applications où les fichiers ayant le même nom sont stockés dans différents répertoires contenant différentes fonctions et les scripts de construction sont envoyés au répertoire physique pour précompiler le programme. En conséquence, il n'est pas nécessaire de placer les makefiles à un niveau supérieur et de précompiler des fichiers en utilisant leurs noms de chemin.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top