Сгенерированный код C (из Pro*C) содержит абсолютный путь.
-
14-11-2019 - |
Вопрос
Я проверяю код C, созданный из Про*С много лет назад, и я нашел это:
static const struct sqlcxp sqlfpn =
{
33,
"d:¥¥VS¥¥Projects¥¥SOMEDIR¥¥somefile.pc"
};
Абсолютные пути в коде запрещены нашими правилами качества.
Действительно ли конвертер Oracle Pro*C→C настолько плох, или я что-то пропустил?
Решение
Это используется недокументированными sqlctx()
функция, и я не думаю, что вы можете запретить Pro*C генерировать эту структуру.Я не уверен, что это по сути плохо, это просто то, что появляется в сгенерированном коде и используется внутри Oracle.
Вы также увидите полный путь к оригиналу .pc
файл в #line
директивы, если у вас есть LINES
опция прекомпилятора включенный.(Это позволяет компилятору C сообщать об ошибках по номеру строки в исходном файле, что гораздо удобнее, чем пытаться выяснить это по строке в сгенерированном исходном коде).
Подозреваю, но не совсем уверен, что это включено в sqlctx()
поэтому это значение можно использовать и для внутренних ошибок и, возможно, для отладки.
С точки зрения стандартов кодирования наличие полных путей в исходном коде, вероятно, считается плохим, поскольку вам придется прикасаться к коду, если пути изменятся;но это кажется довольно спорным в сгенерированном коде, поскольку новый путь будет выбран автоматически при следующей сборке.Однако если есть другие причины - возможно, общее требование безопасности для раскрытия минимальной информации о сборке - тогда вы должны знать, что полный путь также появится в конечном двоичном файле.(В Linux strings
показывает полный путь;понятия не имею об эквиваленте для Windows, но думаю, что он где-то есть).Если вы проверяете сгенерированный код, то это звучит скорее как безопасность, чем практическая вещь.
Вы можете избежать указания полного пути, если это действительно важно, перейдя в исходный каталог и просто указав имя файла без пути в iname
, т.е.
cd d:\VS\Projects\SOMEDIR
proc iname=somefile.pc ...
вместо
proc iname=d:\VS\Projects\SOMEDIR\somefile.pc
Другие советы
На самом деле есть причина: E10825 P313:
Примечание. Значение хеша SQLCTX генерируется на основе Intame Параметр передан в команду Pro * C / C ++.Это может вызвать проблемы В приложениях, где файлы, имеющие одно и то же имя, хранятся в Разные каталоги, содержащие разные функции и сборку Сценарии отправляются в физический каталог для предварительно предложенной программы. В результате нет необходимости размещать макияж на более высоком уровне и предварительно предложенные файлы с использованием их пункт.