What's new in PVS-Studio in 2025?
The new year 2026 is already here, so it's high time to look back on the exciting work the PVS-Studio team did in 2025. Settle in comfortably—our evening of reminiscence begins.
Overall changes
Plugins for IDEs
Visual Studio 2026
Last year, Microsoft released a new version of its integrated development environment—Visual Studio 2026. Just as with previous IDE versions, PVS-Studio plugin is now available for this new release, enabling analysis of C, C++, and C# projects based on the MSBuild system.
You can read more about using PVS-Studio in Visual Studio in our documentation.
Qt Creator
Over the past year, PVS-Studio plugin for Qt Creator gained support for four recent versions of the IDE. The plugin now works with Qt Creator 15, 16, 17, and 18.
However, we no longer support some older versions. We strive to maintain backward compatibility by supporting the latest plugin versions for all Qt Creator releases for two years after each one appears. So in 2025, we ended support for Qt Creator 9, 10, 11, and 12.
You can read more about PVS-Studio plugin for Qt Creator in our documentation.
Compilation monitoring in the Visual Studio Code plugin
Since 2025, PVS-Studio plugin for the Visual Studio Code can analyze projects using compilation monitoring.
In this mode, the plugin tracks processes corresponding to the target compiler and collects information about their environment. Once the plugin gathers all data, it can run project analysis.
Currently, this feature is only available on Windows, but we plan to add it for Linux as well.
Build systems
Last year, we enhanced PVS-Studio interaction with various build systems.
It's now possible to use Kotlin DSL syntax when writing build scripts for the Gradle build system that uses PVS-Studio plugin. We added the corresponding instruction in the documentation.
For the MSBuild system, the analyzer can now analyze projects based on solution files in the .slnf and .slnx formats. We have previously written in our blog about the differences between .slnf and .slnx.
Custom code annotations in JSON
In 2024, we added support for custom code annotations in JSON format for the C and C++ analyzer. These annotations provide the analyzer with additional context about using of various entities, improving analysis quality.
In 2025, this feature was extended to PVS-Studio Java and C# analyzers.
Documentation enhancements
We also continue working on the product documentation to ensure our users have no problems using PVS-Studio.
In 2025, the documentation on using the analyzer for Unreal Engine projects was expanded with a section on analysis using the Unreal Build Accelerator distributed build system.
In addition to updating the documentation with new features, we keep an eye on the older sections. Last year we completely revamped the documentation for using PVS-Studio plugin for the Visual Studio Code IDE.
C and C++
Now let's check out the changes in PVS-Studio C and C++ analyzer.
The year 2025 was marked by enhanced technologies used in the C and C++ analyzer: we laid the groundwork for supporting new language standards and for advancing data flow and taint analysis.
Oleg Lisiy,
C++ Team Lead
New C and C++ code parser
In 2025, we finally released a new parser for C and C++ code, which our team had been developing for over a year. This is a major update. Although it may go unnoticed by most users, it serves as the foundation for future analyzer improvements.
During the extended testing period (EAP) in the spring, we achieved stable operation of the new parser on a large number of real projects. However, to ensure backward compatibility, we kept the option to switch back to the previous version.
If you encounter any issues while using the new parser, please don't hesitate to contact our support team. This will help us speed up final tweaks of this new tool.
Thanks to feedback from users, we have already made numerous refinements. As an example, we fixed critical crashes when analyzing Unreal Engine projects and enhanced the new parser's handling of templates.
Improvements in analyzing language constructs and the standard library
Besides the improvements related to the new parser, there were others.
For instance, in C and C++ analyzer, we extended the taint analysis mechanism to diagnostic rules for finding other types of errors: division by zero, bitwise shift by an untrusted value, buffer overrun, signed integer overflow, and passing an untrusted value as an argument.
Other changes in the taint analysis mechanism include correct tracking of taint status with the % operator and enhanced handling of taint statuses in branches.
All these changes to the taint analysis mechanism ultimately increased the number of cases where the analyzer can detect potential vulnerabilities. You can read more about how taint analysis works in PVS-Studio in this article.
We also refined support for various language standards:
- C11:
restrict and _Atomic qualifiers, _Atomic(T) and _Thread_local specifiers;
- C23:
thread_local specifier, constexpr and alignas keywords.
Besides, we actively work with user feedback and fix flaws in the analyzer operation. Based on user reports, we fixed the internal annotations for the std::min, std::max, std::unique_ptr<T[]>::reset, and std::unique_ptr<T[]>::release functions.
MISRA standard support enhancements
Last year, we started covering the MISRA C 2023 standard with diagnostic rules in C and C++ analyzer.
You can read more about the classification of PVS-Studio warnings according to MISRA standards on this page. This page now also features a breakdown by standard version and displays the degree of the standard coverage by the analyzer diagnostic rules.
In 2025, we added support for generating the MISRA Compliance report, considering the newly supported standard versions. You can read more about this in our documentation.
By the February release of PVS-Studio 7.41, the MISRA C 2023 standard will be 80-85% covered.
New functionality in the analysis configuration files
Last year also brought changes to the .pvsconfig analysis configuration files.
We added a new flag, ‑‑apply-pvs-configs, to the pvs-studio-analyzer utility for cross-platform C/C++ project checking. This flag enables a mode for automatically searching and applying .pvsconfig analysis configuration files for the checked source files. You can search the configuration files in the directory of the source file and in all parent directories up to the project root folder, which is specified using the new ‑‑project-root.
We also added the mode for overriding higher-priority settings using the //V_OVERRIDE ON option. This option supports complex scenarios where certain project parts require different values for settings specified in .pvsconfig files with higher priority.
You can read more about .pvsconfig analysis configuration files in our documentation.
New diagnostic rules
General Analysis
- V1118. Excessive file permissions can lead to vulnerabilities. Consider restricting file permissions.
MISRA standard
- V2626. MISRA. The 'sizeof' operator should not have an operand which is a function parameter declared as 'array of type'.
- V2627. MISRA. Function type should not be type qualified.
- V2628. MISRA. The pointer arguments to the Standard Library functions memcpy, memmove and memcmp should be pointers to qualified or unqualified versions of compatible types.
- V2629. MISRA. Pointer arguments to the 'memcmp' function should point to an appropriate type.
- V2630. MISRA. Bit field should not be declared as a member of a union.
- V2631. MISRA. Pointers to variably-modified array types should not be used.
- V2632. MISRA. Object with temporary lifetime should not undergo array-to-pointer conversion.
- V2633. MISRA. Identifiers should be distinct from macro names.
- V2634. MISRA. Features from <fenv.h> should not be used.
- V2635. MISRA. The function with the 'system' name should not be used.
- V2636. MISRA. The functions with the 'rand' and 'srand' name of <stdlib.h> should not be used.
- V2637. MISRA. A 'noreturn' function should have 'void' return type.
- V2638. MISRA. Generic association should list an appropriate type.
- V2639. MISRA. Default association should appear as either the first or the last association of a generic selection.
- V2640. MISRA. Thread objects, thread synchronization objects and thread-specific storage pointers should have appropriate storage duration.
- V2641. MISRA. Types should be explicitly specified.
- V2642. MISRA. The '_Atomic' specifier should not be applied to the incomplete type 'void'.
- V2643. MISRA. All memory synchronization operation should be executed in sequentially consistent order.
- V2644. MISRA. Controlling expression of generic selection must not have side effects.
- V2645. MISRA. The language features specified in Annex K should not be used.
- V2646. MISRA. All arguments of any multi-argument type-generic macros from <tgmath.h> should have the same type.
- V2647. MISRA. Structure and union members of atomic objects should not be directly accessed.
- V2648. MISRA. Null pointer constant must be derived by expansion of the NULL macro provided by the implementation.
- V2649. MISRA. All arguments of any type-generic macros from <tgmath.h> should have an appropriate essential type.
- V2650. MISRA. Controlling expression of generic selection must have essential type that matches its standard type
- V2651. MISRA. Initializer using chained designators should not contain initializers without designators.
- V2652. MISRA. Argument of an integer constant macro should have an appropriate form.
- V2653. MISRA. The small integer variants of the minimum-width integer constant macros should not be used.
- V2654. MISRA. Initializer list should not contain persistent side effects.
- V2655. MISRA. The right operand of a logical '&&' or '||' operator should not contain persistent side effects.
- V2656. MISRA. The Standard Library function memcmp should not be used to compare null terminated strings.
- V2657. MISRA. Obsolescent language features should not be used.
- V2658. MISRA. Dead code should not be used in a project.
- V2659. MISRA. Switch statements should be well-formed.
- V2660. MISRA. A function declared with a _Noreturn specifier should not return to its caller.
- V2661. MISRA. A 'for' loop should be well-formed.
- V2662. MISRA. Any value passed to a function from <ctype.h> should be representable as an unsigned character or be the value EOF.
- V2663. MISRA. The macro EOF should only be compared with the unmodified return value of any Standard Library function capable of returning EOF.
- V2664. MISRA. Use of the string handling functions from <string.h> should not result in accesses beyond the bounds of the objects referenced by their pointer parameters.
- V2665. MISRA. The size argument passed to function from <string.h> should have an appropriate value.
- V2666. MISRA. All declarations of an object with an explicit alignment specification should specify the same alignment.
Custom diagnostic rules
- V2023. Absence of the 'override' specifier when overriding a virtual function may cause a mismatch of signatures.
Released articles
In 2025, we wrote 37 articles on C and C++. Here are some of them:
C#
Now let's move on to the changes in PVS-Studio C# analyzer!
In 2025, we focused on creating diagnostic rules for working with Unity-based projects. At the moment, C# analyzer includes over 20 specialized diagnostic rules for detecting optimization issues and general analysis errors.
This year, we also enhanced some of the earliest diagnostic rules in the C# analyzer. And, of course, we added support for .NET 10 and C# 11.
Artem Rovenskii,
C# Team Lead
.NET 10 support
In the last release of the past year, we traditionally added support for analyzing projects on the fresh .NET 10.
In 2024, while supporting projects on .NET 9, we changed the analyzer system requirements on all platforms—after version 7.34, it became necessary to have .NET 9 SDK in the system.
In 2025, the change in system requirements only affected Linux and macOS: starting from PVS-Studio version 7.40, the .NET 10 SDK will be required to perform analysis of C# projects.
Analysis enhancements
Last year, we also worked on improving analysis quality for C# projects.
For example, we revamped the very first diagnostic rules of C# analyzer. These rules now support new language constructs. Also, we enhanced PVS-Studio mechanisms for detecting code issues.
Thus, we reworked the V3001 diagnostic rule. Now it defines more correctly the cases when additional parentheses affect nothing. One bug found by the updated diagnostic rule is described in detail in this article.
We optimized the analysis of code blocks containing a large number of variable identifiers (500 or more). Previously, slowdowns were possible in such cases.
Also, the C# analyzer now considers tainted data when detecting an overflow, when the array index is out of bounds, and when potential division by 0 may occur.
New diagnostic rules
General analysis
- V3211. Unity Engine. The operators '?.', '??' and '??=' do not correctly handle destroyed objects derived from 'UnityEngine.Object'.
- V3212. Unity Engine. Pattern matching does not correctly handle destroyed objects derived from 'UnityEngine.Object'.
- V3213. Unity Engine. The 'GetComponent' method must be instantiated with a type that inherits from 'UnityEngine.Component'.
- V3214. Unity Engine. Using Unity API in the background thread may result in an error.
- V3215. Unity Engine. Passing a method name as a string literal into the 'StartCoroutine' is unreliable.
- V3216. Unity Engine. Checking a field with a specific Unity Engine type for null may not work correctly due to implicit field initialization by the engine.
- V3217. Possible overflow as a result of an arithmetic operation.
- V3218. Cycle condition may be incorrect due to an off-by-one error.
- V3219. The variable was changed after it was captured in a LINQ method with deferred execution. The original value will not be used when the method is executed.
- V3220. The result of the LINQ method with deferred execution is never used. The method will not be executed.
- V3221. Modifying a collection during its enumeration will lead to an exception.
- V3222. Potential resource leak. An inner IDisposable object might remain non-disposed if the constructor of the outer object throws an exception.
- V3223. Inconsistent use of a potentially shared variable with and without a lock can lead to a data race.
- V3224. Consider using an overload with 'IEqualityComparer', as it is present in similar cases for the same collection element type.
- V3225. A data reading method returns the number of bytes that were read and cannot return the value of -1.
- V3226. Potential resource leak. The disposing method will not be called if an exception occurs in the 'try' block. Consider calling it in the 'finally' block.
- V3227. The precedence of the arithmetic operator is higher than that of the shift operator. Consider using parentheses in the expression.
- V3228. It is possible that an assigned variable should be used in the next condition. Consider checking for misprints.
- V3229. The 'GetHashCode' method may return different hash codes for equal objects. It uses an object reference to generate a hash for a variable. Check the implementation of the 'Equals' method.
Micro-optimizations
- V4008. Unity Engine. Avoid using memory allocation Physics APIs in performance-sensitive context.
OWASP
- V5629. OWASP. Code contains invisible characters that may alter its logic. Consider enabling the display of invisible characters in the code editor.
- V5630. Possible cookie injection. Potentially tainted data is used to create a cookie.
- V5631. OWASP. Use of externally-controlled format string. Potentially tainted data is used as a format string.
Released articles
Over the year, the C# team posted over 20 articles. Here are some of the most interesting ones:
Java
And finally, it's the turn of Java analyzer!
Java analyzer now features a taint mechanism, enabling the creation of various diagnostic rules focused on security. We currently cover 9 out of 10 OWASP categories, and by the next February release, Java analyzer will have 40 security diagnostic rules.
Konstantin Volohovsky,
Java Team Lead
OWASP Top 10 2021
In 2024, Java analyzer gained a taint analysis mechanism. The first diagnostic rule, V5309, aimed at finding potential SQL injections, was also released at that time.
In 2025, it was high time to use this mechanism to its full potential!
We undertook significant work to cover OWASP Top 10 2021 security defect categories with Java analyzer. This involved releasing many new diagnostic rules designed to find potential vulnerabilities. Currently, Java analyzer diagnostic rules cover 9 out of 10 categories.
You can learn more about the classification of PVS-Studio diagnostic rules according to OWASP Top 10 on this page.
New diagnostic rules
General analysis
- V6126. Native synchronization used on high-level concurrency class.
- V6127. Closeable object is not closed. This may lead to a resource leak.
- V6128. Using a Closable object after it was closed can lead to an exception.
- V6129. Possible deadlock due to incorrect synchronization order between locks.
- V6130. Integer overflow in arithmetic expression.
- V6131. Casting to a type with a smaller range will result in an overflow.
- V6132. It is possible that 'else' block was forgotten or commented out, thus altering the program's operation logics.
OWASP
- V5310. OWASP. Possible command injection. Potentially tainted data is used to create OS command.
- V5311. OWASP. Possible argument injection. Potentially tainted data is used to create OS command.
- V5312. OWASP. Possible XPath injection. Potentially tainted data is used to create XPath expression.
- V5313. OWASP. Do not use the old versions of SSL/TLS protocols as it may cause security issues.
- V5314. OWASP. Use of an outdated hash algorithm is not recommended.
- V5315. OWASP. Use of an outdated cryptographic algorithm is not recommended.
- V5316. OWASP. Do not use the 'HttpServletRequest.getRequestedSessionId' method because it uses a session ID provided by a client.
- V5317. OWASP. Implementing a cryptographic algorithm is not advised because an attacker might break it.
- V5318. OWASP. Setting POSIX file permissions to 'all' or 'others' groups can lead to unintended access to files or directories.
- V5319. OWASP. Possible log injection. Potentially tainted data is written into logs.
- V5320. OWASP. Use of potentially tainted data in configuration may lead to security issues.
- V5321. OWASP. Possible LDAP injection. Potentially tainted data is used in a search filter.
- V5322. OWASP. Possible reflection injection. Potentially tainted data is used to select class or method.
- V5323. OWASP. Potentially tainted data is used to define 'Access-Control-Allow-Origin' header.
- V5324. OWASP. Possible open redirect vulnerability. Potentially tainted data is used in the URL.
- V5325. OWASP. Setting the value of the 'Access-Control-Allow-Origin' header to '*' is potentially insecure.
- V5326. OWASP. OWASP. A password for a database connection should not be empty.
- V5327. OWASP. Possible regex injection. Potentially tainted data is used to create regular expression.
- V5328. OWASP. Using weak authorization checks could lead to security violations.
- V5329. OWASP. Using unsafe methods of file creation is not recommended because an attacker might access the files.
- V5330. OWASP. Possible XSS injection. Potentially tainted data might be used to execute a malicious script.
- V5331. OWASP. Hardcoded IP addresses are not secure.
- V5332. OWASP. Possible path traversal vulnerability. Potentially tainted data might be used to access files or folders outside a target directory.
- V5333. OWASP. Possible insecure deserialization vulnerability. Potentially tainted data is used to create an object during deserialization.
- V5334. OWASP. Possible server-side request forgery. Potentially tainted data is used in the URL.
- V5335. OWASP. Potential XXE vulnerability. Insecure XML parser is used to process potentially tainted data.
- V5336. OWASP. Potential XEE vulnerability. Insecure XML parser is used to process potentially tainted data.
- V5337. OWASP. Possible NoSQL injection. Potentially tainted data is used to create query.
- V5338. OWASP. Possible Zip Slip vulnerability. Potentially tainted data is used in the path to extract the file.
Released articles
In 2025, we posted 37 articles on Java topic on our blog. Here are some of them:
Conclusion
We covered all major features in the analyzer for 2025, yet this is only a part. You can find the full list of changes on our release history page.
If you are interested in timely updates about the analyzer, subscribe to our digests.
2026 promises even more interesting developments—stay tuned for the news!
0