Я портирование большой с проектом из Windows на Unix и источник содержит много тысяч вызовов для функции logprint, который объявлен как это:Как автоматически добавлять типы приведения к функциям стиля printf в c исходном коде?
VOID logprint(DWORD level, LPCSTR format, ...);
Теперь вот мои две проблем:
1 .) Используемые спецификаторы типа формата не переносятся
В коде используются %lu
для переменных ULONG
. В Windows это нормально, потому что ULONG
является typedef для unsigned long
. Однако при портировании кода я не могу воспроизвести этот typedef, потому что ULONG
всегда должен быть ровно 32-битным в соответствии с [MS-DTYP] (NB: с компиляторами Microsoft c unsigned long
всегда 32-разрядный). Итак, я создал заголовочный файл типов окон wtypes.h
, который определяет базовые типы данных Windows с помощью stdint.h
и limits.h
. Конечно, теперь это приводит к недопустимым чтениям из-за спецификатора %lu
, если системы unsigned long
являются 64-битными, а мой ULONG
- 32-разрядный. Поэтому я также должен добавить в список (unsigned long)
все аргументы logprint ULONG
. И ULONG
только один пример, конечно ...
2.) Недействительные спецификаторов типа формата, используемых
Кроме того, что код использует много недействительных спецификатор формата. Например. % d для аргументов DWORD.
Конечно, легко решить:
- идентифицировать все logprint называет
- определить тип каждого аргумента
- проверить, что правильный спецификатор формата используется
- добавить правильные забросы типа к статьям
Пример:
Заменить:
ULONG ulMin, ulMax;
...
logprint(FATAL, "specified interval is invalid %ld..%u out of range",
ulMin, ulMax);
с:
logprint(FATAL, "specified interval is invalid %lu..%lu",
(unsigned long) ulMin, (unsigned long) ulMax);
Но это заняло бы меня по крайней мере две недели, и мой мозг будет искажен после этого.
Так что мой актуальный вопрос:
Существуют ли какие-либо автоматизированные инструменты для изготовления такого рода изменений?
Как минимум требование, чтобы инструмент должен был идентифицировать тип аргументов и префикс их с типом. После появления типов типов я могу легко написать скрипт python, который исправляет спецификаторы формата.
Регулировка форматов предпочтительнее, чем при отливке! И поскольку вы на нем используете макросы форматирования из 'inttypes.h'. Парень, переносящий это на 64-битный через 10 лет или около того, полюбит вас за это. ;-) – alk
И относительно рабочей нагрузки: Составьте карту и уменьшите это с помощью своих товарищей по команде. – alk
Этот 'logprint (FATAL,« указанный интервал недействителен% ld ..% u вне диапазона », ulMin, ulMax);' должен быть 'logprint (FATAL, указанный интервал недействителен%" PRIu32 "..%" PRIu32 «вне диапазона», ulMin, ulMax); '. – alk