-regex-replace-rgx -regex-replace-fmt

Сделайте замены в директивах препроцессору

Синтаксис

-regex-replace-rgx matchFileName -regex-replace-fmt replacementFileName

Описание

-regex-replace-rgx matchFileName -regex-replace-fmt replacementFileName лексемы замен в директивах препроцессору в целях Polyspace® анализ. Код первоисточника неизменен. Вы совпадаете с лексемой с помощью регулярного выражения в файле matchFileName и замените лексему с помощью замены в файле replacementFileName.

Используйте опцию только, чтобы заменить или удалить лексемы в директивах препроцессору перед предварительной обработкой. Обычно, если лексема в вашем исходном коде вызывает ошибку компиляции, можно заменить или удалить лексему из предварительно обработанного кода при помощи более удобной опции Command/script to apply to preprocessed files (-post-preprocessing-command). Однако вы не можете использовать опцию, чтобы заменить лексемы в директивах препроцессору. В этом случае используйте -regex-replace-rgx -regex-replace-fmt.

Если при запуске анализ от пользовательского интерфейса (только десктопные решения Polyspace) на панели Configuration, можно ввести эту опцию в поле Other. Смотрите Other.

В пользовательском интерфейсе задайте абсолютные пути к текстовым файлам с поиском и замените шаблоны.

Примеры

Предположим, что вы хотите заменить &_rom_beg в этом #define директива:

#define ROM_BEG_ADDR (uint16_t)(&_rom_beg)
и измените директиву к:
#define ROM_BEG_ADDR (0x4000u)

Задайте это регулярное выражение в файле match.txt:

^#define\s+ROM_BEG_ADDR\s+\(uint16_t\)\(\&_rom_beg\)
Эти элементы используются в регулярном выражении:

  • ^ утверждает положение в начале линии.

  • \s+ представляет один или несколько пробельных символов.

Символы *, &, (и) в исходном выражении оставлены с \. Для полного списка регулярных выражений см. документацию Perl.

Задайте замену в файле replace.txt.

#define ROM_BEG_ADDR \(0x4000u\)

Задайте эти два текстовых файла во время анализа с опциями -regex-replace-rgx и -regex-replace-fmt:

  • Bug Finder:

    polyspace-bug-finder -sources filename -regex-replace-rgx match.txt -regex-replace-fmt replace.txt
  • Code Prover:

    polyspace-code-prover -sources filename -regex-replace-rgx match.txt -regex-replace-fmt replace.txt
  • Сервер Bug Finder:

    polyspace-bug-finder-server -sources filename -regex-replace-rgx match.txt -regex-replace-fmt replace.txt
  • Сервер Code Prover:

    polyspace-code-prover-server -sources filename -regex-replace-rgx match.txt -regex-replace-fmt replace.txt

Советы

  • Если вы используете Polyspace в качестве Вас Расширения кода в ИДАХ, введите эту опцию в файл опций анализа. Смотрите файл опций.

  • Чтобы сделать замены в нескольких видах директив препроцессору, введите одно регулярное выражение на строку в файл соответствия и его замену на соответствующей линии в заменяющем файле. Каждая линия препроцессора, которая совпадает с регулярным выражением в файле соответствия, заменяется соответствующей заменой из заменяющего файла.

    Например, файл соответствия может содержать два регулярных выражения, такие как:

    ^#define\s+ROM_BEG_ADDR\s+\(uint16_t\)\(\&_rom_beg\)
    ^#define\s+ROM_END_ADDR\s+\(uint16_t\)\(\&_rom_end\)
    И заменяющий файл может содержать эти две замены:
    #define ROM_BEG_ADDR \(0x4000u\)
    #define ROM_END_ADDR \(0x8000u\)
    С этими соответствиями и заменами, следующим исходным кодом:
    #include <stdint.h>
    
    #define ROM_BEG_ADDR (uint16_t)(&_rom_beg)
    #define ROM_END_ADDR (uint16_t)(&_rom_end)
    
    
    void main() {
        uint16_t beg_addr = ROM_BEG_ADDR;
        uint16_t end_addr = ROM_END_ADDR;
    }
    преобразован в следующий предварительно обработанный код перед анализом:
    #include <stdint.h>
    
    #define ROM_BEG_ADDR (0x4000u)
    #define ROM_END_ADDR (0x8000u)
    
    
    void main() {
        uint16_t beg_addr = ROM_BEG_ADDR;
        uint16_t end_addr = ROM_END_ADDR;
    }