{"id":18184255,"url":"https://github.com/tonycoz/perl-check","last_synced_at":"2026-05-19T19:05:33.925Z","repository":{"id":260724179,"uuid":"864450807","full_name":"tonycoz/perl-check","owner":"tonycoz","description":"clang-tidy plugin to check perl API usage","archived":false,"fork":false,"pushed_at":"2024-12-18T12:51:53.000Z","size":100,"stargazers_count":0,"open_issues_count":6,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-13T14:49:40.576Z","etag":null,"topics":["clang-tidy","perl"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tonycoz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-09-28T08:52:20.000Z","updated_at":"2024-12-18T12:51:58.000Z","dependencies_parsed_at":"2024-11-02T05:18:19.289Z","dependency_job_id":"d76c8bce-8b9f-4e23-a920-6b4493f0d799","html_url":"https://github.com/tonycoz/perl-check","commit_stats":null,"previous_names":["tonycoz/perl-check"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tonycoz%2Fperl-check","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tonycoz%2Fperl-check/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tonycoz%2Fperl-check/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tonycoz%2Fperl-check/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tonycoz","download_url":"https://codeload.github.com/tonycoz/perl-check/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247648976,"owners_count":20972945,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["clang-tidy","perl"],"created_at":"2024-11-02T21:03:45.597Z","updated_at":"2026-05-19T19:05:33.870Z","avatar_url":"https://github.com/tonycoz.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# perl-check\n\nThis is a clang-tidy plugin that currently checks for calls to\n`sv_setpvn()` with a literal string, which are better written with\n`sv_setpvs()`.\n\n# Building the module\n\nInstall clang and its development libraries, I used the debs from\napt.llvm.org, and tested with llvm 18.\n\nYou also need cmake, you may also want libedit-dev.\n```\ncmake -B build\ncmake --build build\n```\n\nwhich should create `libperl-check.so` in `build/`.  You'll need the\npath to this and to `.perl-clang-tidy` in this directory.\n\nIf you have multiple versions of `clang` installed `cmake` seems to\nselect the first `clang` it finds going by directory order, you can\ncontrol that with `CMAKE_PREFIX_PATH`, for example:\n\n```\nexport CMAKE_PREFIX_PATH=/usr/lib/llvm-20\ncmake -B build\ncmake --build build\n```\n\n# Build a compilation database\n\n## For your perl build\n\nSwitch to your perl checkout, you need to start with a clean tree.\n\nThis requires the `bear` tool, I used the Debian packaged version.\n\n```\n./Configure ... -Dcc=clang-18\nbear -- make\n```\nYou should now have `compile-commands.json`\n\n## For an XS module\n\nSwitch to your XS root, assuming an `ExtUtils::MakeMaker` build:\n```\nperl Makefile.PL\nbear -- make\n```\n\n# Invoking clang-tidy\n\n```\nclang-tidy-18 --load=path/to/build/libperl-check.so --checks='-*,perl-*' --config='{\"CheckOptions\":{\"PerlCheckMultiplicity\":1}}' source.c\n```\n\nThe `clang-tidy` invoked should match the version the loadable module\nwas built with, the simplest way to see that is:\n\n```\n$ grep Clang_DIR build/CMakeCache.txt\nClang_DIR:PATH=/usr/lib/cmake/clang-18\n```\n\nYou can also use `run-clang-tidy` to avoid test all sources, or all\nsources matching a regular expression:\n\n```\nrun-clang-tidy-18 -load=path/to/build/libperl-check.so -checks='-*,perl-*' -config='{\"CheckOptions\":{\"PerlCheckMultiplicity\":1}}'\n```\nNote the change from `--` to `-` for the options.\n\nYou will need to supply `PerlCheckMultiplicity` set to 1 as in the\nabove examples if your perl was built with threads, or even just\nmultiplicity.\n\n# Example output\n\nEdited out the files with no issues found to reduce noise.\n\n```\n$ run-clang-tidy-18 -load=/home/tony/dev/llvm/git/perl-check/build/libperl-check.so -checks='-*,perl-*' -config='{\"CheckOptions\":{\"PerlCheckMultiplicity\":1}}' 'perl6/[a-z_]+\\.c'\nEnabled checks:\n    perl-literal-get_cvn_flags\n    perl-literal-hv_fetch\n    perl-literal-newSVpvn\n    perl-literal-newSVpvn_flags\n    perl-literal-savepvn\n    perl-literal-sv_catpvn\n    perl-literal-sv_catpvn_flags\n    perl-literal-sv_catpvn_nomg\n    perl-literal-sv_setpvn\n    perl-literal-sv_setpvn_mg\n    perl-mortal-newSVpvn\n    perl-mortal-newSVsv\n    perl-undef-sv_setpv\n    perl-undef-sv_setpvn\n    perl-undef-sv_setsv\n\n...\nmro_core.c:1195:39: warning: sv_2mortal(newSVsv(...)) better written as sv_mortalcopy() [perl-mortal-newSVsv]\n 1195 |                             subname = sv_2mortal(newSVsv(namesv));\n      |                                       ^\n./embed.h:686:49: note: expanded from macro 'sv_2mortal'\n  686 | # define sv_2mortal(a)                          Perl_sv_2mortal(aTHX_ a)\n      |                                                 ^\nmro_core.c:1278:39: warning: sv_2mortal(newSVsv(...)) better written as sv_mortalcopy() [perl-mortal-newSVsv]\n 1278 |                             subname = sv_2mortal(newSVsv(namesv));\n      |                                       ^\n./embed.h:686:49: note: expanded from macro 'sv_2mortal'\n  686 | # define sv_2mortal(a)                          Perl_sv_2mortal(aTHX_ a)\n      |                                                 ^\n4 warnings generated.\nSuppressed 2 warnings (2 with check filters).\n...\nclang-tidy-18 -checks=-*,perl-* -p=/home/tony/dev/perl/git/perl6 -config={\"CheckOptions\":{\"PerlCheckMultiplicity\":1}} -load=/home/tony/dev/llvm/git/perl-check/build/libperl-check.so /home/tony/dev/perl/git/perl6/hv.c\nhv.c:701:29: warning: sv_2mortal(newSVsv(...)) better written as sv_mortalcopy() [perl-mortal-newSVsv]\n  701 |                     keysv = sv_2mortal(newSVsv(keysv));\n      |                             ^\n./embed.h:686:49: note: expanded from macro 'sv_2mortal'\n  686 | # define sv_2mortal(a)                          Perl_sv_2mortal(aTHX_ a)\n      |                                                 ^\n3 warnings generated.\nSuppressed 2 warnings (2 with check filters).\nclang-tidy-18 -checks=-*,perl-* -p=/home/tony/dev/perl/git/perl6 -config={\"CheckOptions\":{\"PerlCheckMultiplicity\":1}} -load=/home/tony/dev/llvm/git/perl-check/build/libperl-check.so /home/tony/dev/perl/git/perl6/gv.c\ngv.c:2200:29: warning: sv_setsv(..., \u0026PL_sv_undef) better written as sv_set_undef() [perl-undef-sv_setsv]\n 2200 |                             sv_setsv(*init, \u0026PL_sv_undef);\n      |                             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n      |                             sv_set_undef(*init)\n./embed.h:804:49: note: expanded from macro 'sv_setsv'\n  804 | # define sv_setsv(a,b)                          Perl_sv_setsv(aTHX,a,b)\n      |                                                 ^\n./sv.h:2274:9: note: expanded from macro 'Perl_sv_setsv'\n 2274 |         Perl_sv_setsv_flags(aTHX_ dsv, ssv, SV_GMAGIC|SV_DO_COW_SVSETSV)\n      |         ^\n3 warnings generated.\nSuppressed 2 warnings (2 with check filters).\n...\nclang-tidy-18 -checks=-*,perl-* -p=/home/tony/dev/perl/git/perl6 -config={\"CheckOptions\":{\"PerlCheckMultiplicity\":1}} -load=/home/tony/dev/llvm/git/perl-check/build/libperl-check.so /home/tony/dev/perl/git/perl6/dump.c\ndump.c:3109:15: warning: newSVpvn_flags() with literal better written as newSVpvs_flags() [perl-literal-newSVpvn_flags]\n 3109 |     SV *out = newSVpvn_flags(\"\",0,SVs_TEMP);\n      |               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n      |               newSVpvs_flags(\"\", SVs_TEMP)\n./embed.h:468:49: note: expanded from macro 'newSVpvn_flags'\n  468 | # define newSVpvn_flags(a,b,c)                  Perl_newSVpvn_flags(aTHX_ a,b,c)\n      |                                                 ^\ndump.c:3252:15: warning: newSVpvn_flags() with literal better written as newSVpvs_flags() [perl-literal-newSVpvn_flags]\n 3252 |     SV *out = newSVpvn_flags(\"\", 0, SVs_TEMP);\n      |               ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n      |               newSVpvs_flags(\"\", SVs_TEMP)\n./embed.h:468:49: note: expanded from macro 'newSVpvn_flags'\n  468 | # define newSVpvn_flags(a,b,c)                  Perl_newSVpvn_flags(aTHX_ a,b,c)\n      |                                                 ^\n4 warnings generated.\nSuppressed 2 warnings (2 with check filters).\nclang-tidy-18 -checks=-*,perl-* -p=/home/tony/dev/perl/git/perl6 -config={\"CheckOptions\":{\"PerlCheckMultiplicity\":1}} -load=/home/tony/dev/llvm/git/perl-check/build/libperl-check.so /home/tony/dev/perl/git/perl6/pp.c\npp.c:3405:26: warning: sv_2mortal(newSVsv(...)) better written as sv_mortalcopy() [perl-mortal-newSVsv]\n 3405 |          SV* const tsv = sv_2mortal(newSVsv(sv));\n      |                          ^\n./embed.h:686:49: note: expanded from macro 'sv_2mortal'\n  686 | # define sv_2mortal(a)                          Perl_sv_2mortal(aTHX_ a)\n      |                                                 ^\n3 warnings generated.\nSuppressed 2 warnings (2 with check filters).\n...\nclang-tidy-18 -checks=-*,perl-* -p=/home/tony/dev/perl/git/perl6 -config={\"CheckOptions\":{\"PerlCheckMultiplicity\":1}} -load=/home/tony/dev/llvm/git/perl-check/build/libperl-check.so /home/tony/dev/perl/git/perl6/toke.c\ntoke.c:1891:25: warning: sv_2mortal(newSVsv(...)) better written as sv_mortalcopy() [perl-mortal-newSVsv]\n 1891 |             SV *name2 = sv_2mortal(newSVsv(PL_curstname));\n      |                         ^\n./embed.h:686:49: note: expanded from macro 'sv_2mortal'\n  686 | # define sv_2mortal(a)                          Perl_sv_2mortal(aTHX_ a)\n      |                                                 ^\n3 warnings generated.\nSuppressed 2 warnings (2 with check filters).\n...\nclang-tidy-18 -checks=-*,perl-* -p=/home/tony/dev/perl/git/perl6 -config={\"CheckOptions\":{\"PerlCheckMultiplicity\":1}} -load=/home/tony/dev/llvm/git/perl-check/build/libperl-check.so /home/tony/dev/perl/git/perl6/pp_hot.c\npp_hot.c:5498:24: warning: sv_2mortal(newSVsv(...)) better written as sv_mortalcopy() [perl-mortal-newSVsv]\n 5498 |                 TARG = sv_2mortal(newSVsv(TARG));\n      |                        ^\n./embed.h:686:49: note: expanded from macro 'sv_2mortal'\n  686 | # define sv_2mortal(a)                          Perl_sv_2mortal(aTHX_ a)\n      |                                                 ^\n3 warnings generated.\nSuppressed 2 warnings (2 with check filters).\nclang-tidy-18 -checks=-*,perl-* -p=/home/tony/dev/perl/git/perl6 -config={\"CheckOptions\":{\"PerlCheckMultiplicity\":1}} -load=/home/tony/dev/llvm/git/perl-check/build/libperl-check.so /home/tony/dev/perl/git/perl6/mg.c\nmg.c:1135:17: warning: sv_setpvn() with literal better written as sv_setpvs() [perl-literal-sv_setpvn]\n 1135 |                 sv_setpvn(sv, WARN_NONEstring, WARNsize) ;\n      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n      |                 sv_setpvs(sv, WARN_NONEstring)\n./embed.h:792:49: note: expanded from macro 'sv_setpvn'\n  792 | # define sv_setpvn(a,b,c)                       Perl_sv_setpvn(aTHX_ a,b,c)\n      |                                                 ^\nmg.c:1141:17: warning: sv_setpvn() with literal better written as sv_setpvs() [perl-literal-sv_setpvn]\n 1141 |                 sv_setpvn(sv, WARN_ALLstring, WARNsize);\n      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n      |                 sv_setpvs(sv, WARN_ALLstring)\n./embed.h:792:49: note: expanded from macro 'sv_setpvn'\n  792 | # define sv_setpvn(a,b,c)                       Perl_sv_setpvn(aTHX_ a,b,c)\n      |                                                 ^\n4 warnings generated.\nSuppressed 2 warnings (2 with check filters).\nclang-tidy-18 -checks=-*,perl-* -p=/home/tony/dev/perl/git/perl6 -config={\"CheckOptions\":{\"PerlCheckMultiplicity\":1}} -load=/home/tony/dev/llvm/git/perl-check/build/libperl-check.so /home/tony/dev/perl/git/perl6/op.c\nop.c:4065:26: warning: sv_2mortal(newSVsv(...)) better written as sv_mortalcopy() [perl-mortal-newSVsv]\n 4065 |                 svname = sv_2mortal(newSVsv(PL_curstname));\n      |                          ^\n./embed.h:686:49: note: expanded from macro 'sv_2mortal'\n  686 | # define sv_2mortal(a)                          Perl_sv_2mortal(aTHX_ a)\n      |                                                 ^\n3 warnings generated.\nSuppressed 2 warnings (2 with check filters).\n...\nclang-tidy-18 -checks=-*,perl-* -p=/home/tony/dev/perl/git/perl6 -config={\"CheckOptions\":{\"PerlCheckMultiplicity\":1}} -load=/home/tony/dev/llvm/git/perl-check/build/libperl-check.so /home/tony/dev/perl/git/perl6/universalmini.c\nuniversalmini.c:1107:23: warning: sv_2mortal(newSVsv(...)) better written as sv_mortalcopy() [perl-mortal-newSVsv]\n 1107 |             pattern = sv_2mortal(newSVsv(MUTABLE_SV(re)));\n      |                       ^\n./embed.h:686:49: note: expanded from macro 'sv_2mortal'\n  686 | # define sv_2mortal(a)                          Perl_sv_2mortal(aTHX_ a)\n      |                                                 ^\n3 warnings generated.\nSuppressed 2 warnings (2 with check filters).\nclang-tidy-18 -checks=-*,perl-* -p=/home/tony/dev/perl/git/perl6 -config={\"CheckOptions\":{\"PerlCheckMultiplicity\":1}} -load=/home/tony/dev/llvm/git/perl-check/build/libperl-check.so /home/tony/dev/perl/git/perl6/universal.c\nuniversal.c:1107:23: warning: sv_2mortal(newSVsv(...)) better written as sv_mortalcopy() [perl-mortal-newSVsv]\n 1107 |             pattern = sv_2mortal(newSVsv(MUTABLE_SV(re)));\n      |                       ^\n./embed.h:686:49: note: expanded from macro 'sv_2mortal'\n  686 | # define sv_2mortal(a)                          Perl_sv_2mortal(aTHX_ a)\n      |                                                 ^\n3 warnings generated.\nSuppressed 2 warnings (2 with check filters).\n...\nclang-tidy-18 -checks=-*,perl-* -p=/home/tony/dev/perl/git/perl6 -config={\"CheckOptions\":{\"PerlCheckMultiplicity\":1}} -load=/home/tony/dev/llvm/git/perl-check/build/libperl-check.so /home/tony/dev/perl/git/perl6/pp_ctl.c\npp_ctl.c:1444:22: warning: sv_2mortal(newSVsv(...)) better written as sv_mortalcopy() [perl-mortal-newSVsv]\n 1444 |                 sv = sv_2mortal(newSVsv(sv));\n      |                      ^\n./embed.h:686:49: note: expanded from macro 'sv_2mortal'\n  686 | # define sv_2mortal(a)                          Perl_sv_2mortal(aTHX_ a)\n      |                                                 ^\npp_ctl.c:2242:23: warning: sv_2mortal(newSVsv(...)) better written as sv_mortalcopy() [perl-mortal-newSVsv]\n 2242 |                 PUSHs(sv_2mortal(newSVsv(cur_text)));\n      |                       ^\n./embed.h:686:49: note: expanded from macro 'sv_2mortal'\n  686 | # define sv_2mortal(a)                          Perl_sv_2mortal(aTHX_ a)\n      |                                                 ^\npp_ctl.c:2249:13: warning: sv_2mortal(newSVsv(...)) better written as sv_mortalcopy() [perl-mortal-newSVsv]\n 2249 |             mPUSHs(newSVsv(cx-\u003eblk_eval.old_namesv));\n      |             ^\n./pp.h:567:25: note: expanded from macro 'mPUSHs'\n  567 | #define mPUSHs(s)       PUSHs(sv_2mortal(s))\n      |                               ^\n./embed.h:686:49: note: expanded from macro 'sv_2mortal'\n  686 | # define sv_2mortal(a)                          Perl_sv_2mortal(aTHX_ a)\n      |                                                 ^\npp_ctl.c:2269:20: warning: newSVpvn() with literal better written as newSVpvs() [perl-literal-newSVpvn]\n 2269 |             mask = newSVpvn(WARN_NONEstring, WARNsize) ;\n      |                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n      |                    newSVpvs(WARN_NONEstring)\n./embed.h:467:49: note: expanded from macro 'newSVpvn'\n  467 | # define newSVpvn(a,b)                          Perl_newSVpvn(aTHX_ a,b)\n      |                                                 ^\npp_ctl.c:2274:20: warning: newSVpvn() with literal better written as newSVpvs() [perl-literal-newSVpvn]\n 2274 |             mask = newSVpvn(WARN_ALLstring, WARNsize) ;\n      |                    ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n      |                    newSVpvs(WARN_ALLstring)\n./embed.h:467:49: note: expanded from macro 'newSVpvn'\n  467 | # define newSVpvn(a,b)                          Perl_newSVpvn(aTHX_ a,b)\n      |                                                 ^\n7 warnings generated.\nSuppressed 2 warnings (2 with check filters).\n...\nclang-tidy-18 -checks=-*,perl-* -p=/home/tony/dev/perl/git/perl6 -config={\"CheckOptions\":{\"PerlCheckMultiplicity\":1}} -load=/home/tony/dev/llvm/git/perl-check/build/libperl-check.so /home/tony/dev/perl/git/perl6/sv.c\nsv.c:6693:23: warning: newSVpvn_flags() with literal better written as newSVpvs_flags() [perl-literal-newSVpvn_flags]\n 6693 |                     : newSVpvn_flags( \"__ANON__\", 8, 0 );\n      |                       ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n      |                       newSVpvs_flags(\"__ANON__\", 0)\n./embed.h:468:49: note: expanded from macro 'newSVpvn_flags'\n  468 | # define newSVpvn_flags(a,b,c)                  Perl_newSVpvn_flags(aTHX_ a,b,c)\n      |                                                 ^\nsv.c:17586:18: warning: newSVpvn_flags() with literal better written as newSVpvs_flags() [perl-literal-newSVpvn_flags]\n 17586 |             sv = newSVpvn_flags(\"\", 0, SVs_TEMP);\n       |                  ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n       |                  newSVpvs_flags(\"\", SVs_TEMP)\n./embed.h:468:49: note: expanded from macro 'newSVpvn_flags'\n  468 | # define newSVpvn_flags(a,b,c)                  Perl_newSVpvn_flags(aTHX_ a,b,c)\n      |                                                 ^\n4 warnings generated.\nSuppressed 2 warnings (2 with check filters).\nclang-tidy-18 -checks=-*,perl-* -p=/home/tony/dev/perl/git/perl6 -config={\"CheckOptions\":{\"PerlCheckMultiplicity\":1}} -load=/home/tony/dev/llvm/git/perl-check/build/libperl-check.so /home/tony/dev/perl/git/perl6/builtin.c\nbuiltin.c:560:9: warning: sv_setsv(..., \u0026PL_sv_undef) better written as sv_set_undef() [perl-undef-sv_setsv]\n  560 |         sv_setsv(TARG, \u0026PL_sv_undef);\n      |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~\n      |         sv_set_undef(TARG)\n./embed.h:804:49: note: expanded from macro 'sv_setsv'\n  804 | # define sv_setsv(a,b)                          Perl_sv_setsv(aTHX,a,b)\n      |                                                 ^\n./sv.h:2274:9: note: expanded from macro 'Perl_sv_setsv'\n 2274 |         Perl_sv_setsv_flags(aTHX_ dsv, ssv, SV_GMAGIC|SV_DO_COW_SVSETSV)\n      |         ^\nbuiltin.c:576:9: warning: sv_setsv(..., \u0026PL_sv_undef) better written as sv_set_undef() [perl-undef-sv_setsv]\n  576 |         sv_setsv(TARG, \u0026PL_sv_undef);\n      |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~\n      |         sv_set_undef(TARG)\n./embed.h:804:49: note: expanded from macro 'sv_setsv'\n  804 | # define sv_setsv(a,b)                          Perl_sv_setsv(aTHX,a,b)\n      |                                                 ^\n./sv.h:2274:9: note: expanded from macro 'Perl_sv_setsv'\n 2274 |         Perl_sv_setsv_flags(aTHX_ dsv, ssv, SV_GMAGIC|SV_DO_COW_SVSETSV)\n      |         ^\n4 warnings generated.\nSuppressed 2 warnings (2 with check filters).\n...\nclang-tidy-18 -checks=-*,perl-* -p=/home/tony/dev/perl/git/perl6 -config={\"CheckOptions\":{\"PerlCheckMultiplicity\":1}} -load=/home/tony/dev/llvm/git/perl-check/build/libperl-check.so /home/tony/dev/perl/git/perl6/opmini.c\nopmini.c:4065:26: warning: sv_2mortal(newSVsv(...)) better written as sv_mortalcopy() [perl-mortal-newSVsv]\n 4065 |                 svname = sv_2mortal(newSVsv(PL_curstname));\n      |                          ^\n./embed.h:686:49: note: expanded from macro 'sv_2mortal'\n  686 | # define sv_2mortal(a)                          Perl_sv_2mortal(aTHX_ a)\n      |                                                 ^\n3 warnings generated.\nSuppressed 2 warnings (2 with check filters).\nclang-tidy-18 -checks=-*,perl-* -p=/home/tony/dev/perl/git/perl6 -config={\"CheckOptions\":{\"PerlCheckMultiplicity\":1}} -load=/home/tony/dev/llvm/git/perl-check/build/libperl-check.so /home/tony/dev/perl/git/perl6/regcomp.c\nregcomp.c:809:27: warning: sv_2mortal(newSVsv(...)) better written as sv_mortalcopy() [perl-mortal-newSVsv]\n  809 |                     pat = sv_2mortal(newSVsv(msv));\n      |                           ^\n./embed.h:686:49: note: expanded from macro 'sv_2mortal'\n  686 | # define sv_2mortal(a)                          Perl_sv_2mortal(aTHX_ a)\n      |                                                 ^\nregcomp.c:10711:33: warning: newSVpvn_flags() with literal better written as newSVpvs_flags() [perl-literal-newSVpvn_flags]\n 10711 |         SV * substitute_parse = newSVpvn_flags(\"?:\", 2, SVs_TEMP);\n       |                                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n       |                                 newSVpvs_flags(\"?:\", SVs_TEMP)\n./embed.h:468:49: note: expanded from macro 'newSVpvn_flags'\n  468 | # define newSVpvn_flags(a,b,c)                  Perl_newSVpvn_flags(aTHX_ a,b,c)\n      |                                                 ^\nregcomp.c:16069:19: warning: sv_2mortal(newSVsv(...)) better written as sv_mortalcopy() [perl-mortal-newSVsv]\n 16069 |         must_sv = sv_2mortal(newSVsv(must_sv));\n       |                   ^\n./embed.h:686:49: note: expanded from macro 'sv_2mortal'\n  686 | # define sv_2mortal(a)                          Perl_sv_2mortal(aTHX_ a)\n      |                                                 ^\n5 warnings generated.\nSuppressed 2 warnings (2 with check filters).\n```\n\n# Checks\n\n* `perl-literal-sv_setpvn`\n* `perl-literal-sv_setpvn_mg`\n* `perl-literal-hv_fetch`\n* `perl-literal-newSVpvn`\n* `perl-literal-newSVpvn_flags`\n* `perl-literal-sv_catpvn`\n* `perl-literal-sv_catpvn_flags`\n* `perl-literal-sv_catpvn_nomg`\n* `perl-literal-savepvn`\n* `perl-literal-get_cvn_flags`\n\nIf any of the corresponding API macros is called with a string literal\nand the length of that literal, suggest the corresponding API that\ncalculates the length automatically.\n\n* `perl-undef-sv_setsv`\n\nComplain about using `sv_setsv(sv, \u0026PL_sv_undef)` since\n`sv_set_undef(sv)` is likely faster.\n\n* `perl-undef-setpv`\n* `perl-undef-setpvn`\n\nComplain about `sv_setpv(sv, NULL)` or `sv_setpvn(sv, NULL, 0)` to set\n`sv` to `undef`, and suggest/FIXIT `sv_set_undef(sv)`.\n\n* `perl-mortal-newSVpvn`\n\nCheck for calls to the given function wrapped by `sv_2mortal()`, when\nthe wrapped function has a flag to mortalize the result.\n\n* `perl-mortal-newSVsv`\n\nCheck for calls to the given function wrapped by `sv_2mortal()`, when\n`sv_mortalcopy()` does the same *and* mortalizes.\n\nThe `newSVsv()` check does not produce a fix it (I tried, but it\nwouldn't replace, I suspect the macros confused clang-tidy.)\n\n# FixIts\n\nMost checks provide fixits, and clang-tidy can apply the fixes.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftonycoz%2Fperl-check","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftonycoz%2Fperl-check","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftonycoz%2Fperl-check/lists"}