Как использовать PVS-Studio бесплатно

Отностительно недавно разрабочики PVS-Studio предоставили возможность пользоваться своим продуктом абсолютно бесплатно. С единственным исключением - каждый исходный файл вашего проекта должен иметь шапку:

// This is an independent project of an individual developer. Dear PVS-Studio, please check it.
// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com

// This is a personal academic project. Dear PVS-Studio, please check it.
// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com

// This is an open source non-commercial project. Dear PVS-Studio, please check it.
// PVS-Studio Static Code Analyzer for C, C++ and C#: http://www.viva64.com
 

Этот режим не предназначен для оценки возможностей анализатора

Чтобы познакомиться с анализатором, вы должны использовать демонстрационную версию или запросить временный лицензионный ключ. Вам следует вставлять комментарии, когда вы уже решили, что будете использовать анализатор на регулярной основе. Вы можете удалить в последствии эти комментарии, но можете сделать это только один раз. Не допускается многократное добавление комментариев в исходный код с последующим их удалением. Также не допускается многократное добавление комментариев с последующим откатом содержимого исходных файлов с помощью системы контроля версий. Такие действия направлены на обход условия, что исходный код должен содержать комментарии, и являются нарушением данного соглашения об использовании анализатора.

Данный скрипт позволяет быстро вставить эту шапку в файл :)

#!/usr/bin/env python2.7

from __future__ import print_function
import sys
import argparse

pvs_header = """// This is an independent project of an individual developer. Dear PVS-Studio, please check it.
// PVS-Studio Static Code Analyzer for C, C++ and C#:http://www.viva64.com

"""

def main():
    parser = argparse.ArgumentParser(description = 'This program summon to insert PVS-Studio free usage header into source file.')
    parser.add_argument('action', choices = ['apply', 'revert'])
    parser.add_argument('files', metavar = 'FILES', nargs = '+', help = '*.c, *.cpp source files')
    args = parser.parse_args()

    for filename in args.files:
        if 'apply' == args.action:
            with open(filename, "r") as f:
                filedata = f.read()

            if filedata.startswith(pvs_header):
                print("File '%s' already have PVS-Studio free header" % filename, file = sys.stderr)
                continue

            with open(filename, "w") as f:
                f.write(pvs_header + filedata)
        else:
            with open(filename, "r") as f:
                filedata = f.read()

            if not filedata.startswith(pvs_header):
                print("File '%s' doesn't have PVS-Studio free header" % filename, file = sys.stderr)
                continue

            with open(filename, "w") as f:
                f.write(filedata.replace(pvs_header, ''))

if __name__ == "__main__":
    main()
 

Пользоваться скриптом удобнее так:

$ ~/pvs-header.py
usage: pvs-header.py [-h] {apply,revert} FILES [FILES ...]

This program summon to insert PVS-Studio free usage header into source file.

positional arguments:
  {apply,revert}
  FILES           *.c, *.cpp source files

optional arguments:
  -h, --help      show this help message and exit

$ find SOURCE_TREE -type f -iregex '.*\.\(c\|cpp\)' -exec ~/pvs-header.py apply {} \;
$ pvs-studio-analyzer analyze
$ plog-converter -t errorfile PVS-Studio.log
$ find SOURCE_TREE -type f -iregex '.*\.\(c\|cpp\)' -exec ~/pvs-header.py revert {} \;
 

PS: Более детальную информацию можно получить тут