Отностительно недавно разрабочики 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: Более детальную информацию можно получить тут